ラボまとめコラムニュース
ブログ/記事一覧/【無料】OSS脆弱性スキャナー|npm/Pythonの依存を貼るだけ即チェック
oss-supply-chain-scanner-cover-ja

【無料】OSS脆弱性スキャナー|npm/Pythonの依存を貼るだけ即チェック

package.jsonやrequirements.txtを貼り付けるだけで、npmやPyPIの依存ライブラリにOSSサプライチェーン攻撃の影響がないかをOSV.devで10秒で確認できる無料ツールです。pyproject.tomlにも対応、ブラウザだけで完結、アカウント登録不要、axiosやLiteLLM汚染の確認にも使えます。

ラボ 本日更新
avatar-m-1

堀川 慎

Backend Engineer / AWS / Django

2026.05.276 min8 views
この記事のポイント

package.jsonやrequirements.txtを貼り付けるだけで、npmやPyPIの依存ライブラリにOSSサプライチェーン攻撃の影響がないかをOSV.devで10秒で確認できる無料ツールです。pyproject.tomlにも対応、ブラウザだけで完結、アカウント登録不要、axiosやLiteLLM汚染の確認にも使えます。

依存関係を貼って10秒、脆弱性が混じっていないかを判定するブラウザ完結スキャナー

package.jsonrequirements.txtpyproject.tomlのいずれかを下のテキストエリアに貼り付けて「スキャン」を押すと、依存している外部ライブラリに既知の脆弱性が残っていないかをその場で判定します。アカウント登録もインストールも不要、ブラウザだけで動きます。

作った動機はこの半年の事件です。axios(週間1億DL)の汚染LiteLLMの乗っ取りTrivyから連鎖した4OSSの陥落GlassWormによる不可視マルウェアと、OSSサプライチェーン攻撃が日常風景になりました。「うちのプロジェクトは大丈夫か」を、CLIを叩かずに10秒で確認したくて作ったのが本ツールです。

サンプル3種類は「npm」「pip」「Poetry」のボタンから読み込めます。手元のファイルがなくても挙動だけ確認できます。

OSSサプライチェーン汚染スキャナー

入力例:

データソース: OSV.dev(Google・CC BY 4.0)/検索結果はクライアント側で実行され、貼り付けた内容はOSV.dev以外には送信されません。

そもそも何をやっているのか——出てきた用語のおさらい

スキャナーを触ってみて「結果に出てくるCVEとかGHSAとかOSVって何?」「package.jsonに書いてある依存関係って結局なに?」と思った方向けに、この記事に出てくる主な用語を一段下のレベルで整理しておきます。普段からCIにスキャナーを組み込んで使っているエンジニアは、この節は読み飛ばしても問題ありません。

用語ひとことでもう一段詳しく
依存関係
(dependencies)
自分のプロジェクトが動くために
借りている他人の部品
Webアプリ1本に数十〜数千個のライブラリが
連なるのが普通。
本ツールは「直接借りている部品」だけを見る
package.jsonNode.js / npm プロジェクトの
依存リスト
「うちはこのライブラリのこのバージョンを
使います」と書いてある JSON ファイル
requirements.txtPython / pip プロジェクトの
依存リスト
pip install -r requirements.txt
まとめて入れるための一覧
pyproject.tomlPython の新しい依存リスト形式
(Poetry / uv / Rye)
requirements.txt の現代版。
PEP 621 という規格に沿って、
1ファイルでプロジェクト全体を記述する
CVE世界共通の
「脆弱性の通し番号」
Common Vulnerabilities and Exposures。
例: CVE-2026-8832
米MITRE 社が中心となり全世界で運用
GHSAGitHub が独自に発行する
脆弱性アドバイザリ
GitHub Security Advisory。
例: GHSA-xxxx-xxxx-xxxx
npm / PyPI 等のパッケージに密着しており、
CVE が振られる前にこちらが先行する事もある
OSV複数の脆弱性情報を
束ねた巨大データベース
Open Source Vulnerability。
Google が中心、GitHub・PyPA・Rust Foundation
等のデータを統合。
本ツールはここに問い合わせている
SemVerバージョン番号の付け方の
世界共通ルール
Semantic Versioning。
1.2.3 = メジャー.マイナー.パッチ。
^1.2.3 は「1系のうち最新を取る」の意味
サプライチェーン
攻撃
借りている部品の中身が
こっそり書き換えられる攻撃
数百万〜数億 DL のライブラリが
毒入りバージョンを公開する事件。
世界中のプロジェクトが
一斉に汚染される

