脆弱性管理

依存ライブラリ管理 いぞんらいぶらりかんり

サプライチェーン攻撃パッケージマネージャーSBOM脆弱性スキャンオープンソースライセンス管理
依存ライブラリ管理について教えて

簡単に言うとこんな感じ!

システムやアプリは「他の人が作った部品(ライブラリ)」を組み合わせて動いてるんだ。その部品に穴(脆弱性)があると自分のシステムも危険になるから、どの部品を使っているか把握して、古くなったら更新する管理のことだよ!


依存ライブラリ管理とは

現代のソフトウェア開発では、アプリケーションの機能すべてをゼロから作ることはほとんどありません。認証処理、暗号化、データ変換など、よく使われる機能は**オープンソースのライブラリ(部品)として公開されており、それらを組み込んで開発するのが一般的です。こうした「自分のコードが頼っている外部の部品」を依存ライブラリ(依存関係 / dependency)**と呼びます。

依存ライブラリ管理とは、アプリケーションが使用しているすべての外部ライブラリを把握し、バージョンを記録・固定し、脆弱性が発見されたときに迅速に更新できる状態を保つ一連の取り組みです。1つのアプリが直接使うライブラリ(直接依存)だけでなく、そのライブラリがさらに使うライブラリ(推移的依存・間接依存)まで含めると、数百〜数千の部品が関与することも珍しくありません。

発注者・管理者の視点では、「作ったシステムがどんな部品で構成されているか」を把握していないことが大きなリスクになります。2021年に話題になったLog4ShellJavaのログライブラリに潜んでいた深刻な脆弱性)は、自社サービスに使われていることすら気づいていなかった企業が続出し、大きな混乱を招きました。依存ライブラリ管理は、こうした事態に備える「部品の棚卸し」とも言える活動です。


依存ライブラリの構造と管理の仕組み

ライブラリの依存関係の種類

種類説明
直接依存自分のコードが直接 import / require しているライブラリaxiosHTTP通信ライブラリ)を使う
間接依存(推移的依存)直接依存のライブラリがさらに使っているライブラリaxios が内部で使う follow-redirects
開発依存開発・テスト時のみ使い、本番環境には含まないライブラリテストフレームワーク jest など
ピア依存「一緒に使う前提」として宣言される依存関係Reactのプラグインが react 本体を前提とする

主なパッケージマネージャーと管理ファイル

パッケージマネージャーとは、ライブラリのインストール・バージョン管理を自動化するツールです。

言語パッケージマネージャー依存定義ファイルバージョン固定ファイル
JavaScript / Node.jsnpm / yarn / pnpmpackage.jsonpackage-lock.json / yarn.lock
Pythonpip / Poetryrequirements.txt / pyproject.tomlpoetry.lock
JavaMaven / Gradlepom.xml / build.gradle— (リポジトリキャッシュ)
RubyBundlerGemfileGemfile.lock
GoGo Modulesgo.modgo.sum
PHPComposercomposer.jsoncomposer.lock

ロックファイルが重要な理由

package.json には ^1.2.0(1.2.0以上)と書いてあるだけ」という状況では、インストールするタイミングによって入るバージョンが変わってしまいます。ロックファイルpackage-lock.json など)は「このときは 1.2.3 を使った」という事実を記録し、どの環境・どのタイミングでも同じバージョンが入ることを保証します。ロックファイルをバージョン管理(Git)に含めることがセキュリティ上の基本です。


