
बिल्डलेस डिपेंडेंसी ऑडिटर जो 10 इकोसिस्टम्स को ऑफ़लाइन स्कैन करता है, CISA KEV और EPSS द्वारा प्राथमिकता दिए गए CVEs, EOL पैकेज, लाइसेंस, कमिट किए गए की, और बाइनरीज़ की रिपोर्टिंग SBOM और SARIF एक्सपोर्ट के साथ करता है।
Formidable Auditor's Dependency Checker
AKA Fuckin' Autonomous Dependency Checker
fad-checker किसी भी सोर्स ट्री में Maven · Gradle · npm · Yarn · pnpm · Composer · PyPI · NuGet · Go · Ruby, vendored JavaScript, कमिट किए गए native binaries और cryptographic material (certificates और private/public keys) का ऑडिट करता है; multi-module, monorepo, polyglot; और एक self-contained HTML + Word रिपोर्ट (CVE को EPSS + CISA KEV के आधार पर प्राथमिकता दी गई, EOL, obsolete, outdated, licenses) के साथ-साथ CycloneDX SBOM / CSAF VEX / SARIF / JSON exports भी बनाता है। कोई build tools नहीं, कोई Docker नहीं, कोई नेटवर्क आवश्यक नहीं; यह lockfiles और manifests को सीधे डिस्क से पढ़ता है।

