対策・学習11分で読める

自社の脆弱性監視を自動化する:技術名ではなく、使っている部品の名前で照合する

自社が使う部品だけを自動で拾う脆弱性監視の作り方。ロックファイルとOSパッケージから部品表を作り、KEV・EPSSで優先度を付け、AIの一次判定は緊急度を上げる方向にだけ使う設計を解説します。

本文を読む
公開日
更新日
最終確認
目次

対象:自分で運用するサイトやサービスの脆弱性情報を、人が見張らなくても拾える状態にしたい人。何を拾い、何と照合し、どこまでAIに任せるかに絞ります。

何があったか:3回続けて、人のほうが先に知った

当サイトの運営者が関わるサイトで、1週間のうちに次の3つが起きました。どれも、運営者はSNSかメールで先に知り、自動の監視はその時点で何も出していませんでした。

  1. 1件目

    PHPの脆弱性。運営者が先に知った。自動監視は未検知。
  2. 2件目

    Pythonパッケージへの悪意あるコードの混入。運営者が先に知った。自動監視は未検知。
  3. 3件目

    コンテナのベースイメージの問題。運営者が先に知った。自動監視は未検知。

最初に疑ったのは「情報源が足りない」ことでした。原因は1つに絞れず、公式情報が「話題になる」より遅れること(後述)に加えて、「うちの構成に関係がある」と判定する材料が足りないことも原因の1つでした。「PHP」「Python」のような技術名の言葉は、記事やニュースの本文には出ても、自分が使っているパッケージ名とは別のものだからです。

作り直した監視の仕組み

①集める

公式アドバイザリ/GitHubのアドバイザリ/悪意あるパッケージの一覧/KEV/ニュース/SNS

↓

一覧A:使っている技術の言葉

広く拾う

一覧B:実際の部品名

ロックファイル+OSパッケージから生成

↓

②ルールで拾う(AIなしで動く)

↓

③安価なAIが一次判定

緊急度を上げることだけできる。下げることはできない。

集める → 2本の一覧と照合 → ルールで拾う → AIは緊急度を上げるだけ。AIが使えない日も、ルールの経路は止まらない。
  • 集める範囲:公式アドバイザリ、GitHubのアドバイザリ、悪意あるパッケージの一覧、CISAのKEV、ニュース、SNS。
  • 2本の一覧で照合する:「使っている技術の言葉」で広く拾い、「実際に使っている部品の名前」で確度の高い一致を取る。部品の一覧は、すべてのリポジトリのロックファイルとOSパッケージから作る。
  • イメージ全体を走査する:アプリの依存だけでなく、ベースイメージを含むイメージ全体を調べる。
  • ランタイムの古さを測る:Node、PHP、データベースなどが、最新の版からどれだけ遅れているかを確認する。
  • AIの一次判定:安価なAIモデルが「うちに影響するか」を最初に判定する。AIは緊急度を上げる方向にだけ働く。

実測で分かったこと(予想と違った点を含む)

最初の仮定:公式情報だけで足りる

公式アドバイザリとKEVを見ていれば、重要なものは拾えると考えた。しかし実際には、「話題になる」ほうが「公式の告知が出る」より先に起きることがあった。公式情報だけでは、この競争に負ける。

実測後:SNSも入口に加える

SNSを入口に加えると、公式情報より早く気づけるようになった。ただしSNSの情報は、公式の確認が取れるまで事実として扱わない。入口は広く、判断は慎重にする。

約100件
別の記事候補ウォッチが10日間で集めた重大な脆弱性
0件
上の約100件のうち、運営者のサイトに影響するのに、この監視が見落としたもの
約6日
AIの利用枠が切れ、AIの一次判定が止まった期間(ルール照合は継続)
  1. 見落としの検証:別の目的(記事の候補探し)で10日間に集めた重大な脆弱性、約100件を、この監視の結果と突き合わせました。運営者のサイトに影響するものの見落としは0件でした。
  2. AIの利用枠切れ:月の利用枠を使い切り、AIの一次判定が約6日止まりました。AIを使わないルール照合は、その間も動き続けました。設計としては「停止期間の終わりの日をあらかじめ決めておき、その日から自動で再開する」形にしています。
  3. 新しいサーバーの抜け:新しく追加したサーバーのOSパッケージが、部品の一覧に入っていませんでした。月に一度の一覧の作り直しで見つかりました。一覧は作って終わりではなく、定期的に作り直して初めて信頼できます。

自分の環境で作る手順

1

部品の一覧(SBOM)を機械的に作る

