reachvuln について
reachvulnは、コードからの到達可能性に基づいて脆弱性レポートを並べ替えるローカルツールです。開発者向けに、指定されたインポート関係とエントリーポイントを分析し、明示的な深刻度の重みと到達性の係数で評価します。
主な機能
- 01インポートグラフから到達性を算出
- 02脆弱なパッケージのエクスポートを照合
- 03到達性で検出項目を分類
- 04固定ルールで検出項目を順位付け
- 05入力を検証し件数を返却
活用シーン
- 01スキャナーの検出項目の修正順を決定
- 02アプリのエントリーポイントから到達可能な項目を特定
- 03未使用パッケージと到達可能な脆弱性を区別
- 04指定されたモジュール情報で脆弱性を順位付け
MCP 対応
MCPクライアントにrank_vulns_by_reachツールを提供します。脆弱性の検出結果、モジュールのインポート、エントリーポイントを受け取り、順位付け結果と到達性の件数を返します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 1 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| modules | array | はい | モジュールとそのインポート:{path, imports} |
| entry_points | array | はい | エントリーポイントとなるモジュールパス |
| vulnerabilities | array | はい | 検出結果:{id, package, severity, vulnerable_exports} |
詳細
reachvuln
脆弱性スキャナーのレポートに指摘事項が200件あっても、それは対応リストにはなりません。そのパッケージの大半は、コードから一度も読み込まれない可能性があります。実際に読み込まれるパッケージでも、脆弱性のあるエクスポートをインポートしているとは限りません。reachvuln は、レポートをこの問いに沿って並べ替えます。指摘事項、モジュールとそのインポート、エントリーポイントが与えられたとき、実際に到達可能な指摘事項はどれでしょうか?
到達可能性は、与えられたインポートグラフに基づいて計算されます。package が別のモジュールの path と一致するインポートはローカルエッジで、それ以外は外部パッケージのインポートです。到達可能なモジュールは、エントリーポイントと、ローカルエッジをたどってそこから到達できるすべてのモジュールです。幅優先で探索し、循環にも安全に対処するため、循環インポートの連鎖が無限にループすることも、その先にあるものを見落とすこともありません。
到達可能なモジュールのいずれかがそのパッケージをインポートし、かつ指摘事項に vulnerable_exports の指定がない(そのパッケージをインポートすれば該当)か、そのインポートの names に vulnerable_exports と少なくとも1つ共通する項目がある場合、指摘事項は到達可能です。いずれかのモジュールがそのパッケージをインポートしているものの、到達可能の条件を満たさない場合は imported_unreachable です。つまり、そのパッケージはツリー内にありますが、到達可能なモジュールのいずれも脆弱性のあるエクスポートに触れる形でインポートしていません。どのモジュールもそのパッケージをインポートしていない場合は not_imported です。到達可能な指摘事項では、reached_via に条件を満たす到達可能なモジュールのパスを重複なくソートして列挙します。それ以外の場合は空になります。
順位付けは固定された算術に基づいており、ヒューリスティックではありません。重大度の重みは critical が40、high が30、medium が20、low が10です。到達可能な指摘事項では重みに3を掛け、インポート済みだが到達不能な指摘事項では1を掛け、未インポートの指摘事項では0を掛けます。指摘事項は、ランクスコアの降順、重大度の重みの降順、id の昇順で並びます。また、結果には3つの分類それぞれの件数も含まれます。
検証は厳格で、問題のあるパスを示します。vulnerabilities、modules、entry_points が欠けている、または型が正しくない場合、指摘事項の id が欠けている、空である、または重複している場合、package が欠けている、または空の場合、severity が列挙型の範囲外の場合、あるいは vulnerable_exports の型が正しくない場合が該当します。また、モジュールの path が欠けている、空である、または重複している場合、imports が欠けている場合、インポートの package または names が正しくない場合、エントリーポイントがモジュールのパスのいずれでもない場合も該当します。インポートの names の項目は空文字列でも構いません。その場合、脆弱性のあるエクスポートと一致することはありません。脆弱性のあるエクスポート自体は空であってはなりません。不明な追加フィールドは無視され、入力が無効な場合は部分的な結果を返しません。計算は純粋かつローカルで行われ、ネットワークも設定もリポジトリも読み込みません。
CLI
npx @reneturcios/reachvuln rank --input args.json
npx @reneturcios/reachvuln --version
args.json には引数オブジェクト全体を記述します。
{
"vulnerabilities": [
{
"id": "CVE-1",
"package": "lodash",
"severity": "high",
"vulnerable_exports": ["merge"]
}
],
"modules": [
{
"path": "src/app.ts",
"imports": [{ "package": "lodash", "names": ["merge"] }]
}
],
"entry_points": ["src/app.ts"]
}
結果は JSON として出力されます。
{
"ranked": [
{
"id": "CVE-1",
"package": "lodash",
"severity": "high",
"reachability": "reachable",
"rank_score": 90,
"reached_via": ["src/app.ts"]
}
],
"counts": {
"reachable": 1,
"imported_unreachable": 0,
"not_imported": 0
}
}
終了コード:成功時は 0、実行時エラー(読み取り不能または無効な入力ファイル、無効な入力を含む)では 1、使用方法のエラーでは 2 です。
MCP サーバー
npx -y @reneturcios/reachvuln mcp
MCP クライアントの設定:
{
"mcpServers": {
"reachvuln": {
"command": "npx",
"args": ["-y", "@reneturcios/reachvuln", "mcp"]
}
}
}
ツール
-
rank_vulns_by_reach— 脆弱なパッケージとエクスポートがエントリポイントから到達可能かどうかに基づいて、脆弱性の検出結果を順位付けします。vulnerabilities(配列、必須、空でも可)— 各検出結果は{id, package, severity, vulnerable_exports}です。idは空でない一意の文字列、packageは空でない文字列、severityはcritical、high、medium、lowのいずれかです。vulnerable_exportsは空でない文字列の任意の配列で、デフォルトは[]です。modules(配列、必須、空でも可)— 各モジュールは{path, imports}です。pathは空でない一意の文字列、importsは{package, names}の配列です。packageは空でない文字列、namesは必須の文字列配列です(要素は空でもかまいません)。entry_points(配列、必須、空でも可)— エントリポイントとなるモジュールパスです。各要素は、いずれかのモジュールのpathと一致する必要があります。
{ranked, counts}を返します。各順位項目は、固定された順序で{id, package, severity, reachability, rank_score, reached_via}となり、countsは{reachable, imported_unreachable, not_imported}となります。
Docker
docker run -i ghcr.io/cloudcorprecords/reachvuln
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/reachvuln rank --input /w/args.json
開発
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts (pure local, no network)
npm run dev # run the CLI from source
ライセンス
MIT — Copyright (c) 2026 Rene Turcios
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。