インフラエンジニアや開発担当者の方から「古いライブラリを使っていても、具体的に何がどう危ないのかよくわからない」という声をよく聞きます。2021年末にLog4Shellが世界を震撼させて以降も、古いコンポーネントを起点にした大規模侵害は年々増加しています。
この記事では、OWASP Top 10 2021年版で独立カテゴリに格上げされた「A06: 脆弱で古いコンポーネントの使用」について、攻撃者が実際にどう悪用するか、情シス1人でも今日から始められる管理策を現場目線で解説します。

脆弱なコンポーネントとは?OWASPが独立カテゴリに格上げした理由
コンポーネントとは、アプリケーションを構成するOSSライブラリ、フレームワーク、プラグイン、ミドルウェアなど、自社で書いたコード以外の「外部の部品」すべてを指します。Webアプリケーション1本には数十から数百のコンポーネントが含まれており、それらに既知の脆弱性があると、自社コードがどれだけ堅牢でも侵害を招きます。
OWASP Top 10の2017年版では「A9: 既知の脆弱性を持つコンポーネントの使用」と呼ばれていましたが、2021年版で「Outdated(古い)」という概念が明示的に追加されました。背景には次の変化があります。
・CVEの登録数が急増: NVD(国家脆弱性データベース)への年間CVE登録数は2万件超に上り、対応が追いつかない組織が増えています
・間接依存の複雑化: npm・pip・Mavenなどのパッケージマネージャーが普及し、直接依存の先にあるライブラリ(推移的依存)まで含めると依存ツリーの把握が困難になっています
・N-dayエクスプロイトの高速化: 脆弱性公表直後に大量スキャンを仕掛ける自動攻撃が増加し、パッチ適用の猶予が数週間から数時間まで短縮されています
攻撃の仕組み(古いコンポーネントはどう悪用されるか)
攻撃者がコンポーネントの脆弱性を突くプロセスは、大きく3段階に分かれます。
1. バージョン特定とCVE検索
攻撃者はまず、対象サーバーのHTTPレスポンスヘッダー(Server:やX-Powered-By:)、エラーメッセージ、ソースコードに含まれるコメントやpackage-lock.jsonなどのファイルから使用コンポーネントとバージョンを特定します。
特定したバージョンに対し、NVD・Exploit-DB・GitHub Advisoriesでそのバージョンに影響するCVEとPoC(概念実証コード)を探します。ShodanやCensysといったインターネットスキャンサービスを使えば、脆弱なバージョンを使用しているサーバーを世界規模で一括検索することも可能です。
2. エクスプロイトの実行
PoC・エクスプロイトコードをそのまま、あるいは自動化ツールに組み込んで実行します。コンポーネントの脆弱性は「自社コードのバグ」と異なり、攻撃者がすでに検証済みのコードを使える点が厄介です。
代表的な被害事例を挙げます。
・Log4Shell(CVE-2021-44228): Javaのログライブラリ「Log4j 2.x」に潜んでいたRCE脆弱性。JNDIルックアップ機能を悪用したリモートコード実行が可能で、世界中の企業・政府機関が影響を受けました
・Apache Struts2(CVE-2017-5638): ファイルアップロード処理の脆弱性を悪用したRCE。米Equifaxへの大規模漏洩(1億4,700万件)の直接原因となりました
・jQuery 旧バージョンのXSS: フロントエンドに古いjQueryが残っているケースは国内でも多く、クロスサイトスクリプティング(XSS)に悪用される可能性があります
3. 間接依存の盲点
直接インストールしたライブラリだけでなく、そのライブラリが依存するライブラリ(推移的依存)も攻撃対象です。「自分では脆弱なライブラリを入れていない」つもりでも、依存ツリーの深い位置に問題が潜むケースは珍しくありません。Log4Shell対応時に「うちは使っていない」と思っていたら、間接依存として含まれていたという事例が国内でも多数報告されました。
具体的な防御手順
1. 依存関係の全棚卸し(SCA: ソフトウェア構成分析)
まず「何を使っているか」を把握するところから始めます。SCA(Software Composition Analysis: ソフトウェア構成分析)ツールを使い、直接・間接の両方の依存関係と既知の脆弱性を洗い出します。
無料・OSSで利用できるツール例:
・OWASP Dependency-Check: Java・Python・Node.js・.NET等に対応。HTMLレポートを生成して視認性が高い
・npm audit: Node.jsプロジェクトに標準搭載。npm audit fix で自動修正も可能
・pip-audit: Pythonプロジェクト向け。PyPI Advisory Databaseと突合して脆弱なパッケージを検出
・Trivy: コンテナイメージ・ファイルシステム・SBOMのスキャンに対応したOSSツール
# npm audit(Node.jsプロジェクトのディレクトリで実行) npm audit # 自動修正可能な脆弱性を一括修正 npm audit fix # pip-audit(Pythonプロジェクト) pip install pip-audit pip-audit # Trivy でコンテナイメージをスキャン trivy image my-app:latest # Trivy でファイルシステムをスキャン trivy fs .
スキャン結果でCRITICALまたはHIGHが検出されたコンポーネントは、優先的にアップデートします。
2. パッチ適用の自動化
依存ライブラリの更新を人手で追うことは困難です。自動化の仕組みを組み込みましょう。
・Dependabot(GitHub公式): GitHubリポジトリの.github/dependabot.ymlに設定するだけで、脆弱なコンポーネントの更新PRを自動生成します。パブリック・プライベートリポジトリともに無料で利用可能
・Renovate: GitHub・GitLab・Bitbucketに対応したOSSの依存関係更新ツール。更新頻度や対象ライブラリを細かく制御できます
・CVSSスコアによる優先度設定: CVSS 9.0以上のCritical脆弱性は48時間以内に対応するなど、優先度ルールを社内で明文化しておくと対応漏れを防げます
パッチ管理の全体的な進め方については、こちらの記事もあわせてご覧ください。
パッチ管理の基礎|脆弱性対応サイクル・優先度判定・適用手順をわかりやすく解説
3. SBOMによる依存関係の可視化
SBOM(Software Bill of Materials: ソフトウェア部品表)は、アプリケーションを構成するコンポーネントを構造化した一覧文書です。あらかじめSBOMを作成・維持しておくと、新たなCVEが公開された際に「自社システムへの影響の有無」を数分で確認できます。
SBOMとは?ソフトウェア部品表でサプライチェーンリスクを可視化する実践ガイド
4. 不要なコンポーネントの削除
使っていないライブラリ・プラグインは削除することで、攻撃対象となる範囲(アタックサーフェス)を絞り込めます。
・Node.js: npx depcheck で未使用パッケージを検出し、npm uninstall で削除
・Python: pipdeptree や pip-autoremove で依存ツリーを確認して不要なパッケージを整理
・WordPress: 無効化しただけのプラグインは削除する(無効化のみでは攻撃対象として残ります)
5. バージョン情報の非開示
攻撃者がバージョンを特定しやすい情報を減らすことも有効な緩和策です。ただしこれはあくまで「攻撃を遅らせる」対策であり、パッチ適用の代替にはなりません。
・HTTPレスポンスヘッダーのバージョン情報を削除: Server: Apache/2.4.50 のような詳細情報を秘匿する
・エラーページのカスタマイズ: スタックトレースやバージョン番号を含むデフォルトエラーページを非表示にする
・WordPressのバージョン情報を隠す: テーマの functions.php で remove_action('wp_head', 'wp_generator') を追加する
中小企業でも今日からできること
大きな仕組みを整える前に、まず以下から着手してください。
今日できること(30分以内)
・1. プロジェクトの package.json / requirements.txt / pom.xml を開く
→ 最終更新が2年以上前のライブラリを見つけたら、NVDやGitHub Advisoriesで既知CVEを確認する
・2. WordPressを使っているなら「プラグイン」→「更新」画面を開く
→ 未更新のプラグインとコアを即座に適用する(アップデート前のバックアップを忘れずに)
・3. GitHubリポジトリがあればDependabotアラートを有効化する
→ Settings → Security → Dependabot alerts をONにする(無料・設定のみで完結)
1か月以内に整えたいこと
・CIパイプラインへのSCA組み込み: GitHub Actionsなどで、mainブランチへのマージ時にSCAスキャンが自動実行される仕組みを作る
・対応ルールの明文化: 誰が、いつ、どのCVSSスコア以上の脆弱性を対応するかをドキュメント化する。1人情シスであれば「毎月第2火曜日は依存関係メンテナンスの日」などルーティン化するだけでも効果的
よくある誤解と注意点
誤解1: 「社内システムだから外部からアクセスできない」
フィッシングやマルウェアで内部に入り込んだ攻撃者には、社内ネットワークの脆弱なコンポーネントは格好のターゲットです。外部から直接アクセスできない環境でも、コンポーネント管理は必要です。
誤解2: 「動いているから問題ない」
脆弱性は「動くかどうか」とは無関係です。完全に正常動作しているコンポーネントが、認証なしのリモートコード実行(RCE)に使われる例は数多くあります。
誤解3: 「WAFがあるから大丈夫」
WAFによるフィルタリングは多層防御の重要な要素ですが、すべての脆弱性エクスプロイトを防げるわけではありません。コンポーネントのパッチ適用との組み合わせが前提です。
注意点: メジャーバージョンアップは別管理で
マイナーバージョンの自動更新は比較的安全に実施できます。一方、メジャーバージョンアップ(例: Node.js 16 → 22)はAPIの破壊的変更を伴うことが多く、十分なテストが必要です。自動更新の対象をマイナー・パッチ更新に限定し、メジャーアップは手動管理とするのが現実的です。