mvn/gradle/npm install/pip/dotnet restore/go build नहीं, कोई node_modules/ नहीं। Maven graph उसी तरह resolve होता है जैसे Maven इसे resolve करता है। → कैसे--offline के अंतर्गत , regression-tested और के अंतर्गत reproducible। Maven पर यह बिना किसी नेटवर्क इंटरफ़ेस के OSV-Scanner के परिणाम का recover करता है, जबकि अन्य के लिए यह 45 / 40 / 37 है। → · 📖 उपयोग और सभी flags · Architecture · अन्य tools से तुलना · Data sources
यह एक ऑडिट के लिए वह करता है जो अन्य नहीं करते। वही column set और sourcing discipline जो
docs/COMPARISON.md में है — ⚠️ का अर्थ आंशिक है और यह बताता है कैसे, cells का उद्देश्य checkable होना है।
¹ कोई mvn/go/npm/pip/dotnet नहीं — manifests डिस्क से parsed, कुछ भी installed या executed नहीं। एक ही पास में 105 × pom.xml: 790 pairs बनाम OSV-Scanner के 657, 133 fad-only, versions प्रति module mediated न कि flattened।
² OSV-Scanner के online Maven परिणाम का 657 में से 657, unshare -rn के अंतर्गत — कोई नेटवर्क इंटरफ़ेस नहीं। Tripwire-tested; enclave से केवल public coordinates ही बाहर जाते हैं।
³ अध्याय 0 हर वह coordinate बताता है जिसके लिए हर configured registry ने 404 लौटाया — Maven, npm, PyPI, NuGet, Composer, Go और RubyGems — उस manifest(s) के साथ जो इसे declare करता है। जिस registry का समय समाप्त हो गया या error आया, उसे कभी नहीं गिना जाता: अन्यथा एक inconclusive उत्तर किसी client पर उनके proxy के flaky होने के कारण internal packages भेजने का आरोप लगा देगा। फिर -e <regex> उन्हें exclude कर देता है।
⁴ -t <dir>: normalised POMs के साथ हर non-Maven lockfile mirrored, private coordinates हटा दिए गए। Archivable, और किसी भी चीज़ से scannable — --snyk सहित।
⁵ endoflife.date, direct vs transitive में विभाजित ताकि आप जान सकें किस dep को bump करना है, साथ ही deprecated / abandoned / yanked और outdated। Trivy केवल OS distros को cover करता है; Snyk की package health केवल web पर है।
⁶ Inventory और verdicts: expiry, RSA<2048, MD5/SHA1, self-signed; private बनाम public keys; JKS/PKCS#12। Offline parser। Trivy का secret rule फ़ाइल ढूँढता है, flaw नहीं।
⁷ deps.dev + CIRCL के माध्यम से hash द्वारा पहचान → should-be-declared / name≠checksum / unknown / malicious। Syft के patterns एक version बताते हैं, identity नहीं।
⁸ अध्याय 0 बताता है कि यह scan क्या नहीं पहुँच सका (missing lockfiles, BOM-only versions, Yarn Berry, undeterminable PHP runtime); अध्याय 6.3 बताता है कि tool कभी क्या assess नहीं करता। अन्यत्र पहला एक log line होता है जिसे audit कभी नहीं देखता, दूसरा लिखा ही नहीं जाता।
⁹ Provenance manifest: सभी 13 sources के लिए tool, runtime, mode, run configuration और cache freshness। Grype और Dependency-Check एक source की तारीख रखते हैं, run की नहीं।
¹⁰ अध्याय 0→6 एक executive summary और fix recipes के साथ, self-contained HTML के साथ एक Word .doc twin। अन्य में से कोई भी Word emit नहीं करता।
¹¹ चार inline-SVG charts — worst severity के अनुसार CWE, प्रति root dep vulnerable transitives, आपके सबसे vulnerable modules (single-module प्रोजेक्ट पर direct vs transitive), fix-priority bands — .doc में भी rendered, एक-क्लिक copy के साथ PNG के रूप में (या rich HTML के रूप में एक table) जो Word में formatted paste हो जाता है। हर CVE अपना CVSS vector, CWE, references, CPE config और via-path एक drill-down के पीछे रखता है, शून्य external assets के साथ।
¹² --baseline एक Δ अध्याय जोड़ता है (new / fixed / unchanged); --fail-on-new केवल नई findings पर gate करता है। Snyk इसे अपने platform पर track करता है, local diff के रूप में नहीं।
जहाँ यह पीछे रह जाता है — containers/OS packages, auto-fix PRs, और Snyk के curated
feed के विरुद्ध CVE coverage → docs/COMPARISON.md ·
अंतराल, मापा गया।
जानबूझकर लक्ष्य नहीं: reachability। एक finding dependency graph पर एक vulnerable version है, और रिपोर्ट ठीक यही कहती है (ch. 6.3) बजाय call paths का अनुमान लगाने के। यह तय करना कि vulnerable code इस application में reachable है या नहीं, auditor का काम है, जो application context के साथ किया जाता है जो किसी scanner के पास नहीं है।
[!WARNING] fad-checker नया है और इसमें अभी भी (दुर्लभ) bugs हो सकते हैं। इसके output को एक मज़बूत पहला पास मानें, किसी भी critical चीज़ की दोबारा जाँच करें, और कृपया issues रिपोर्ट करें; उन्हें जल्दी ठीक किया जाता है।
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× तेज़ enrichment देता है: `fad-checker --set-nvd-key YOUR_KEY`। कुछ सामान्य runs; पूरी सूची `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> वास्तव में क्या करता है। यह एक extraction चरण है, Snyk adapter नहीं। यह
normalised dependency descriptors का एक समानांतर tree लिखता है: प्रत्येक pom.xml को
dependency-संबंधित nodes (coordinates, properties, dependencyManagement, dependencies,
modules) तक घटाया जाता है, reactor parents को उनके वास्तविक in-tree relativePath से फिर से जोड़ा जाता है,
coordinates में ${…} resolve किया जाता है — साथ ही प्रत्येक non-Maven lockfile/manifest उसी relative path पर
mirror किया जाता है (package-lock/yarn.lock/pnpm-lock, composer.lock, poetry///,
/, /, , और साथी फ़ाइलें जैसे
या )। ऑनलाइन यह भी करता है और उन लोगों की रिपोर्ट करता है जो वहाँ मौजूद नहीं हैं — आपके
— जिन्हें फिर rewritten POMs से हटा देता है। फिर यह
: कोई CVE/EOL pass नहीं और कोई report नहीं, जब तक आप , कोई ,
या भी पास न करें। आपको जो मिलता है वह एक buildless, sanitised dependency inventory है जिसे आप
audit evidence के रूप में archive कर सकते हैं, किसी client या legal review को सौंप सकते हैं, या किसी भी scanner की ओर इंगित कर सकते हैं — Snyk via
उनमें से एक है।
[!IMPORTANT]
--offlinecache को पढ़ता है, उसे बदलता नहीं। एक cold cache पर match करने के लिए कुछ नहीं होता, इसलिए offline पहला run वैध रूप से 0 CVE / 0 EOL / 0 outdated रिपोर्ट करता है; वह एक खाली cache है, clean project नहीं। इसे एक बार warm करें (किसी भी project पर एक सामान्य online run, या--import-cache), फिर--offlineबिना किसी network call के पूरा result set लौटाता है। Air-gapped machines अपना cache--export-cache/--import-cacheके माध्यम से प्राप्त करते हैं।
एक single self-contained binary (Node रहित), from-source install और shell completion यहाँ हैं → docs/USAGE.md।
Report root chapters में संगठित है (प्रत्येक संबंधित sub-chapters को समूहित करता है):
HTML report किसी भी browser में खुलता है, हर विवरण शामिल करता है (CVSS vectors, references, पूर्ण विवरण, CPE configurations, transitives के लिए via-paths) और एक Word-compatible .doc twin भी देता है। प्रत्येक match में एक composite priority होती है (KEV-exploited > EPSS likelihood > CVSS severity), और run अतिरिक्त रूप से downstream tooling के लिए एक CycloneDX 1.6 SBOM (--report-sbom, vulnerabilities inline) और एक CSAF 2.0 VEX (--report-csaf) भी emit कर सकता है।

कोई भी tool सब कुछ नहीं खोजता। fad-checker 908-pair union के 87% पर आगे है, और 131 pairs Snyk से वापस आए और इससे नहीं। OSV के विरुद्ध एक-एक करके adjudicated, इनमें से कोई भी recall bug नहीं है:
दो-तिहाई सार्वजनिक रिकॉर्ड का खंडन करते हैं, इसलिए उन्हें रिपोर्ट करने का अर्थ होगा false positives भेजना। CVE-2023-6481 स्पष्ट उदाहरण है: [email protected] पर दावा किया गया, यह logback-core को [1.2.12, 1.2.13) पर bind करता है — गलत artifact, और एक ऐसा version जो इस flaw के अस्तित्व में आने से पहले प्रकाशित हुआ था।
Scope. सभी 131 Snyk के हैं: OSV-Scanner, Trivy और Grype+Syft में से प्रत्येक ने 0 findings में योगदान दिया जो किसी और के पास नहीं थे। और सभी Maven target पर हैं — Maven के बाहर graph lockfile में है, हर scanner एक ही input पढ़ता है, और benchmark npm, RubyGems और Composer पर समान finding sets मापता है।
इसीलिए --snyk मौजूद है। fad-checker snyk test output को एक input के रूप में लेता है और उसे merge करता है, ताकि आपको पक्ष चुनने के बजाय union मिले। एक coverage choice, correction नहीं।
Method, caveats और per-pair verdicts → docs/BENCHMARK.md; scripts/adjudicate-gap.js के साथ reproduce करें।
Zero-data-sent guarantee.
--offlineके अंतर्गत, fad-checker कोई भी network call नहीं करता; यह केवल warmed~/.fad-checker/caches पढ़ता है और कभी भी कोई dependency, path या finding machine से बाहर transmit नहीं करता। यह regression-tested है (test/offline-guarantee.test.js, एक tripwire fetcher जो छूने पर throw करता है) और auditor-reproducible:unshare -rn node fad-checker.js -s ./proj --offline …इसे एक ऐसे namespace में चलाता है जिसमें कोई network interface नहीं है और byte-identical findings देता है। mainstream OSS scanners के विपरीत, fad Maven transitive graph को offline भी resolve करता है; इसलिए एक air-gapped multi-module project पर यह वे transitive CVEs खोजता है जो वे नहीं खोज पाते।
जब audited system offline / confidential हो (एक regulated या air-gapped audit के लिए विशिष्ट) तो यह OSV / NVD / Maven Central / npm तक नहीं पहुँच सकता। secure enclave से शून्य environment information बाहर रखते हुए काम को machines में बाँटें: एक anonymized descriptor केवल public package coordinates रखता है; कोई filesystem paths नहीं, कोई registry URLs नहीं, कोई hostnames/usernames नहीं; और विस्तृत report offline machine पर ही तैयार होती है।
यह transfer fad-checker के caches के एक गुण पर निर्भर करता है: वे coordinate या vuln id द्वारा keyed हैं, कभी path द्वारा नहीं, इसलिए वे machine-independent हैं। online चरण बस caches को warm करता है; offline चरण scan को replay करता है और cache hits प्राप्त करता है।```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 paths / pom paths |
| namespace, name | resolved registry URLs |
| version, versions | integrity hashes |
| scope, isDev | parent chains, lockfile type |
ऑनलाइन चरण रिपोर्ट स्वयं पथ-रहित है; vendored-JavaScript (retire.js) निष्कर्ष **चरण 3 में ऑफ़लाइन** उत्पन्न होते हैं, क्योंकि retire को वास्तविक `.js` फ़ाइलों की आवश्यकता होती है; इसका signature DB ऑनलाइन (चरण 2) वार्म किया जाता है और `--export-cache` द्वारा ले जाया जाता है। पूर्ण ऑफ़लाइन/कैश नियंत्रण → [`docs/USAGE.md`](https://github.com/9pings/fad-checker/blob/main/docs/USAGE.md)।
## Docs
- [`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 की तुलना में, और यह build-free कैसे रहता है।
- [`docs/BENCHMARK.md`](https://github.com/9pings/fad-checker/blob/main/docs/BENCHMARK.md) — एक सार्वजनिक 105-मॉड्यूल प्रोजेक्ट पर OSV-Scanner के विरुद्ध पुनरुत्पादनीय air-gapped recall बेंचमार्क।
- [`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); ऑडिट-ग्रेड सुविधाएँ (provenance, differential audit, methodology/integrity) और प्रत्येक को उस तरह क्यों बनाया गया।
- [`CHANGELOG.md`](https://github.com/9pings/fad-checker/blob/main/CHANGELOG.md) · [`CLAUDE.md`](https://github.com/9pings/fad-checker/blob/main/CLAUDE.md); रिलीज़ इतिहास · योगदानकर्ताओं के लिए कोड-स्तरीय दिशा-निर्देश।
## Contributing
एक नए स्कैनर के लिए सबसे उपयोगी योगदान है **उसे बताना कि वह कहाँ गलत है**: इसे किसी वास्तविक प्रोजेक्ट पर चलाएँ और coordinate तथा उसे उत्पन्न करने वाले manifest snippet के साथ एक [false positive / false negative रिपोर्ट](https://github.com/9pings/fad-checker/issues/new?template=false_positive.yml) दर्ज करें। Dev सेटअप, बुनियादी नियम और कोडेक एक्सटेंशन पॉइंट → [`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`), एक tripwire टेस्ट द्वारा लागू और `unshare -rn` के अंतर्गत पुनरुत्पादनीय zero-network गारंटी, और Snyk बेसलाइन के विरुद्ध मापे गए coverage आँकड़े, न कि दावा किए गए। `fad-checker` स्वयं रनटाइम पर **कोई LLM उपयोग नहीं करता**; निष्कर्ष सार्वजनिक vulnerability डेटाबेस और deterministic parsers से आते हैं, और कोई रिपोर्ट टेक्स्ट उत्पन्न नहीं होता। पूर्ण कथन, जिसमें यह भी शामिल है कि समीक्षा ने वास्तव में कहाँ एक खराब निष्कर्ष पकड़ा →
[`AI_POLICY.md`](https://github.com/9pings/fad-checker/blob/main/AI_POLICY.md)। जहाँ कोड उस मानक को पूरा नहीं करता, वह एक बग रिपोर्ट है जो मैं चाहता हूँ।
## License
MIT; देखें [`LICENSE`](https://github.com/9pings/fad-checker/blob/main/LICENSE)।
unshare -rn--typosquat)।SHA256SUMS भेजे जाते हैं; differential audits किसी पूर्व run के विरुद्ध diff करते हैं (--baseline) और CI केवल नई findings पर gate कर सकता है।--help; switches की लंबी सूची चार flags में समाहित हो जाती है — -d eol,nvd चीज़ें बंद करता है, -a licenses,snyk वह चालू करता है जो डिफ़ॉल्ट रूप से बंद है, -r html,json outputs चुनता है, -o बताता है कहाँ। अलग-अलग flags अभी भी काम करते हैं और --help-all उन्हें सूचीबद्ध करता है।--lang fr)--report-doc पर Word .doc), CycloneDX 1.6 SBOM, CSAF 2.0 VEX, SARIF 2.1.0, JSON; --fail-on से gate करें, --ignore/--vex से triage करें। हर ecosystem के लिए private registries।| एक auditor को वास्तव में क्या करने की आवश्यकता होती है | fad | OSV | Trivy | Grype+Syft | OWASP DC | Snyk |
|---|
| एक ही कमांड में 100-module polyglot monorepo का ऑडिट, बिना कोई toolchain installed ¹ | ✅ 105 modules | ⚠️ reactor skipped | ⚠️ needs ~/.m2 | ⚠️ opt-in | ⚠️ Java build | ⚠️ mvn build |
| transitive deps छोड़े बिना ऑफ़लाइन / air-gapped स्कैन ² | ✅ 657/657 | ❌ | ⚠️ ~/.m2 | ⚠️ opt-in | ⚠️ mirror | ❌ |
| एक बड़े प्रोजेक्ट में private/internal deps की पहचान ³ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| साफ़ किए गए deps descriptors को बाहरी directory में निकालना ⁴ | ✅ -t | ❌ | ❌ | ❌ | ❌ | ❌ |
| EOL / deprecated frameworks और deps की रिपोर्ट, transitive सहित ⁵ | ✅ | ⚠️ deprecated only | ⚠️ OS distros only | ❌ | ❌ | ⚠️ web UI only |
| कमिट किए गए keys और certificates की रिपोर्ट ⁶ | ✅ | ❌ | ⚠️ key rule | ❌ | ❌ | ❌ |
कमिट किए गए binaries की पहचान (.dll, .exe, …) और उन्हें उनके checksums के विरुद्ध जाँचना ⁷ | ✅ | ❌ | ⚠️ some | ⚠️ patterns | ❌ | ❌ |
| स्पष्ट रूप से सूचीबद्ध करना कि क्या नहीं स्कैन किया गया — इससे पहले कि client पूछे ⁸ | ✅ ch. 0 + 6.3 | ⚠️ log | ⚠️ log | ⚠️ log | ⚠️ log | ⚠️ log |
| छह महीने बाद "किस डेटा के विरुद्ध?" का उत्तर देना ⁹ | ✅ | ❌ | ❌ | ⚠️ DB date | ⚠️ NVD date | ❌ |
| JSON dump नहीं, एक रिपोर्ट भेजना ¹⁰ | ✅ HTML + .doc | ⚠️ HTML list | ⚠️ template | ❌ | ⚠️ HTML list | ⚠️ snyk-to-html |
| Charts, प्रति-CVE drill-down और एक pasteable Word प्रति ¹¹ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| केवल वही दिखाने वाली delta रिपोर्ट बनाना जो बदला है ¹² | ✅ --baseline | ❌ | ❌ | ❌ | ❌ | ⚠️ cloud |
Pipfileuvpdm*.csprojpackages.lock.jsongo.modgo.sumGemfile.lockDirectory.Packages.propsnuget.config-e <regex>--snyk--report-<type>--fail-on*--baseline--snyk| Chapter | Source | What it catches |
|---|
| 0. Warnings (top) | local heuristics | Missing lockfiles, unresolved Maven versions (BOM-managed), private libs not on Maven Central |
Δ. Changes since baseline (top, with --baseline) | diff vs prior JSON | New / fixed / unchanged findings per category + the list of new production CVEs; for repeat audits and --fail-on-new CI gating |
| 1. CVE (X direct, Y indirect, Z dev) | CVEProject + OSV.dev + NVD + CPE | 1.1 Production; public CVE / GHSA in prod deps, per ecosystem, per manifest, prioritised by CISA KEV + EPSS + CVSS · 1.2 Vendored JS vulns (retire.js) · 1.3 Dev (test/provided, dev/optional/peer) · 1.4 Likely false positives (CPE-filtered) |
| 2. Unmanaged / unversioned components | deps.dev + CIRCL (by checksum), retire.js, built-in X.509 | 2.1 Embedded binaries; CVEs in libs shipped inside committed .jar/.war/.ear (fat-jars, shaded uber-jars) · 2.2 Native binaries (.dll/.exe/.so/.dylib) identified by hash, flagged should-be-managed / name≠checksum / unknown / malicious · 2.3 Vendored JavaScript inventory (jQuery, Bootstrap, …) vulnerable or not · 2.4 Certificates & key material; committed certs (expiry / weak key / weak signature / self-signed), private vs public keys (PEM/OpenSSH/PuTTY/PGP/SSH) and keystores, all parsed offline |
| 3. Maintenance / lifecycle (X EOL, Y obsolete, Z outdated) | endoflife.date · curated + registry flags · Maven Central / npm / Packagist / PyPI / NuGet | 3.1 End-of-Life frameworks (+ an "Out of active support" band with --eol-support; Symfony/Laravel grouped as one row per framework; PHP runtime when the Composer constraint proves it), split direct (declared / parent-POM-inherited — bump these) vs transitive (bump the dep that pulls them in) · 3.2 Obsolete / deprecated / abandoned / yanked · 3.3 Outdated (newer version available, with release dates; direct deps only) |
4. Licenses (opt-in: --licenses) | registry metadata + Maven POMs → SPDX policy | Each dep's license normalised to SPDX and classified; copyleft (GPL/AGPL/LGPL/MPL), proprietary and unknown flagged for review |
| 5. Fix Recommendations | computed | Per-ecosystem pin recipes: Maven <dependencyManagement>, Gradle constraints { }, npm overrides, yarn resolutions, composer require, pip install, dotnet add package |
| 6. Scan context & limitations | provenance manifest + walk | 6.1 Scanned descriptors (every manifest parsed) · 6.2 Ignored directories (pruned paths + rule) · 6.3 Methodology, data sources & limitations (data-source freshness, run config, explicit statement of what fad-checker does not assess) |
| Supply-chain risk (cross-cutting) | OSV MAL-… + name heuristic | Known-malicious packages (always block the CI gate, any --fail-on level) and suspected typosquats (--typosquat: an npm/PyPI name one edit from a popular package; lodahs↔lodash) |
| Verdict |
|---|
| 57 | wrong artifact — the advisory binds a different coordinate |
| 31 | out of range — the version is outside every declared affected range |
| 23 | not in OSV — 19 proprietary SNYK-* ids, 4 that only NVD carries |
| 19 | no Maven binding — the advisory binds no Maven package at all |
| 1 | already reported, under the CVE alias |
| 0 | confirmed miss |