依存関係のセキュリティとソフトウェア構成分析
SCAツールでサードパーティーライブラリを監査し、依存関係のピン留めを適用して、自動脆弱性アラートをCI/CDパイプラインに統合します。
「依存関係のセキュリティとソフトウェア構成分析」はCoddyKit上の無料Security+ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSecurity+ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Security+ Academyコースには全4レッスンが含まれています。
オープンソース依存関係のリスク
現代のアプリケーションは、その大部分がサードパーティ製のオープンソースライブラリとフレームワークで構成されています。一般的なNode.jsアプリケーションには1,000以上の間接依存関係が含まれることがあり、Javaプロジェクトでは数百のMavenアーティファクトが取り込まれる場合があります。依存関係の一つひとつが潜在的な攻撃対象領域です。Log4jライブラリのLog4Shell脆弱性(CVE-2021-44228)は、たった一つの依存関係によって、開示から数日以内に世界中の数百万のアプリケーションが直ちに悪用可能になることを示しました。
ソフトウェア構成分析とは
Software Composition Analysis(SCA)ツールは、アプリケーション内のすべてのオープンソースコンポーネントを自動的に一覧化します。これには間接依存関係(依存しているコンポーネントの依存関係)も含まれます。そして、既知のCVEについて脆弱性データベースと継続的に照合します。SCAは、すべてのコンポーネントとバージョンを列挙したSoftware Bill of Materials(SBOM)を生成するため、新たな脆弱性が開示されたときに影響を受けるシステムを迅速に特定できます。
# SCA tool usage examples:
# npm audit (Node.js):
# npm audit
# -> Reports vulnerabilities in package.json dependencies
# -> Shows severity, CVE ID, affected package, fix version
# OWASP Dependency-Check (Java/Python/etc.):
# dependency-check --project 'MyApp' --scan ./lib/
# -> Generates HTML/XML report with CVE findings
# Snyk scan:
# snyk test
# -> Reports vulns + 'snyk fix' applies patches automatically間接依存関係:隠れたリスク
間接依存関係とは、直接依存しているライブラリが依存するライブラリであり、開発者が明示的に選択したものではありません。たとえば、Package Aに直接依存しており、Package AがPackage B(バージョン1.2)に依存し、Package BがPackage C(バージョン3.0、脆弱性のあるバージョン)に依存しているとします。Package Cを認識していなくても、アプリケーションはそれを実行します。SCAツールは依存関係ツリー全体をたどり、開発者から直接見えないこのような隠れた脆弱性を明らかにします。
# Dependency tree example:
# Your package.json:
# 'express': '^4.18.0' (direct dependency)
# 'lodash': '^4.17.21' (direct dependency)
# Transitive dependencies (you didn't choose these):
# express -> 'qs' 6.11.0 (URL parsing)
# express -> 'body-parser' 1.20 -> 'qs' 6.11.0
# lodash (self-contained in this case)
# If 'qs' 6.10.x had a prototype pollution CVE,
# you are vulnerable via express even though
# you never directly imported 'qs'.Software Bill of Materials(SBOM)
Software Bill of Materials(SBOM)は、ソフトウェア製品に含まれるすべてのコンポーネントを機械可読形式で正式に一覧化したものです。食品の原材料表示に似ています。SBOMの形式には、SPDX(Linux Foundation)やCycloneDX(OWASP)があります。米国の大統領令14028(2021年)は、連邦政府に販売するソフトウェアにSBOMを義務付けました。SBOMがあれば、セキュリティチームは「自社製品のどれにLog4jが含まれているか」をすぐに検索でき、何日も手作業で調査することなく数分で答えを得られます。
# Generate SBOM with syft:
# syft packages . -o spdx-json > sbom.spdx.json
# SBOM content example (SPDX JSON):
# {
# 'packages': [
# { 'name': 'express', 'version': '4.18.2', 'license': 'MIT' },
# { 'name': 'lodash', 'version': '4.17.21','license': 'MIT' },
# { 'name': 'log4j-core','version': '2.14.0','license': 'Apache-2.0'}
# ]
# }
# When Log4Shell announced, query SBOM:
# grep -i 'log4j-core' sbom.spdx.json -> FOUND in 3 projects依存関係の固定とロックファイル
依存関係の固定では、柔軟な範囲(^1.2.3や*)ではなく、依存関係の正確なバージョンを指定します。ロックファイル(package-lock.json、yarn.lock、Pipfile.lock、Gemfile.lock)には、インストール時に解決されたすべての依存関係の正確なバージョンが記録されます。インストールのたびにパッケージバージョンを汚染するサプライチェーン攻撃を防ぎ、チームの全員とCI/CDパイプラインが同一の依存関係バージョンを使用できるよう、これらはソース管理にコミットしてください。
# Version range vs pinned versions:
# FLEXIBLE (can pull different versions each install):
# 'express': '^4.0.0' -> installs latest 4.x.x
# 'lodash': '*' -> installs any version!
# PINNED (always same version):
# 'express': '4.18.2' -> always exactly 4.18.2
# Lock file (package-lock.json):
# Records EXACT resolved version of every transitive dep.
# Commit this file! It ensures reproducible builds.
# Never .gitignore lock files (security anti-pattern).サプライチェーン攻撃:typosquattingとDependency Confusion
サプライチェーン攻撃は依存関係のエコシステムを標的にします。Typosquattingは、人気パッケージと似た名前(たとえばlodashの代わりにlodahs)の悪意あるパッケージを公開し、開発者が名前を入力ミスすることを狙います。Dependency confusion攻撃は、パッケージマネージャーがレジストリを検索する順序を悪用します。攻撃者が、社内のプライベートパッケージと同じ名前で、より高いバージョン番号を持つ悪意あるパッケージを公開すると、パッケージマネージャーは代わりに悪意ある公開版をインストールします。
# Dependency Confusion Attack (Alex Birsan 2021):
# Company uses internal package 'company-utils' v1.0.0
# Hosted on: internal.registry.company.com
# Attacker publishes 'company-utils' v9.9.9 to npmjs.com
# (public registry with higher version number)
# npm install resolves: 'find highest version across ALL registries'
# -> Installs v9.9.9 from public npm (attacker's malicious package!)
# -> Instead of v1.0.0 from internal registry
# Defense: use namespace scoping (@company/utils)
# or configure npm to ONLY use internal registry for private packages市場で利用されているSCAツール
業界では、複数のSCAツールが広く利用されています。Snykは、開発者が使いやすい依存関係スキャンと、自動修正用のPRを提供します。OWASP Dependency-Checkは、Java、.NET、Python、Ruby向けの無料で広く採用されているツールです。GitHub Dependabotは、GitHubリポジトリ内の脆弱な依存関係を更新するプルリクエストを自動的に作成します。JFrog XrayとSonatype Nexus IQはSCAをアーティファクトリポジトリに統合し、脆弱なビルドが本番環境に到達するのを阻止します。
CI/CDパイプラインへのSCAの統合
SCAは、CI/CDパイプラインの品質ゲートとして統合したときに最も効果を発揮します。プルリクエストとビルドのたびに、パイプラインがSCAツールを実行し、依存関係に重大または高深刻度のCVEが見つかった場合はビルドを失敗させます。この「シフトレフト」のアプローチにより、脆弱な依存関係が本番環境に到達する前に検出できます。数か月後の手動セキュリティレビューや、侵害発生後に発見するよりも早い段階で対処できるのです。チームは、デプロイをブロックする脆弱性の深刻度基準と、警告だけを生成する基準を明確に定義してください。
# GitHub Actions SCA pipeline step:
# - name: Run Snyk SCA scan
# uses: snyk/actions/node@master
# env:
# SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
# with:
# args: --severity-threshold=high
# --fail-on=upgradable
# # Build fails if any HIGH or CRITICAL vuln found
# # that has an available fix (--fail-on=upgradable)
# # No fix available? Generates warning, doesn't block
# # (acknowledging risk explicitly is better than blocking forever)オープンソースパッケージの健全性評価
依存関係を追加する前に、複数の指標を使ってそのセキュリティ状況を評価してください。メンテナンス活動:プロジェクトは活発に保守されていますか。最後のコミットとリリースはいつですか。既知の脆弱性の履歴:これまでにCVEが何件あり、どの程度の速さで修正されましたか。ダウンロード数:広く使われているパッケージほど、セキュリティの精査を受けやすくなります。依存関係の数:依存関係が少ないパッケージほど、間接的なリスクが小さくなります。OpenSSF Scorecardは、オープンソースプロジェクトのセキュリティ対策を自動的にスコアリングします。
脆弱性の修正戦略
SCAによって脆弱な依存関係が特定された場合、いくつかの修正戦略があります。利用可能であれば、修正済みバージョンへアップグレードするのが推奨される選択肢です。アップグレードの準備中は、WAFルールによる仮想パッチで既知の悪用経路を緩和できます。不要になった依存関係は削除します。特定の利用状況では悪用できない脆弱性の場合(たとえば、クライアントサイドライブラリに存在するサーバーサイドの脆弱性)は、根拠を文書化したうえでリスクを受容することもできます。重大な脆弱性を、文書化された受容判断なしに未対処のまま放置してはいけません。
依存関係におけるライセンスコンプライアンス
SCAツールには、セキュリティ脆弱性を特定するだけでなく、オープンソース依存関係のライセンスコンプライアンス問題を検出する役割もあります。問題になりやすいライセンスには、GPL v2/v3(コピーレフト。製品を配布する場合、その製品もオープンソースにする必要があります)、AGPL(GPLの適用範囲をネットワークサービスに拡張します)、SSPLなどがあります。商用ライセンスなしでGPLライセンスのライブラリを proprietaryな商用ソフトウェアに使用すると、深刻な法的責任が生じる可能性があります。FOSSA、Black Duck、WhiteSourceなどのSCAツールは、脆弱性の検出と併せてライセンススキャンを自動化し、オープンソースに関する義務への準拠を確保します。
# License compliance risk levels:
# PERMISSIVE (low risk for commercial use):
# MIT, Apache 2.0, BSD 2/3-Clause
# -> Can use in proprietary code, just keep attribution
# WEAK COPYLEFT (medium risk - check usage):
# LGPL -> can link dynamically without open-sourcing your code
# MPL 2.0 -> modifications to MPL files must be open-sourced
# STRONG COPYLEFT (high risk for proprietary products):
# GPL v2, GPL v3 -> if you distribute code using GPL library,
# your entire product must also be GPL
# AGPL -> extends GPL to SaaS/network services
# SCA policy: block AGPL/GPL in commercial product
# -> Review any exception requests manuallyクイックチェック
このレッスンで扱ったCompTIA Security+(SY0-701)の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、SCAツールが間接依存関係を含む依存関係ツリー全体をスキャンし、既知のCVEを検出すること、SBOMが機械可読なインベントリを提供し、新たな脆弱性が開示されたときの迅速な対応を可能にすること、そしてSCAをCI/CDの品質ゲートとして統合することで、脆弱な依存関係が本番環境に到達する前に検出できることを学びました。次は、DevSecOpsと、セキュリティ制御をCI/CDパイプライン全体の早い段階に組み込むシフトレフトについて学びます。
よくある質問
「依存関係のセキュリティとソフトウェア構成分析」レッスンは無料ですか?
はい。「依存関係のセキュリティとソフトウェア構成分析」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Security+ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Security+ Academyコースには全4レッスンが含まれています。
「依存関係のセキュリティとソフトウェア構成分析」で何を学びますか?
SCAツールでサードパーティーライブラリを監査し、依存関係のピン留めを適用して、自動脆弱性アラートをCI/CDパイプラインに統合します。 ブラウザで直接実行するハンズオンコードでSecurity+ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Security+ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSecurity+ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「依存関係のセキュリティとソフトウェア構成分析」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSecurity+ Academyレッスンでコードを書いて実行できますか?
はい。すべてのSecurity+ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 入力検証と出力エンコーディング
- 安全なシークレット管理と環境変数
- 依存関係のセキュリティとソフトウェア構成分析
- DevSecOps:セキュリティをパイプラインに前倒しする