歴史と背景

  • 2000年代前半:オープンソースの普及とともに、外部ライブラリの活用が一般化。当初は手動でDLして組み込む方式が主流
  • 2009年:Node.jsのパッケージマネージャー npm が登場。ライブラリの自動インストール・依存解決の概念を普及させる
  • 2013年頃:MavenやBundlerなど各言語でのパッケージエコシステムが成熟。依存地獄(dependency hell)が問題視され始める
  • 2014年Heartbleed(OpenSSLの脆弱性)が発覚。広く使われるライブラリの脆弱性が世界規模で影響することが明確になる
  • 2016年left-pad事件。npmの小さなライブラリが削除されただけで多くのサービスがビルド不能になり、依存管理の脆弱性を改めて認識
  • 2021年Log4Shell(CVE-2021-44228)が発覚。Java製ロギングライブラリLog4jの脆弱性が数千のサービスに波及し、依存ライブラリ管理の重要性が経営課題として認識される
  • 2021年〜:米国大統領令(EO 14028)でソフトウェアの部品表(SBOM)作成が義務付けられ、国際的なトレンドになる
  • 2023年〜:GitHub Dependabot・Snyk・OWASP Dependency-Checkなどの自動脆弱性スキャンツールが普及し、CI/CDへの組み込みが標準化

脆弱性管理との関係・SBOM

依存ライブラリ管理は単なる「バージョン管理」にとどまらず、セキュリティ・サプライチェーン管理の核心です。

SBOMとは

SBOM(Software Bill of Materials / ソフトウェア部品表)とは、システムを構成するすべてのソフトウェア部品をリスト化した文書です。食品の「原材料表示」にあたるイメージで、「このシステムはどの部品で作られているか」を明示します。

項目内容
記載内容部品名・バージョン・ライセンス・供給元・ハッシュ値
主なフォーマットSPDX(ISO/IEC 5962)、CycloneDX
活用場面脆弱性対応・ライセンス監査・調達審査
義務化動向米国政府調達・EU CRAなどで要求が拡大中

脆弱性スキャンの流れ

依存ライブラリの脆弱性スキャン フロー ① 依存関係 ロックファイル生成 ② SBOM生成 部品リストを作成 ③ 脆弱性照合 CVEデータベースと突合 ④ アラート・修正 アップデート実施 主な脆弱性スキャンツール • GitHub Dependabot — GitHubに統合、自動PR作成 • Snyk — 多言語対応、IDE連携が充実 • OWASP Dependency-Check — 無料・OSS • npm audit / pip-audit — 言語標準の監査コマンド • Trivy — コンテナ・ファイルシステム含め広範に対応 主な脆弱性データベース • NVD(National Vulnerability Database) • CVE(Common Vulnerabilities and Exposures) • GitHub Advisory Database • OSV(Open Source Vulnerabilities) • JVN(Japan Vulnerability Notes)

ライセンス管理も忘れずに

依存ライブラリにはOSS(オープンソース)ライセンスが付いており、ライセンスの種類によっては商用利用の制限やソースコード公開義務が発生します。脆弱性管理と並行してライセンス監査も実施することが重要です。

ライセンス種別代表例商用利用ソース公開義務
許容的ライセンスMIT / Apache 2.0 / BSDなし
コピーレフト(弱)LGPL部分的
コピーレフト(強)GPLあり(注意)
商用ライセンス要契約

関連する規格・RFC

規格・番号内容
ISO/IEC 5962:2021SPDX(Software Package Data Exchange)形式のSBOM標準
NIST SP 800-161r1ソフトウェアサプライチェーンリスク管理のガイドライン

関連用語

  • 脆弱性(CVE) — 個々のソフトウェア欠陥に付与される共通識別番号
  • SBOM — システムを構成するソフトウェア部品を列挙した部品表
  • サプライチェーン攻撃 — 開発ツールや外部ライブラリを経由して行われる間接的なサイバー攻撃
  • OSS(オープンソースソフトウェア) — ソースコードが公開されている自由に利用可能なソフトウェア
  • CI/CD — コードの統合・テスト・デプロイを自動化するパイプライン
  • コンテナ — アプリケーションとその依存関係を一括してパッケージ化する技術
  • 脆弱性スキャン — システムやコードの既知の欠陥を自動で検出する検査手法
  • ゼロデイ脆弱性 — 修正パッチが存在しない、発見直後の脆弱性