ライブラリ、ミドルウエアの脆弱性対策

これはコンテナアプリケーションに限った話ではありませんが、IPAが発表した情報セキュリティ10大脅威 2022によると、脆弱性対策情報の公開に伴う悪用が多く発生していることがわかります。

例えば、2021年12月9日にApache Software Foundation は ログ出力ライブラリ「Apache Log4j」の脆弱性CVE-2021-44228を公表しました。この脆弱性は「Log4Shell」とも呼ばれ、Log4j に存在する JNDI(Java Naming and Directory Interface) Lookup機能に含まれる問題により攻撃者がリモートから任意のコードを実行できる可能性があります。この脆弱性公表の翌日には実証コードが公開されこれを悪用した攻撃が多数確認されました。

また、この脆弱性はApache Log4jを利用している「Apache Struts2」や「Apache Solr」などJavaで実装されているOSSにも影響がありました。

アプリケーション開発者が自ら実装したコードのみならず、使用するライブラリ/フレームワークやミドルウェアにも脆弱性が含まれないようにバージョンや依存関係を把握して常に最新の状態に保っておくことが重要です。

ソースコードをGitHubで管理している場合は、Dependency GraphやDependabotを活用するとよいでしょう。GitHubのリポジトリの[Settings]-[Code security and analysis]から次のサービスを有効にします。

  • Dependency Graph: 依存関係を可視化
  • Dependabot Alerts: 脆弱性を検知しアラートを送信
  • Dependabot Security Updates: セキュリティアップデート

Dependency Graphは、リポジトリ内の依存関係を可視化できる機能です。GitHubのdependency graphをクリックすると、依存関係やCVEの情報などの詳細を確認できます。

Dependabotは、GitHubが提供するBotサービスです。リポジトリ内の依存関係をチェックし、もし脆弱性があればアラートの通知をしたり自動でPull Requestを発行したりする機能を提供します。例えば、JavaアプリケーションでMavenを利用している場合、pom.xmlでLog4shellの脆弱性を含む「log4j-core-2.14.0」を指定したとします。この状態でGitHubにコードをプッシュします。



...
  
    org.apache.logging.log4j
    log4j-core
    2.14.0
  

GitHubの[Security]-[Dependabot alerts]を確認すると、次のようなアラートが自動で表示されているのが分かります。Log4jのバージョンが古く脆弱性が含まれるためリモートコードが実行される可能性がある旨が警告されています。

さらにこの脆弱性を修正するためのPull Requestが自動で作成されます。開発者はこの内容を確認して速やかに対策できます。

このDependabotはパッケージ管理システムの設定ファイルをチェックし、アプリケーションで脆弱性が含まれるバージョンのライブラリが使用されていないかをGitHub Advisory Databaseに従ってチェックします。

本稿執筆時点(2022年5月)でDependabotが脆弱性と依存関係を検出できるパッケージ管理システムは以下のとおりです。

パッケージ管理システム 言語 推奨フォーマット サポートするフォーマット    
Composer PHP composer.lock composer.json,composer.lock
NuGet .NET languages (C# F# VB)C++ .csproj, .vbproj, .nuspec, .vcxproj, .fsproj .csproj, .vbproj,.nuspec, .vcxproj, .fsproj, packages.config
Go modules Go go.sum go.mod, go.sum
Maven Java, Scala pom.xml pom.xml
npm JavaScript package-lock.json package-lock.json, package.json
pip Python requirements.txt, pipfile.lock requirements.txt, pipfile, pipfile.lock, setup.py
Python Poetry Python poetry.lock poetry.lock, pyproject.toml
RubyGems Ruby Gemfile.lock Gemfile.lock, Gemfile ,*.gemspec
Yarn JavaScript yarn.lock package.json, yarn.lock

なお、このDependabotは、GitHubのプライベートリポジトリでも無料で利用できます。GitHub Enterprise Serverを利用している場合は、GitHub Connectを設定することで、Dependabotを利用できます。

このような便利な機能をうまく使って、アプリケーションに脆弱性を組み込まないよう心がけてください。ただし、GitHubが提供するセキュリティ機能はすべての脆弱性を検出するとは限らないため注意してください。また、Gradleなどサポート対象外のパッケージ管理システムもあります。

参考: Improving the developer experience for Dependabot alerts