SBOM脆弱性スキャナー
ロックファイルまたはSBOMを貼り付けて、固定された全バージョンを既知の脆弱性と照合します。解析はローカルで行い、OSVデータベースと照合します。
ロックファイルとは、ビルドが実際にインストールするバージョンの正確な一覧です。固定されたバージョンはすべて、固定してから誰も穴を見つけていないという賭けです。このスキャナーはその一覧(package-lock.json、requirements.txt、go.mod、またはCycloneDX / SPDX SBOM)を読み取り、名前とバージョンのペアだけを公開のOSV.dev脆弱性データベースに送信し、どのパッケージに既知の脆弱性があるか、深刻度はどの程度か、各脆弱性を修正するバージョンはどれか、CVEのいずれかがCISAの既知の悪用された脆弱性(Known Exploited Vulnerabilities)リストに載っているかを報告します。関連ガイドロックファイルに脆弱性が隠れていないか?では、結果が何を証明し、何を証明しないかを説明しています。スキャンでCVEが検出された場合は、Bulk CVE Triageで悪用の文脈を確認できます。
最終更新:
ロックファイルまたはSBOM
対応形式:package-lock.json、requirements.txt、go.mod、CycloneDX JSON、SPDX JSON。ファイルサイズ上限は5 MBです。
形式はファイル名と内容から自動判定されます。下で自分で選ぶこともできます。
🔒 ロックファイルはブラウザ内で解析され、アップロードされることはありません。OSV.devに送られるのはパッケージ名とバージョンのみで、自社チェッカーに送られるのはKEVフラグ確認用のCVE IDのみです。
スキャン結果
まだスキャンしていません。ロックファイルまたはSBOMを上でアップロードまたは貼り付け、「脆弱性をスキャン」を押してください。
既知の脆弱性は見つかりませんでした
スキャンしたバージョンのいずれも、OSVデータベースの脆弱性と一致しませんでした。つまり、これらの正確なバージョンについて脆弱性が報告されていないということです。コードが安全だという保証ではありません。未報告の脆弱性、悪意のあるパッケージ、タイポスクワットはこのチェックでは見えません。境界については記事で説明しています。
ロックファイルがこのページを離れることはありません
解析はすべてブラウザ内で行われます。貼り付けたファイルやテキストはローカルで読み取られ、どこにもアップロードされません。外部に送られるのは、抽出されたパッケージ名とバージョンのみで、公開のOSV.dev脆弱性データベース(アカウント不要、キー不要)に送信され、既知の脆弱性と照合されます。照合結果のCVE IDは、CISA KEVの照会のため当サイト独自のチェッカーに送信されます。それ以外は何もこのページを離れません。ファイルの内容、パス、プロジェクト名は一切送られません。
スキャンの制限
1回の実行でスキャンできるのは最大500パッケージまでで、それを超えた分は未スキャンとして一覧表示されます。取得する脆弱性の詳細は最大200件までです。結果は、ファイル内の正確なバージョンに対するOSVデータベースの内容に基づきます。データベースが一度も見たことのないパッケージバージョンは一致せずに返りますが、それは安全だという証明にはなりません。
正直な限界
「脆弱性は見つかりませんでした」とは、これらの正確なバージョンについてOSVデータベースに脆弱性がないという意味です。コードが安全だという意味ではありません。まだ誰も報告していない脆弱性、悪意のあるパッケージ、タイポスクワットの名前、侵害されたリリースは、バージョン照合のチェックではすべて見えません。
照合はバージョン完全一致です。ファイルが正確なバージョンではなく範囲を指定している場合、その行はスキップされ、その旨が一覧表示されます。スキャナーは実際にインストールされたバージョンを推測しません。スキャナーが対応付けできないエコシステムのパッケージも同様で、スキップとして一覧表示され、黙って除外されることはありません。
KEVフラグは、当サイト独自のチェッカーに対する1回の照会(CISA KEVデータ、毎日更新)から取得します。その照会が失敗したりレート制限にかかったりしても、スキャンは完了します。KEV列が結果を妨げるのではなく、単に「不明」と表示されるだけです。
固定されたバージョンが攻撃対象面である理由
ロックファイルが存在するのは、「latest」がバージョンではないからです。ビルドがインストールした正確なツリーを記録し、どのマシンでも、どのデプロイでも同じコードが得られるようにします。その決定性こそが、ロックファイルをスキャン可能にする理由でもあります。脆弱性データベースは正確なパッケージとバージョンをキーとしており、固定されたバージョンは1回の照会で判定できますが、変動する範囲は判定できません。したがってスキャンの精度はファイル次第です。ロックファイルをコミットし、常に最新の状態に保てば、スキャナーは出荷するものについて真実を教えてくれます。
このチェックは意図的に狭い範囲に絞っています。OSV.devはGitHubアドバイザリ、NVD、各言語エコシステムの脆弱性レコードを集約し、バージョンと照合します。できないのはコードの判定です。既知のCVEがないパッケージでも、悪意があったり、放棄されていたり、インストールしようとしたパッケージのそっくりさんであったりする可能性があります。バージョン照合は高速で安価な最初のフィルターであり、アップグレードし忘れたlodashを捕まえるためのものであって、セキュリティ監査ではありません。
KEVフラグがCVSSスコアの高さより重要な理由
CVSSスコアは、脆弱性が悪用された場合にどれほど深刻かを測るものです。CISAの既知の悪用された脆弱性(Known Exploited Vulnerabilities)カタログが測るのは別のことです。実際に悪用されているかどうか、今この瞬間に、現実の世界で、です。深刻度が中程度のCVEでもKEVリストに載っていれば今週中にパッチを当てるべきですし、深刻度がクリティカルでも誰も武器化していなければ次の計画的なアップグレードまで待てることがよくあります。だからこそこのスキャナーはKEVの行を別にバッジ表示し、結果を最悪の深刻度順に並べます。ただし、まず対処すべきはKEVバッジの方です。
修正バージョンにも独自のリスクがあります。脆弱性の修正は通常マイナーまたはパッチリリースですが、「4.17.21で修正」といっても、ビルドを壊す動作変更を伴う場合があり、修正バージョンがまったく存在しない脆弱性もあります。スキャナーはその場合、でっち上げるのではなく、はっきりとそう表示します。まずKEVの項目にパッチを当て、次に公開された修正バージョンのあるクリティカルなものを、残りは計画に入れます。新しいバージョンを固定し、ロックファイルをコミットし、再スキャンします。同じループをCIに組み込むべきで、四半期に1回ではなく、すべてのプルリクエストで実行します。
このSBOMに含まれるライセンス
ここに表示されるライセンスは、SBOM自体に含まれるライセンス欄からのみ取得したものです。ロックファイル(package-lock.json、requirements.txt、go.mod)にはライセンス情報が含まれていないため、何も表示されません。このページではパッケージごとにライセンスを調べることはしません。信頼できる形でライセンスを提供する公開データベースが存在しないためです。
ロックファイルとSBOMの用語を正確に
Lockfile. ビルドがインストールするすべてのパッケージの正確なバージョンを記録するファイル。npmのpackage-lock.json、==で固定したPythonのrequirements.txt、Goのgo.mod/go.sumがあり、インストールを再現可能にします。
SBOM. ソフトウェア部品表(Software Bill of Materials):ソフトウェアに含まれるすべてのコンポーネントを機械可読な形で列挙した一覧で、通常CycloneDXまたはSPDX形式です。ロックファイルをサプライチェーン全体に一般化したものです。
OSV.dev. Googleの公開脆弱性データベース。GitHub、NVD、各言語エコシステムのアドバイザリを集約し、正確なパッケージ名、エコシステム、バージョンで照会できます。
GHSA. GitHubセキュリティアドバイザリのID(GHSA-xxxx-xxxx-xxxx)。OSVにあるnpm、PyPI、Goの脆弱性のほとんどに付与されており、通常CVE IDと併記されます。
CVE. 共通脆弱性識別子(Common Vulnerabilities and Exposures):共有の採番方式(CVE-YYYY-NNNNN)で、すべてのデータベース、スキャナー、ベンダーが同じ脆弱性について話せるようにします。
CVSS. 共通脆弱性評価システム(Common Vulnerability Scoring System):脆弱性が悪用された場合の深刻度を0〜10で表すスコア。9.0以上がCRITICAL、7.0以上がHIGH、4.0以上がMEDIUM、4.0未満がLOWです。
KEV. CISAの既知の悪用された脆弱性(Known Exploited Vulnerabilities)カタログ。現実の世界で悪用が確認された脆弱性を、修正期限付きで収録しています。KEVフラグは、CVSSに関係なく「今すぐパッチを当てよ」という意味です。
Fixed version. 脆弱性が存在しなくなった最初のパッケージバージョンで、アドバイザリの対象範囲イベントから取得します。まだ公開されていない脆弱性もあります。
Purl. パッケージURL(pkg:npm/[email protected]):エコシステムとバージョン付きでパッケージを命名する標準的な方法です。SBOMにはpurlが含まれており、スキャナーはそこからコンポーネントのエコシステムを知ります。
よくある質問
ロックファイルはブラウザを離れますか?
いいえ。ファイルはローカルで解析され、アップロードされることはありません。外部に送られるのは、抽出されたパッケージ名とバージョンのみで、公開の脆弱性データベースであるOSV.devに送信され、照合結果のCVE IDのみが、KEV照会のために当サイト独自のチェッカーに送信されます。ファイルの内容、パス、プロジェクト名がこのページを離れることはありません。
パッケージが「スキップ」と表示されるのはなぜですか?
理由は3つあります。行が正確な固定ではなく範囲指定(~=や>=など)である、-rインクルードやreplaceディレクティブである、エコシステムをOSV.devが対応するものに対応付けできない、または500パッケージの上限に達した、のいずれかです。スキップされた項目は常に理由付きで一覧表示されます。黙って除外されることはありません。
「脆弱性は見つかりませんでした」と表示されました。安全ですか?
必ずしもそうとは限りません。これらの正確なバージョンについて、OSVデータベースに脆弱性が報告されていないという意味です。未報告の脆弱性、悪意のあるパッケージやタイポスクワット、侵害されたリリースは、どの脆弱性データベースにも現れません。スキャンは最初のフィルターとして扱い、安全証明とは考えないでください。
何から修正すべきですか?
まずKEVバッジの付いたものから始めてください。これらの脆弱性は今まさに悪用されており、CISAがそれぞれに期限を設定しています。次に、公開された修正バージョンのあるCRITICALとHIGHの行を、アプリケーションが実際にインポートしているパッケージから対処します。各CVEの悪用の背景については、当サイトのBulk CVE Triageを参照してください。
脆弱性に修正バージョンがありません。どうすればよいですか?
まず、アドバイザリにまだ記録されていない新しいバージョンが存在しないか確認してください。アドバイザリはリリースより遅れがちです。本当に修正がない場合は、依存関係を削除する、置き換える、または脆弱なコードパスを緩和する(たとえば、影響を受ける関数に信頼できない入力を渡さない)という選択肢があり、アドバイザリの更新を注視します。変更後は再スキャンしてください。