ひと続きの流れに直すと、「自分のプロジェクトが借りている部品(依存関係)の一覧(package.json 等)を見て、それぞれの部品に振られたセキュリティの傷の番号(CVE / GHSA)が、巨大な傷リスト(OSV)に登録されていないか照合する」のがこのスキャナーの仕事です。サプライチェーン攻撃は、その「借りている部品」自体に毒を入れる手口。家の鍵を作る業者ごと買収されてしまうイメージです。

普段からCIに npm auditTrivy を組み込んでいるチームは、この処理が裏で常時走っているわけで、本ツールはその「裏で動いている処理」を、ブラウザで1回だけ手動で叩いてみる窓口と捉えるとイメージが合います。

なぜブラウザ完結にこだわったか

同じことをするツールはすでに山ほどあります。npm auditpip-auditTrivy、Snyk、Dependabot。本職のエンジニアならどれかしらをCIに組み込んでいるはずです。

それでも、実務でこの種のツールが欲しくなるのは、CIに組み込まれた監視とは別の文脈です。

  • 取引先から受け取ったpackage.jsonの中身を、PRレビュー前にざっと見たい
  • OSSサプライチェーン攻撃のニュースを見た直後、社内Slackで「うちのプロダクト大丈夫?」と聞かれたとき
  • GitHubで気になったライブラリのリポジトリを見つけて、依存の健康診断だけ先にやりたい
  • 非エンジニアの上司や、業務委託のフリーランスが書いたコードをチェックしたい

どれも「ローカルにツールを入れるほどじゃない」「VPN・社内プロキシでCLIが弾かれる」「権限がない」という、軽い摩擦のあるシーンです。ブラウザに貼って押すだけ、にしておけば10秒で済みます。

もうひとつの理由は、本サイトで書いてきた個別の攻撃事件と紐付けたかったからです。axios・LiteLLM・Trivy・GlassWorm・TeamPCPと、過去記事は単体で読んでも事件のあらすじしか分かりません。「で、自分はどうチェックするのか」の出口がなかった。このツールがその出口になります。

裏側の仕組み——全部ブラウザの中で動いている

このツールにはサーバーがありません。HTMLとJavaScriptだけで構成されており、貼り付けた内容はOSV.dev の公開APIに直接送られて、その結果がブラウザ側で整形されます。Google・GitHub・PyPA・Rust Foundationなどが運営する脆弱性データベースで、認証不要・CORS対応済み・1リクエスト最大1,000パッケージまで投げられます。

処理の流れはこの4ステップです。

ステップ処理内容使っているもの
① 形式判定{ で始まれば npm、[project] 等を含めば Poetry、
それ以外は requirements.txt と判定
自前のヒューリスティック
② 依存抽出JSON.parse / TOMLパース /
1行ずつ正規表現
smol-toml
③ バージョン正規化^1.7.7>=2.0.0,<3
「最低互換バージョン」に変換
semver
④ 脆弱性突合OSV.dev の /v1/querybatch
全依存を1リクエストで投げる
fetch API

③のバージョン正規化が、実装でいちばん厄介でした。^1.7.7 のような範囲指定はOSV.devが受け付けないので、こちらで具体的なバージョン番号に変換する必要があります。SemVer範囲の「最低互換バージョン」を取れる関数semver.minVersion()を使って、安全側に倒して問い合わせています。

結果として、たとえば"axios": "^1.7.7"と書いてあっても「1.7.7 として」問い合わせます。実際にインストールされたバージョン(1.7.9とか1.8.2)と微妙にズレますが、ロックファイルなしでも最低限の警告は出せます。ロックファイル(package-lock.jsonpoetry.lock等)を見ない範囲では、これが落とし所だと判断しました。

突合本体のコードはこの程度の短さです(全コードはツール本体のHTMLソースに含まれています)。

// 依存関係を OSV.dev に1リクエストで投げる
const queries = deps.map(d => ({
  package: { name: d.name, ecosystem: d.ecosystem }, // npm / PyPI
  version: d.resolvedVersion,                         // semver.minVersion() で正規化済み
}));

const res = await fetch("https://api.osv.dev/v1/querybatch", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ queries }),
});
const { results } = await res.json();
// results[i] が deps[i] に対応。vulns 配列が空でなければ脆弱性あり。

バックエンドAPIを立てていないのは、コストもあるのですが、それ以上に「貼り付けた内容をこちらのサーバーに送る必要がない」点が大きい。プロプライエタリな社内コードのpackage.jsonでも、OSV.devを経由する以外はどこにも保存されません。データソースの透明性をそのまま使えるのがOSV.dev経由の利点です。

対応している入力形式の細かい話

package.json(npm / yarn / pnpm 共通)