各リポジトリのロックファイルと、サーバーやコンテナのOSパッケージの両方から作ります。CISAはSBOMを「ソフトウェアを構成する部品の入れ子の一覧」と説明しています。SBOM生成ツールには、コンテナイメージやファイルシステムからOSパッケージと主要言語の依存を読み、CycloneDXやSPDX形式で出力できるオープンソースのSyftなどがあります。

2

一覧に対して既知の脆弱性を照合する

依存パッケージの照合には、ロックファイルやコンテナを読むオープンソースのosv-scannerが使えます。導入とCIへの組み込みは osv-scannerの導入と使い方 にまとめています。

3

優先度は KEV と EPSS で付ける

件数が多いと、すべてを同じ重さでは直せません。実際に悪用が確認されたもの(KEV)と、悪用される確率が高いもの(EPSS)から直します。使い分けは CVSS・EPSS・KEVの使い分け に書きました。

4

AIを使うなら、上げる方向だけに使う

AIの判定が「影響なし」でも、ルールが拾った項目を消さないようにします。AIは誤って「関係ない」と言うことがあり、見落としの被害は誤警報の手間より大きいからです。

5

AIが使えない日の動きを決めておく

利用枠の切れ、障害、サービスの停止は起こり得ます。AIなしのルールだけで最低限の通知が出ること、再開日を設定して自動で戻ることを、運用の前に決めておきます。

6

一覧を定期的に作り直す

サーバーやリポジトリを追加したのに一覧へ反映されていない、という抜けは起きます。月に一度は作り直し、増えたものが入っているかを確認します。

SNSの情報は、公式の確認が取れるまで事実として扱わない

SNSは早い反面、誤情報や、公式がまだ確認していない推測が混じります。入口としては有用でも、対応を決める根拠は、ベンダーの公式アドバイザリやKEVなど、確認できる一次情報に置いてください。

当サイトの視点:技術名は広く拾い、部品名で絞る

当サイトの運営者の経験では、実際の部品名での照合に切り替えると、ヒットと見落としが減りました。ただし部品名の一覧が古いと、見落としに直結します。広く拾う網と、正確に絞る一覧の両方が要ります。なお本記事で説明したのは、運営者が関わるサイトのために作った監視の話です。

出典(一次情報・公式資料)

  • CISA — Known Exploited Vulnerabilities Catalog(実際に悪用が確認された脆弱性の一覧)
  • CISA — Software Bill of Materials (SBOM)(SBOMの定義)
  • FIRST — EPSS(悪用される確率の予測)
  • OpenSSF — malicious-packages(悪意あるパッケージの報告をOSV形式で集めたリポジトリ)
  • Anchore — Syft(コンテナイメージ・ファイルシステムからSBOMを生成。CycloneDX・SPDX出力、OSパッケージと主要言語に対応)

次に読む

よくある質問

Q脆弱性情報を自動で集めるとき、何を元にすればよいですか?
A

各製品の公式アドバイザリ、CISAのKEV、パッケージ管理の脆弱性データベース、悪意あるパッケージの一覧を基本にします。ただし公式情報は『話題になる』より遅れることがあります。当サイトの運営者の監視では、公式情報だけだと『話題になってから公式の告知が出るまで』の競争に負けたため、SNSも補助の入口に加えました。ただしSNSの情報は、公式の確認が取れるまで事実として扱いません。

Q自社で使っている部品の一覧(SBOM)はどう作ればよいですか?
A

各リポジトリのロックファイル(package-lock.json や pnpm-lock.yaml など)と、サーバーやコンテナのOSパッケージの両方から作ります。アプリの依存だけだと、OSやベースイメージ側の部品が抜けます。SBOM生成ツール(例:Syft)は、コンテナイメージやファイルシステムからOSパッケージと主要言語の依存を読み出し、CycloneDXやSPDXで出力できます。

QAIに『うちに影響するか』を判定させて大丈夫ですか?
A

判定の向きを限定すれば使えます。当サイトの運営者の仕組みでは、AIは緊急度を上げる方向にだけ働き、ルールで拾った項目を下げることはしません。AIは誤って『影響なし』と言うことがあり、見落としの被害は誤警報の手間より大きいためです。

QAIの利用枠が切れた日は、監視はどうなりますか?
A

止まらないように作ります。当サイトの運営者の監視では、月の利用枠を使い切ってAIの一次判定が約6日止まりましたが、AIを使わないルール照合は動き続けました。再開日をあらかじめ設定しておけば、その日から自動で戻ります。