Formidable Auditor's Dependency Checker
別名 Fuckin' Autonomous Dependency Checker
fad-checker は、あらゆるソースツリー内の Maven · Gradle · npm · Yarn · pnpm · Composer · PyPI · NuGet · Go · Ruby、ベンダリングされた JavaScript、コミットされたネイティブバイナリ、および暗号資材(証明書と秘密鍵/公開鍵)を監査します。マルチモジュール、モノレポ、ポリグロットに対応し、自己完結型の HTML + Word レポート(EPSS + CISA KEV で優先順位付けされた CVE、EOL、廃止、古い、ライセンス)と CycloneDX SBOM / CSAF VEX / SARIF / JSON エクスポートを生成します。ビルドツール、Docker、ネットワークは不要で、ロックファイルとマニフェストをディスクから直接読み取ります。

mvn/gradle/npm install/pip/dotnet restore/go build は不要で、node_modules/ も不要です。Maven グラフは Maven が解決する方法で解決されます。→ 方法--offline 下で ネットワークゼロ、回帰テスト済みで unshare -rn 下で再現可能。Maven では、ネットワークインターフェースがまったくない状態で OSV-Scanner の 結果の を回復し、他のツールは 45 / 40 / 37 です。→ · 📖 使用方法とすべてのフラグ · アーキテクチャ · 他のツールとの比較 · データソース
他のツールがやらないことを監査のために行います。同じ列セットとソース規律は
docs/COMPARISON.md と同じです — ⚠️ は 部分的 であり、その方法を示します。セルは検証可能であることを意図しています。
¹ mvn/go/npm/pip/dotnet なし — マニフェストはディスクから解析され、何もインストールまたは実行されません。1 回のパスで 105 × pom.xml:790 ペア vs OSV-Scanner の 657、133 は fad のみ、バージョンは モジュールごと に仲介され、フラット化されません。
² unshare -rn 下で、OSV-Scanner の オンライン Maven 結果の 657/657 — ネットワークインターフェースなし。トリップワイヤーテスト済み。公開座標のみがエンクレーブを離れます。
³ 第 0 章は、すべての 設定されたレジストリが 404 を返したすべての座標を列挙します — Maven、npm、PyPI、NuGet、Composer、Go、RubyGems — それを宣言するマニフェストとともに。タイムアウトまたはエラーになったレジストリは決してカウントされません。決定的でない回答は、プロキシが不安定だったためにクライアントが内部パッケージを出荷していると非難することになるからです。-e <regex> でそれらを除外します。
⁴ -t <dir>:正規化された POM とすべての非 Maven ロックファイルがミラーリングされ、プライベート座標は削除されます。アーカイブ可能で、何でもスキャン可能 — --snyk を含む。
⁵ endoflife.date、直接 vs 推移的 に分割されているので、どの依存関係を上げるべきかがわかります。さらに非推奨 / 放棄 / ヤンク済みおよび古いもの。Trivy は OS ディストロのみをカバーし、Snyk のパッケージヘルスは Web のみです。
⁶ インベントリ および 判定:有効期限、RSA<2048、MD5/SHA1、自己署名。秘密鍵 vs 公開鍵。JKS/PKCS#12。オフラインパーサー。Trivy のシークレットルールはファイルを見つけますが、欠陥は見つけません。
⁷ deps.dev + CIRCL を介して ハッシュ で識別 → 宣言されるべき / 名前≠チェックサム / 不明 / 悪意。Syft のパターンはバージョンに名前を付けますが、アイデンティティではありません。
⁸ 第 0 章は この スキャンが到達できなかったものをフラグします(欠落しているロックファイル、BOM のみのバージョン、Yarn Berry、決定不能な PHP ランタイム)。第 6.3 章はツールが決して評価しないものを述べています。他の場所では、前者は監査が決して見ないログ行であり、後者は書き留められていません。
⁹ 来歴マニフェスト:13 のソースすべて のツール、ランタイム、モード、実行構成、キャッシュの鮮度。Grype と Dependency-Check は 1 つのソースの日付を運びますが、実行ではありません。
¹⁰ エグゼクティブサマリーと修正レシピ付きの第 0 章→6 章、自己完結型 HTML と Word .doc の双子。他のどれも Word を出力しません。
¹¹ 4 つのインライン SVG チャート — 最悪の重大度による CWE、ルート依存関係ごとの脆弱な推移的依存関係、最も脆弱なモジュール(単一モジュールプロジェクトでは直接 vs 推移的)、修正優先度バンド — .doc でもレンダリングされ、PNG としてのワンクリックコピー(またはリッチ HTML としてのテーブル)が Word にフォーマットされて貼り付けられます。すべての CVE は、ドリルダウンの背後に CVSS ベクター、CWE、参照、CPE 構成、via-path を保持し、外部アセットはゼロです。
¹² --baseline は Δ 章(新規 / 修正済み / 変更なし)を追加します。--fail-on-new は新規の検出事項のみでゲートします。Snyk はこれをローカル差分ではなく、そのプラットフォームで追跡します。
負けるところ — コンテナ/OS パッケージ、自動修正 PR、および Snyk のキュレーションされたフィードに対する CVE カバレッジ → docs/COMPARISON.md ·
ギャップ、測定済み。
意図的に目標としないもの:到達可能性。 検出事項は依存関係グラフ上の脆弱なバージョンであり、レポートは呼び出しパスを推測するのではなく、まさにそう述べています(第 6.3 章)。脆弱なコードが この アプリケーションで到達可能かどうかを判断するのは監査者の役割であり、どのスキャナーも持たないアプリケーションコンテキストで行われます。
[!WARNING] fad-checker は新しく、(まれな)バグがまだ含まれている可能性があります。その出力を強力なファーストパスとして扱い、重要なものはすべて再確認 し、問題を報告してください。すぐに修正されます。
npm install -g fad-checker fad-checker -s ./my-project # → ./fad-checker-report/cve-report.html
無料の [NVD API key](https://nvd.nist.gov/developers/request-an-api-key)(即時取得可能)を使うと、エンリッチメントが10倍高速になります: `fad-checker --set-nvd-key YOUR_KEY`。よく使う実行例をいくつか示します。全リストは `fad-checker --help` または [docs/USAGE.md](https://github.com/9pings/fad-checker/blob/main/docs/USAGE.md) を参照してください:```bash
fad-checker -s ./proj -e "^com\.acme\." # exclude private libs (coord regex)
fad-checker -s ./proj -t ../clean -e "^com\.acme\." # extract only: normalised descriptors, private modules flagged
fad-checker -s ./proj -t ../clean -e "^com\.acme\." -a snyk # same extraction + scan + merge Snyk
fad-checker -s ./proj --offline # fully offline (zero network, needs a warmed cache)
fad-checker -s ./proj -a osv-db,typosquat # offline-complete OSV + typosquat
fad-checker -s ./proj -a licenses --fail-on high # license chapter + CI gate
fad-checker -s ./proj --report-json --baseline last.json --fail-on-new # differential audit: fail CI on NEW findings
fad-checker diff last.json this.json # standalone diff of two findings JSONs
-t <dir> が実際に行うこと。 これは 抽出 ステップであり、Snyk アダプターではありません。これは 正規化された依存関係記述子 の並列ツリーを書き出します。すべての pom.xml は依存関係に関連するノード(座標、properties、dependencyManagement、dependencies、modules)に縮約され、リアクター親は実際のツリー内 relativePath に再配線され、${…} は座標内で解決されます — さらにすべての非 Maven ロックファイル/マニフェストが同じ相対パスにミラーリングされます(package-lock/yarn.lock/pnpm-lock、composer.lock、poetry/Pipfile//、/、/、、および や のようなコンパニオン)。オンラインでは、し、そこに存在しないもの — つまり — を報告します。その後 が書き換えられた POM からそれらを除去します。そして :、、、または も渡さない限り、CVE/EOL パスもレポートもありません。得られるものは、ビルド不要でサニタイズされた依存関係インベントリであり、監査証拠としてアーカイブしたり、クライアントや法務レビューに渡したり、任意のスキャナーに向けたりできます — 経由の Snyk もその一つです。
[!IMPORTANT]
--offlineはキャッシュを読み取るのであって、置き換えるものではありません。 コールド キャッシュには照合するものが何もないため、オフラインの初回実行が 0 CVE / 0 EOL / 0 outdated を報告するのは正当です。それは空のキャッシュであり、クリーンなプロジェクトではありません。一度ウォームアップし(任意のプロジェクトでの通常のオンライン実行、または--import-cache)、その後--offlineがネットワーク呼び出しゼロで完全な結果セットを返します。エアギャップ環境のマシンは--export-cache/--import-cache経由でキャッシュを取得します。
単一の自己完結型バイナリ(Node 不要)、ソースからのインストール、シェル補完については → docs/USAGE.md を参照してください。
レポートは ルートチャプター(それぞれ関連するサブチャプターをグループ化)に整理されています:
HTML レポートは任意のブラウザで開くことができ、すべての詳細(CVSS ベクター、参照、完全な説明、CPE 設定、推移的依存の via-path)を含み、Word 互換の .doc ツインも同梱されています。すべてのマッチには 複合優先度(KEV 悪用済み > EPSS 可能性 > CVSS 深刻度)が付与され、実行はさらに CycloneDX 1.6 SBOM(--report-sbom、脆弱性をインライン)と CSAF 2.0 VEX(--report-csaf)を下流ツール向けに出力できます。

どのツールもすべてを見つけることはできません。fad-checker は 908 ペアのユニオンのうち 87% でリードし、131 ペアは Snyk から返され、fad-checker からは返されませんでした。OSV に対して 1 つずつ裁定した結果、いずれもリコールバグではありません:
3 分の 2 が公開記録と矛盾しているため、それらを報告することは誤検出を出荷することを意味します。CVE-2023-6481 が明確な例です:[email protected] で主張されていますが、logback-core の [1.2.12, 1.2.13) にバインドしています — 誤ったアーティファクトであり、その脆弱性が存在する前に公開されたバージョンです。
スコープ。 131 件すべてが Snyk のものです:OSV-Scanner、Trivy、Grype+Syft はそれぞれ、他に誰も持っていない 0 件の検出事項しか提供しませんでした。そしてすべてが Maven ターゲット上にあります — Maven 以外ではグラフはロックファイル内にあり、すべてのスキャナーが同じ入力を読み取り、ベンチマークは npm、RubyGems、Composer で同一の検出セットを測定します。
だからこそ --snyk が存在します。 fad-checker は snyk test の出力を 入力 として受け取りマージするので、どちらかを選ぶのではなくユニオンを得られます。修正ではなく、カバレッジの選択です。
方法、注意事項、ペアごとの判定 → docs/BENCHMARK.md;scripts/adjudicate-gap.js で再現できます。
ゼロデータ送信保証。
--offlineの下で、fad-checker は 一切のネットワーク呼び出しを行いません;ウォームアップされた~/.fad-checker/キャッシュのみを読み取り、依存関係、パス、検出事項をマシン外に送信することはありません。これは回帰テストされており(test/offline-guarantee.test.js、触れられるとスローするトリップワイヤフェッチャー)、監査者が再現可能です:unshare -rn node fad-checker.js -s ./proj --offline …は ネットワークインターフェースのない 名前空間で実行し、バイト単位で同一の検出事項を生成します。主流の OSS スキャナーとは異なり、fad は Maven 推移的グラフ もオフラインで解決します;したがってエアギャップのマルチモジュールプロジェクトでは、それらが見つけられない推移的 CVE を見つけます。
監査対象システムが オフライン / 機密(規制対象またはエアギャップ監査に典型的)の場合、OSV / NVD / Maven Central / npm に到達できません。環境情報を一切 セキュアエンクレーブ外に出さずに、作業をマシン間で分割します:匿名化された記述子は 公開パッケージ座標 のみを運びます;ファイルシステムパス、レジストリ URL、ホスト名/ユーザー名は含まれません;そして 詳細レポートはオフラインのマシン上で生成されます。
転送は fad-checker のキャッシュの特性に依存します:それらは 座標 または 脆弱性 ID でキー付けされ、パスでは決してないため、マシン非依存 です。オンラインステップは単に キャッシュをウォームアップ するだけです;オフラインステップはスキャンを再生し、キャッシュヒットを得ます。```bash
fad-checker -s ./proj -e "^(client|internal)." --export-anonymized deps.json
fad-checker --import-anonymized deps.json # scans coordinates → OSV/NVD/CVE/registry/EOL + retire signatures fad-checker --export-cache fad-cache.tar.gz # bundle the warmed ~/.fad-checker/
fad-checker --import-cache fad-cache.tar.gz # merged into the enclave's own cache fad-checker -s ./proj --offline # re-collect locally (real paths) + cache hits
ディスクリプタ(`fad-deps/1`)が保持するものと破棄するもの:
| 保持(スキャンに必要) | 破棄(環境) |
| --- | --- |
| ecosystem, ecosystemType | manifest パス / pom パス |
| namespace, name | 解決済みレジストリ URL |
| version, versions | 整合性ハッシュ |
| scope, isDev | 親チェーン、lockfile タイプ |
オンラインフェーズのレポート自体はパスを含まない。ベンダリングされた JavaScript(retire.js)の検出結果は、retire が実際の `.js` ファイルを必要とするため、**フェーズ 3 でオフラインで**生成される。そのシグネチャ DB はオンライン(フェーズ 2)でウォームアップされ、`--export-cache` によって持ち運ばれる。完全なオフライン/キャッシュ制御 → [`docs/USAGE.md`](https://github.com/9pings/fad-checker/blob/main/docs/USAGE.md)。
## ドキュメント
- [`docs/USAGE.md`](https://github.com/9pings/fad-checker/blob/main/docs/USAGE.md); すべてのフラグとワークフロー: オフライン/キャッシュ制御、プライベートレジストリ、設定ファイル、レシピ、セーフティレール。
- [`docs/ARCHITECTURE.md`](https://github.com/9pings/fad-checker/blob/main/docs/ARCHITECTURE.md); 内部構造: コーデック、収集、マッチング、レポートパイプライン。
- [`docs/COMPARISON.md`](https://github.com/9pings/fad-checker/blob/main/docs/COMPARISON.md); OSV-Scanner / Trivy / Grype / OWASP DC / Snyk との比較、およびビルド不要をどう維持しているか。
- [`docs/BENCHMARK.md`](https://github.com/9pings/fad-checker/blob/main/docs/BENCHMARK.md) — 公開 105 モジュールプロジェクトにおける OSV-Scanner との再現可能なエアギャップ・リコールベンチマーク。
- [`docs/DATA-SOURCES.md`](https://github.com/9pings/fad-checker/blob/main/docs/DATA-SOURCES.md); fad-checker が使用する公開データセットとそのライセンス。
- [`docs/SPEC-audit-pro.md`](https://github.com/9pings/fad-checker/blob/main/docs/SPEC-audit-pro.md); 監査グレードの機能(プロベナンス、差分監査、方法論/完全性)と、それぞれがそのように作られた理由。
- [`CHANGELOG.md`](https://github.com/9pings/fad-checker/blob/main/CHANGELOG.md) · [`CLAUDE.md`](https://github.com/9pings/fad-checker/blob/main/CLAUDE.md); リリース履歴 · コントリビューター向けのコードレベルの手引き。
## コントリビューション
若いスキャナにとって最も有用な貢献は、**どこが間違っているかを伝えること**です。実際のプロジェクトで実行し、その座標と、それを引き起こした manifest のスニペットを添えて[偽陽性/偽陰性レポート](https://github.com/9pings/fad-checker/issues/new?template=false_positive.yml)を提出してください。開発環境のセットアップ、基本ルール、コーデック拡張ポイント → [`CONTRIBUTING.md`](https://github.com/9pings/fad-checker/blob/main/CONTRIBUTING.md)。fad-checker 自体の脆弱性 → [`SECURITY.md`](https://github.com/9pings/fad-checker/blob/main/SECURITY.md)(非公開で報告してください)。
**AI 支援について:** このコードベースは Claude Code を多用して書かれています。リポジトリルートの [`CLAUDE.md`](https://github.com/9pings/fad-checker/blob/main/CLAUDE.md) はまさにそのとおりの内容です。それが満たすべき基準は、あなた自身が確認できるものです。**847 テスト**(`npm test`)、トリップワイヤーテストによって強制され `unshare -rn` 下で再現可能なゼロネットワーク保証、そして主張ではなく Snyk ベースラインに対して測定されたカバレッジ数値。`fad-checker` 自体は**実行時に LLM を一切使用しません**。検出結果は公開脆弱性データベースと決定論的パーサーから得られ、レポートテキストは生成されません。レビューが実際に誤った検出を捕まえた箇所を含む完全な声明 → [`AI_POLICY.md`](https://github.com/9pings/fad-checker/blob/main/AI_POLICY.md)。コードがその基準を満たしていない箇所は、私が望むバグレポートです。
## ライセンス
MIT; [`LICENSE`](https://github.com/9pings/fad-checker/blob/main/LICENSE) を参照。
--typosquat)。SHA256SUMS が同梱されます。差分監査 は以前の実行と差分を取ります(--baseline)。CI は 新規 の検出事項のみでゲートできます。--help。スイッチのロングテールは 4 つのフラグに折りたたまれます — -d eol,nvd は物をオフにし、-a licenses,snyk はデフォルトでオフのものをオンにし、-r html,json は出力を選び、-o は場所を指定します。個々のフラグもまだ機能し、--help-all がそれらを一覧表示します。--lang fr)--report-doc で Word .doc)、CycloneDX 1.6 SBOM、CSAF 2.0 VEX、SARIF 2.1.0、JSON。--fail-on でゲート、--ignore/--vex でトリアージ。すべてのエコシステムのプライベートレジストリ。| 監査者が実際に行う必要があること | fad | OSV | Trivy | Grype+Syft | OWASP DC | Snyk |
|---|
| ツールチェーンをインストールせずに、1 つのコマンドで 100 モジュールのポリグロットモノレポを監査 ¹ | ✅ 105 モジュール | ⚠️ reactor スキップ | ⚠️ ~/.m2 が必要 | ⚠️ オプトイン | ⚠️ Java ビルド | ⚠️ mvn ビルド |
| 推移的依存関係を落とさずにオフライン/エアギャップでスキャン ² | ✅ 657/657 | ❌ | ⚠️ ~/.m2 | ⚠️ オプトイン | ⚠️ ミラー | ❌ |
| 大規模プロジェクト全体でプライベート/内部依存関係を特定 ³ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| クリーンアップされた依存関係記述子を外部ディレクトリに抽出 ⁴ | ✅ -t | ❌ | ❌ | ❌ | ❌ | ❌ |
| EOL / 非推奨のフレームワークと依存関係を報告、推移的なものも含む ⁵ | ✅ | ⚠️ 非推奨のみ | ⚠️ OS ディストロのみ | ❌ | ❌ | ⚠️ Web UI のみ |
| コミットされた鍵と証明書を報告 ⁶ | ✅ | ❌ | ⚠️ 鍵ルール | ❌ | ❌ | ❌ |
コミットされたバイナリ(.dll、.exe、…)を発見し、チェックサムと照合 ⁷ | ✅ | ❌ | ⚠️ 一部 | ⚠️ パターン | ❌ | ❌ |
| スキャンされなかったものを明確にリスト — クライアントが尋ねる前に ⁸ | ✅ 第 0 章 + 6.3 | ⚠️ ログ | ⚠️ ログ | ⚠️ ログ | ⚠️ ログ | ⚠️ ログ |
| 6 か月後に「どのデータに対して?」に答える ⁹ | ✅ | ❌ | ❌ | ⚠️ DB 日付 | ⚠️ NVD 日付 | ❌ |
| JSON ダンプではなくレポートを送信 ¹⁰ | ✅ HTML + .doc | ⚠️ HTML リスト | ⚠️ テンプレート | ❌ | ⚠️ HTML リスト | ⚠️ snyk-to-html |
| チャート、CVE ごとのドリルダウン、貼り付け可能な Word コピー ¹¹ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 変更されたものだけを示すデルタレポートを作成 ¹² | ✅ --baseline | ❌ | ❌ | ❌ | ❌ | ⚠️ クラウド |
uvpdm*.csprojpackages.lock.jsongo.modgo.sumGemfile.lockDirectory.Packages.propsnuget.config-e <regex>--snyk--report-<type>--fail-on*--baseline--snyk| チャプター | ソース | 検出するもの |
|---|
| 0. 警告 (先頭) | ローカルヒューリスティクス | ロックファイルの欠落、未解決の Maven バージョン(BOM 管理)、Maven Central にないプライベートライブラリ |
Δ. ベースラインからの変更 (先頭、--baseline 指定時) | 以前の JSON との差分 | カテゴリごとの新規 / 修正済み / 未変更の検出事項 + 新規本番 CVE のリスト。反復監査や --fail-on-new による CI ゲーティングに |
| 1. CVE (X 直接、Y 間接、Z 開発) | CVEProject + OSV.dev + NVD + CPE | 1.1 本番;本番依存関係の公開 CVE / GHSA、エコシステム別、マニフェスト別、CISA KEV + EPSS + CVSS で 優先順位付け · 1.2 ベンダリングされた JS 脆弱性(retire.js) · 1.3 開発(test/provided、dev/optional/peer) · 1.4 誤検出の可能性(CPE フィルタリング済み) |
| 2. 未管理 / 未バージョン管理コンポーネント | deps.dev + CIRCL(チェックサム別)、retire.js、組み込み X.509 | 2.1 埋め込みバイナリ;コミットされた .jar/.war/.ear 内に同梱されたライブラリの CVE(fat-jar、shaded uber-jar) · 2.2 ネイティブバイナリ(.dll/.exe/.so/.dylib)をハッシュで識別し、管理されるべき / 名前≠チェックサム / 不明 / 悪意あり としてフラグ付け · 2.3 ベンダリングされた JavaScript インベントリ(jQuery、Bootstrap など)脆弱 かどうかに関わらず · 2.4 証明書 & 鍵マテリアル;コミットされた証明書(有効期限 / 弱い鍵 / 弱い署名 / 自己署名)、秘密鍵 vs 公開鍵(PEM/OpenSSH/PuTTY/PGP/SSH)およびキーストア、すべてオフラインで解析 |
| 3. メンテナンス / ライフサイクル (X EOL、Y 廃止、Z 古い) | endoflife.date · キュレーション済み + レジストリフラグ · Maven Central / npm / Packagist / PyPI / NuGet | 3.1 サポート終了 フレームワーク(+ --eol-support による「アクティブサポート外」バンド;Symfony/Laravel はフレームワークごとに 1 行にグループ化;Composer 制約が証明する場合は PHP ランタイム)、直接(宣言済み / 親 POM 継承 — これらを更新)vs 推移的(それらを引き込む依存関係を更新)に分割 · 3.2 廃止 / 非推奨 / 放棄 / yanked · 3.3 古い(新しいバージョンが利用可能、リリース日付き;直接依存のみ) |
4. ライセンス (オプトイン:--licenses) | レジストリメタデータ + Maven POM → SPDX ポリシー | 各依存関係のライセンスを SPDX に正規化して分類;コピーレフト(GPL/AGPL/LGPL/MPL)、プロプライエタリ、不明はレビュー用にフラグ付け |
| 5. 修正推奨 | 計算済み | エコシステム別のピンレシピ:Maven <dependencyManagement>、Gradle constraints { }、npm overrides、yarn resolutions、composer require、pip install、dotnet add package |
| 6. スキャンコンテキスト & 制限事項 | プロベナンスマニフェスト + ウォーク | 6.1 スキャンされた記述子(解析されたすべてのマニフェスト) · 6.2 無視されたディレクトリ(プルーニングされたパス + ルール) · 6.3 方法論、データソース & 制限事項(データソースの鮮度、実行設定、fad-checker が評価 しない もの の明示的な記述) |
| サプライチェーンリスク (横断的) | OSV MAL-… + 名前ヒューリスティック | 既知の悪意ある パッケージ(常に CI ゲートをブロック、任意の --fail-on レベル)および 疑わしいタイポスクワット(--typosquat:人気パッケージから 1 編集の npm/PyPI 名;lodahs↔lodash) |
| 判定 |
|---|
| 57 | 誤ったアーティファクト — アドバイザリが異なる座標にバインドしている |
| 31 | 範囲外 — バージョンが宣言されたすべての影響範囲外 |
| 23 | OSV に存在しない — 19 のプロプライエタリな SNYK-* ID、4 は NVD のみが保持 |
| 19 | Maven バインディングなし — アドバイザリが Maven パッケージにまったくバインドしていない |
| 1 | すでに報告済み、CVE エイリアスの下で |
| 0 | 確認された見逃し |