本記事のまとめ
| 対策 | 効果 | 難易度 |
|---|---|---|
| SCAツールによるスキャン(npm audit等) | 脆弱なコンポーネントの特定 | 低(無料ツールあり) |
| Dependabot / Renovate の有効化 | 更新の自動化・漏れ防止 | 低(設定のみ) |
| SBOMの作成・維持 | CVE公開時の影響範囲即時把握 | 中(ツール導入が必要) |
| 不要コンポーネントの削除 | 攻撃対象の最小化 | 低(棚卸しから着手) |
| バージョン情報の非開示 | 情報収集フェーズを遅らせる | 中(サーバー設定が必要) |
自社コードの品質向上と同じく「使っているコンポーネントの管理」が今やセキュリティの基本です。まずは既存プロジェクトのSCAスキャンを1回実施し、CRITICAL/HIGHの脆弱性がないかを確認するところから始めましょう。
パッケージ管理の盲点を突く「依存関係コンフュージョン攻撃」についても知っておくと、より広い視点でサプライチェーンリスクに備えられます。
依存関係コンフュージョン攻撃とは?パッケージ管理の盲点を突くサプライチェーン脅威と防御策
また、Linuxサーバー上でのパッケージ管理とセキュリティ設定については、姉妹サイトLinuxMaster.JPで詳しく解説しています。
PR
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版(徳丸浩/SBクリエイティブ)
Webアプリのセキュリティ対策を基礎から体系的に学べる定番書。コンポーネントの脆弱性を含むOWASP Top 10の各脅威を具体的な攻撃例と対策コードで解説しており、開発者・情シス担当者に広く支持されています。