dependenciesdevDependenciesoptionalDependenciespeerDependenciesを全て拾います。workspaces(ローカル参照)とnpm:プレフィックス(パッケージエイリアス)は除外。git+ssh://等のVCS指定もスキップします。

requirements.txt(pip / pip-tools / pipenv-lock経由のexport)

== >= ~= != を解釈します。同一行の複数指定(django>=4.0,<5.0)はカンマで分割して最低バージョンを採用。-r(他ファイル参照)、-e(編集可能インストール)、--index-url等のオプション行はスキップ。コメント行(# 始まり)も無視します。

pyproject.toml(Poetry / uv / Rye / PEP 621)

2つの書式が混在しているのが厄介で、両方サポートしました。

  • PEP 621標準(uv / Rye / Hatch等): [project].dependencies 配列と [project.optional-dependencies]。中身は"requests>=2.28.0"のようなPEP 508文字列。
  • Poetry形式: [tool.poetry.dependencies] オブジェクトと [tool.poetry.group.*.dependencies]。値はSemVer風文字列("^2.28.0")または { version = "...", extras = [...] } のテーブル形式。

TOMLパーサには軽量なsmol-tomlを採用しました。pythonキーや、{path = "..."}{git = "..."}のローカル/VCS参照は突合対象外として除外しています。

このツールではわからないこと

使いどころを誤ると過信に繋がるので、見えていない範囲を先に並べておきます。

  • ? 推移的依存(依存の依存)は見えません。トップレベルの依存だけが対象です。package-lock.jsonpoetry.lockを貼れば全依存をスキャンできますが、本ツールはサイズが軽い宣言ファイルだけを想定しています
  • ? ロックファイルなしのバージョンは最低互換版で評価しています。実際にインストールされたバージョンとは微妙にズレます。0day直撃の判定には使えないと考えてください
  • ? 未公開の脆弱性は当然出ません。OSV.devに登録されてから反映されるまでにはタイムラグがあります
  • ? マルウェア混入そのものは検知できません。汚染パッケージにCVEやGHSAが振られていればヒットしますが、サプライチェーン攻撃の初動24時間は無防備です。GlassWormのような不可視マルウェアも対象外です

本格的にやるなら、CIにnpm auditTrivyを組み込み、SBOM運用とロックファイルのコミットを徹底するのが筋です。このツールはあくまで「貼って10秒で雰囲気をつかむ」用途と割り切ってください。

2025〜2026年のサプライチェーン攻撃事例

本サイトで追ってきた直近の攻撃事例を時系列で並べておきます。各事件の検知方法や影響範囲は、それぞれの記事に書いています。

時期事件影響規模関連記事
2026-05axios汚染(npm)週間1億DL
パッケージにRAT
axios記事
2026-04Trivy連鎖攻撃10日で4OSSが陥落
守る側のツールが破られた
Trivy連鎖Trivy3度目
2026-04Telnyx PyPI侵害WAVファイルに
マルウェアを隠す手口
Telnyx記事
2025-12LiteLLM乗っ取り月間9,500万DL
Python起動だけで感染
LiteLLM乗っ取り.pth追跡
2025-10GlassWorm見えない文字で
マルウェアを隠す手口
GlassWorm記事

パターンは毎回違いますが、起点は同じです。「信頼しているパッケージのバージョンを上げたら、いつの間にか別の人が中身を書き換えていた」。普段触らない依存ファイルを定期的に確認する習慣がそのまま防衛線になります。

追加してほしい機能・要望

現状の優先実装は「3形式のテキスト貼り付け」までで、以下は次の更新で考えています。

  • package-lock.jsonpoetry.lock対応(推移的依存も含めたスキャン)
  • Gemfile / Cargo.toml / go.mod対応
  • GitHub URL貼り付けでリポジトリ直接スキャン(CORS対応の関係でAPIプロキシが必要)

必要そうなものがあれば、本記事のコメントやお問い合わせから教えてもらえると、優先度を組み替えます。

参照元・ライセンス

  • 脆弱性データ: OSV.dev(運営: Google、GitHub Security Advisory・PyPA・Rust Foundation等のソースを統合、CC BY 4.0
  • API仕様: OSV API Documentation
  • SemVer解釈ライブラリ: node-semver(npm Inc., ISCライセンス)
  • TOMLパーサ: smol-toml(Cynthia Rey, BSD-3-Clauseライセンス)
  • 外部CDN: esm.sh (ESMモジュール配信)

OSV.devの脆弱性メタデータはCC BY 4.0の下に再配布されています。本ツールはOSV.dev/Googleの提供サービスではなく、本サイトが独立に提供するクライアントです。