OSV で依存関係の脆弱性をチェック

マニフェストやロックファイルを読み込むと、記載されたパッケージ名・バージョン・エコシステムを OSV に問い合わせ、返されたアドバイザリを深刻度と修正版とともに表に表示します。ロックファイルは解決済みのバージョンを使い、マニフェストの範囲は宣言された最も低いバージョンで確認します。

·

    マニフェストやロックファイルを OSV で確認する手順

    マニフェストまたはロックファイルを読み込んで[依存関係をスキャン]を押すと、読み取れたパッケージ名・バージョン・エコシステムが OSV API に問い合わせされ、返されたアドバイザリが深刻度と修正版とともに表に並びます。解析はページ内で行われ、送信されるのはパッケージ名・バージョン・エコシステムだけです。

    実測: 依存関係 8 件の package.json は 13 件の検出結果を返し、requirements.txt は 5 パッケージで 107 件、express 5.1.0・minimist 1.2.8・chalk 5.3.0 を記したマニフェストは 0 件でした。

    1. マニフェストやロックファイルをドロップするか、テキストを貼り付けます: package.json、package-lock.json、yarn.lock、pnpm-lock.yaml、requirements.txt、pom.xml、CycloneDX の bom.json、「npm lodash 4.17.15」のような行。
    2. [依存関係をスキャン]を押します。OSV API への問い合わせ中はステータス行に進捗が出ます。
    3. 指標を確認します: 確認したパッケージ数、検出結果の件数、問い合わせたエコシステム。
    4. 指標の下に注記が出たら読みます: 最も低い宣言バージョンで確認した範囲の件数、バージョンとして読めなかった行数、100 パッケージの上限で外れた件数。
    5. 次のファイルの前に[クリア]を押します。入力欄・表・指標が空になります。

    読み取るファイル、問い合わせる内容、結果が空のときの意味

    読み取るファイル

    npm は package.json(dependencies と devDependencies)と 3 種類のロックファイル(package-lock v1/v2/v3、yarn.lock、pnpm-lock.yaml)、PyPI は requirements.txt、Maven は pom.xml(範囲指定を含む)、CycloneDX の bom.json は npm・PyPI・Maven・NuGet・Go・crates.io を対象にします。「npm lodash 4.17.15」のような行も読み取ります。実際にインストールされる版が入るロックファイルのほうが正確な入力です。

    読み取れない入力は例外ではなく一文で返ります: プレーンテキスト、壊れた JSON、@ でつないだ行はいずれも「バージョン付きの依存関係が見つかりませんでした」と表示し、表は空のままでした。

    何を問い合わせるか

    範囲は宣言された最も低いバージョンで問い合わせます。Django>=2.2,<3.0 は 2.2、Maven の [4.3.0,4.3.30] は 4.3.0 です。Version 列は問い合わせた値ではなくマニフェストの原文(「>=2.2」「[4.3.0,4.3.30]」)を表示するので、元のファイルと見比べられます。

    レジストリのバージョンとして読めない行は除外され、注記に件数が出ます: タグ付き git URL、file:、workspace:*、latest、*、pom の ${property} 参照、purl のない CycloneDX コンポーネントなどです。問い合わせは最大 100 パッケージで、120 件のマニフェストはちょうど 100 件を送り、その旨を指標の下に表示しました。

    結果の読み方

    1 行が 1 件のアドバイザリです: パッケージ、確認したバージョン、アドバイザリの ID と概要、深刻度、修正版。以前は詳細の取得が 40 件までで、それ以降の行は深刻度が Unknown、修正版が「—」のままでした。83 件のアドバイザリを持つマニフェストでは 83 件すべてを取得し、各行に深刻度と、そのパッケージについて OSV が示す修正版が入っています。

    検出結果が 0 でも安全という意味ではありません: その後に公開されたアドバイザリは含まれず、範囲を最も低いバージョンで確認した場合、残りの範囲は未確認のままです。OSV API に接続できないときは空の結果ではなくその旨を表示し、HTTP 503 は 503 として報告します。アドバイザリは 6 件ずつ、1 件あたり 20 秒の制限で取得するため、接続が止まってもスキャンが回り続けることはなく、該当行は深刻度 Unknown で返ります。

    最近使ったツール: