Overview
SCA(Software Composition Analysis:ソフトウェアコンポジション分析)とは、ソフトウェアプロジェクトに含まれるオープンソースソフトウェア(OSS)や商用コンポーネントを特定・分析し、既知の脆弱性やライセンス違反のリスクを検出するためのセキュリティ手法です。現代のソフトウェア開発では、コードベースの70〜90%がOSSコンポーネントで構成されており、これらの依存関係に潜む脆弱性を管理することが極めて重要です。
SCAツールは、プロジェクトのパッケージマネージャ(npm、Maven、pip、Goモジュールなど)の設定ファイルやロックファイルを解析し、依存関係ツリー(Dependency Tree)を構築します。直接依存するライブラリだけでなく、それらが内部的に使用する推移的依存関係(Transitive Dependencies)まで含めて、NVD(National Vulnerability Database)やGitHub Advisory Databaseなどの脆弱性データベースと照合します。
代表的なSCAツールには、Snyk、GitHub Dependabot、OWASP Dependency-Check、Mend(旧WhiteSource)、Black Duckなどがあります。これらはCI/CDパイプラインに統合することで、ビルド時に自動的に脆弱性をスキャンし、問題のあるコンポーネントの使用を防止できます。ライセンスコンプライアンスチェック機能も備えており、GPL等のコピーレフトライセンスの意図しない混入を検出することも可能です。
Details
依存関係ツリーとSCAの検出範囲
ソフトウェアプロジェクトの依存関係は、直接的に宣言されたライブラリ(直接依存関係)だけでなく、それらが内部で利用する多数のサブ依存関係から成り立っています。例えば、1つのnpmパッケージが数百の推移的依存関係を持つことは珍しくありません。SCAツールはこの依存関係ツリー全体を可視化し、どの階層のどのコンポーネントに脆弱性が存在するかを正確に特定します。
推移的依存関係に脆弱性が発見された場合、直接依存するライブラリのバージョンアップや、依存関係のオーバーライド(resolutions/overrides)によって修正を適用する必要があります。SCAツールの多くは、修正可能なバージョンの提案や自動プルリクエスト生成機能を提供しています。
脆弱性データベースとスコアリング
SCAツールは複数の脆弱性データベースを参照して脆弱性を検出します。NVD(National Vulnerability Database)はCVE識別子に基づく最大の公開データベースで、GitHub Advisory Databaseはエコシステム固有の脆弱性情報を提供します。各ツールは独自のキュレーションデータベースも保有しており、公開データベースに未登録の脆弱性(ゼロデイ)の早期検出にも対応しています。
脆弱性の深刻度はCVSS(Common Vulnerability Scoring System)スコアに基づいて評価されます。さらに先進的なSCAツールは、脆弱性の到達可能性分析(Reachability Analysis)を行い、プロジェクトのコードが実際に脆弱なコードパスを呼び出しているかを判定することで、対応優先度の精緻な判断を支援します。
ライセンスコンプライアンス管理
OSSコンポーネントにはそれぞれライセンスが付与されており、使用条件を遵守しなければ法的リスクが生じます。GPL(GNU General Public License)のようなコピーレフトライセンスは、派生物にも同一ライセンスの適用を要求するため、商用ソフトウェアに意図せず混入した場合、ソースコードの公開義務が生じる可能性があります。
SCAツールはすべての依存関係のライセンス情報を収集し、組織のライセンスポリシーに基づいてリスクを分類します。許可リスト(MIT、Apache 2.0など)と禁止リスト(AGPLなど)を定義し、ポリシー違反のコンポーネントが検出された場合にビルドを失敗させることで、ライセンス違反を未然に防止します。
SBOM(Software Bill of Materials)との連携
SCAの成果物として生成されるSBOM(ソフトウェア部品表)は、ソフトウェアに含まれるすべてのコンポーネントとそのバージョン、ライセンス情報を一覧化した文書です。SPDXやCycloneDXといった標準フォーマットで出力され、サプライチェーンの透明性確保に不可欠です。
米国大統領令(EO 14028)やEUサイバーレジリエンス法をはじめ、世界各国でSBOMの提供を義務化する動きが加速しており、SCAツールによるSBOM自動生成機能の重要性は急速に高まっています。SBOMは脆弱性発見時の影響範囲特定やインシデント対応の迅速化にも大きく貢献します。
CI/CDパイプラインへの統合
SCAの効果を最大化するには、開発ワークフローに組み込むことが不可欠です。SnykはIDEプラグインやGitHub連携により、開発者がコードを書く段階から脆弱性を可視化します。DependabotはGitHubリポジトリの依存関係を自動監視し、脆弱性修正のプルリクエストを自動生成します。OWASP Dependency-CheckはJenkinsやGitLab CIなどのCIツールと統合でき、ビルドパイプラインでの自動スキャンを実現します。
ベストプラクティスとして、プルリクエスト作成時にSCAスキャンを実行し、重大な脆弱性が検出された場合はマージをブロックするゲーティング(Gate)の仕組みを導入することが推奨されます。これにより「シフトレフト」の原則に基づき、脆弱なコンポーネントが本番環境に到達する前に検出・修正できます。
Security Measures
- 01CI/CDパイプラインへのSCAツール統合:Snyk、Dependabot、OWASP Dependency-Checkなどのツールをビルドパイプラインに組み込み、プルリクエストやビルド時に自動的にOSSコンポーネントの脆弱性をスキャンしてください。重大な脆弱性が検出された場合にはマージやデプロイをブロックするゲーティングポリシーを設定しましょう。
- 02依存関係の定期的な棚卸しとアップデート:プロジェクトで使用するすべてのOSSコンポーネントを定期的に棚卸しし、不要な依存関係を削除してください。ロックファイル(package-lock.json、Pipfile.lockなど)を適切に管理し、再現可能なビルドを維持しつつ、セキュリティパッチが公開されたライブラリは速やかにアップデートしましょう。
- 03ライセンスコンプライアンスポリシーの策定と自動チェック:組織のライセンスポリシーを明文化し、許可するライセンスと禁止するライセンスを定義してください。SCAツールでライセンスチェックを自動化し、GPL等のコピーレフトライセンスの意図しない混入を防止しましょう。
- 04SBOMの自動生成と管理:CycloneDXやSPDX形式でSBOMを自動生成し、ソフトウェアリリースごとに保管してください。脆弱性が公開された際にSBOMを参照することで、影響を受けるプロダクトを迅速に特定し、対応の優先順位付けが可能になります。
- 05プライベートレジストリとプロキシリポジトリの活用:Artifactory、Nexus等のプロキシリポジトリを導入し、外部パッケージレジストリへの直接アクセスを制限してください。承認済みコンポーネントのみを利用可能にすることで、悪意のあるパッケージの混入や依存関係かく乱攻撃(Dependency Confusion)を防止できます。
- 06脆弱性トリアージプロセスの確立:検出された脆弱性を深刻度、到達可能性、悪用可能性に基づいてトリアージするプロセスを確立してください。すべての脆弱性を均一に対応するのではなく、実際にリスクの高いものから優先的に修正することで、効率的なセキュリティ運用を実現しましょう。
Incidents
📋 Log4Shell脆弱性(CVE-2021-44228)による世界的影響(2021年)
2021年12月、Javaの広く利用されるログライブラリApache Log4j 2に重大なリモートコード実行(RCE)脆弱性が発見されました。CVSSスコア10.0の最高深刻度であり、Log4jが推移的依存関係として無数のソフトウェアに組み込まれていたため、影響範囲の特定が極めて困難でした。
SCAツールやSBOMを導入していた組織は、自社ソフトウェアにLog4jが含まれているかを迅速に特定できましたが、そうでない組織は手作業での調査に数週間を要しました。この事件はSCAとSBOM管理の重要性を世界に知らしめ、多くの組織がSCAツールの導入を加速させるきっかけとなりました。
📋 event-stream npmパッケージへの悪意あるコード注入(2018年)
2018年、npmで広く利用されていたevent-streamパッケージのメンテナンス権が悪意のある第三者に移譲され、仮想通貨ウォレットアプリCopayから秘密鍵を窃取するマルウェアが注入されました。この悪意あるコードはflatmap-streamという新たな依存関係を通じて追加されました。
event-streamは週に数百万回ダウンロードされるパッケージであり、多くのプロジェクトが推移的依存関係として利用していました。SCAツールが依存関係の変更を監視し、新しい依存関係の追加や不審なコード変更を検出できていれば、被害の拡大を防ぐことが可能でした。この事件はOSSサプライチェーン攻撃の深刻さを浮き彫りにしました。
📋 Equifax社の大規模情報漏洩事件(2017年)
2017年、米国の大手信用情報機関Equifaxが約1億4700万人の個人情報を漏洩する大規模なセキュリティインシデントが発生しました。原因は、Apache Struts 2フレームワークの既知の脆弱性(CVE-2017-5638)にパッチを適用しないまま運用していたことでした。
脆弱性の修正パッチは攻撃の2か月前に公開されていましたが、Equifaxはパッチ適用を怠っていました。SCAツールを導入し、既知の脆弱性を持つコンポーネントを自動的に検出・通知する仕組みがあれば、この事件を未然に防ぐことができた可能性があります。この事件はSCAによる脆弱性管理の重要性を改めて示しました。