概要
Amazon InspectorでRailsアプリケーションの脆弱性スキャンを実行した際、Rubyのデフォルトgemが原因で誤検知が発生するケースについて解説します。具体的には、CGI.escape_htmlの脆弱性(CVE-2021-41816)を例に、問題の特定から解決までのプロセスを説明します。
問題の発見
Amazon Inspectorにより、CGIライブラリにCriticalな脆弱性(CVE-2021-41816)が検知されました。この脆弱性は、Ruby 2.7.5以前および3.0.3以前の3.0.xバージョンに含まれるCGI.escape_htmlに存在する問題で、CGIバージョン0.3.1で修正されています。
初期の対応と課題
問題解決のため、まずGemfileで安全なバージョンを指定しました:
しかし、Dockerイメージを更新後も脆弱性の検知は継続していました。コンテナ内での確認では:
新しいバージョンがインストールされているにもかかわらず、脆弱性が検知され続ける状況が発生しました。
根本原因の特定
調査の結果、以下の点が判明しました:
1. Inspectorが検知しているファイルは /usr/local/lib/ruby/gems/3.0.0/specifications/default/cgi-0.2.2.gemspec
2. 異なるディレクトリに2つのバージョンのCGIファイルが存在する:
- 新規インストール: /usr/local/lib/ruby/gems/3.0.0/specifications/cgi-0.4.1.gemspec
- デフォルト: /usr/local/lib/ruby/gems/3.0.0/specifications/default/cgi-0.2.2.gemspec
←こちらが検知されてしまっているのが原因
解決策
Dockerfileに以下の設定を追加し、デフォルトのCGI関連ファイルを削除することで問題を解決しました:
恒久的な対応策の検討
今回の事例では、特定のgemファイルを削除することで問題を解決しましたが、より包括的な対策として、デフォルトgemを全て削除する方法を検討していきたいと思います。
デフォルトgem削除のメリット
- 脆弱性スキャナーの誤検知を防止できる
- 使用するgemのバージョンを完全にコントロールできる
- 不要なgemを含まないことでイメージサイズを削減できる
- セキュリティ管理がより明確になる