fad-checker 2.4.5 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -25,7 +25,7 @@
25
25
  - **No build tools**; reads `pom.xml`, `build.gradle(.kts)`/`gradle.lockfile`/`libs.versions.toml`, `package-lock`/`yarn.lock`/`pnpm-lock`, `composer.lock`, `poetry`/`Pipfile`/`uv`/`pdm` locks, `packages.lock.json`/`*.csproj`, `go.mod`, `Gemfile.lock` directly. No `mvn`/`gradle`/`npm install`/`pip`/`dotnet restore`/`go build`/`bundle`, no `node_modules/`. → [how it stays build-free](docs/COMPARISON.md#how-its-autonomous-no-build-tools)
26
26
  - **CVE, merged & prioritised**; CVEProject + OSV.dev + NVD, CPE/version cross-checked to cut false positives, ranked **CISA KEV → EPSS → CVSS**.
27
27
  - **Per-module Maven version mediation**; recovers vulnerable transitive versions that a global `<dependencyManagement>` pin hides in another module, applying Maven's own nearest-wins semantics per module rather than resolving the whole reactor as one tree.
28
- - **Air-gapped**; **zero network under `--offline`** (regression-tested), offline Maven transitive resolution, and `--osv-db` for cache-independent offline OSV recall. Benchmarked on **Apache Dubbo 2.7.8** (105 modules) against OSV-Scanner, Snyk, Trivy and Grype+Syft: at **full capability** fad finds 790 of a 908-pair union (87%, the highest of the five, and it still misses 118 that Snyk finds); **under `unshare -rn` with no network interface** it recovers **657/657** of OSV-Scanner's *online* result, versus 45 / 40 / 37 for the others. → [Benchmark](docs/BENCHMARK.md) · [Air-gapped](#air-gapped-audits)
28
+ - **Air-gapped**; **zero network under `--offline`** (regression-tested), offline Maven transitive resolution, and `--osv-db` for cache-independent offline OSV recall. Benchmarked against OSV-Scanner, Snyk, Trivy and Grype+Syft on **six public projects across six ecosystems**: identical finding sets on npm, RubyGems and Composer (parity is the correct outcome when the graph is in the lockfile), and on Maven where it is not — fad recovers **657/657** of OSV-Scanner's *online* result with **no network interface at all**, versus 45 / 40 / 37 for the others. At full capability no tool finds everything, fad included: it leads at 87% of a 908-pair union and still misses 118 that Snyk finds. → [Benchmark](docs/BENCHMARK.md) · [Air-gapped](#air-gapped-audits)
29
29
  - **Supply-chain risk**; known-**malicious** advisories (`MAL-`, always block the CI gate) + suspected **typosquats** (`--typosquat`).
30
30
  - **Lifecycle**; EOL (endoflife.date), obsolete/deprecated, outdated; across every ecosystem.
31
31
  - **Licenses** *(opt-in `--licenses`)*; SPDX-normalised, copyleft/proprietary flagged.
@@ -91,10 +91,20 @@ function parseGoSum(text) {
91
91
  for (const raw of String(text || "").split(/\r?\n/)) {
92
92
  const m = raw.trim().match(/^(\S+)\s+(v\S+?)(\/go\.mod)?\s+h1:/);
93
93
  if (!m) continue;
94
+ // go.sum records two kinds of line per module:
95
+ // mod ver h1:… the module ZIP was downloaded → it IS in the build
96
+ // mod ver/go.mod h1:… only its go.mod was read, during minimal version selection
97
+ // A module carrying only the second kind was weighed and rejected: it sits on no
98
+ // classpath, and scanning it invents a dependency. Measured on prometheus v2.30.0
99
+ // (go 1.14, so go.mod lists direct deps only and go.sum is our transitive source):
100
+ // 187 modules have a zip hash, 391 have a go.mod hash alone — and taking all of
101
+ // them put gin, echo AND go-restful in one report, three mutually exclusive web
102
+ // frameworks. 70% of that project's Go production findings came from modules that
103
+ // were never built.
104
+ if (m[3]) continue;
94
105
  const name = m[1];
95
106
  const ver = stripV(m[2]);
96
- // go.sum lists every version in the module graph; keep the highest (the
97
- // comment promised this but the code kept the first one encountered).
107
+ // Several versions can genuinely be downloaded in one graph; keep the highest.
98
108
  const prev = byMod.get(name);
99
109
  if (!prev || compareMavenVersions(ver, prev) > 0) byMod.set(name, ver);
100
110
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fad-checker",
3
- "version": "2.4.5",
3
+ "version": "2.4.6",
4
4
  "description": "Scan ALL Maven, Gradle, npm, Yarn, Composer, Python, C#/.NET, Go & Ruby dependencies — plus embedded JARs (fat-jars/war/ear) — in a source tree ONE SHOT without mvn/python/etc — CVE (EPSS/KEV-prioritised), EOL, obsolete, outdated & licenses, with SBOM/CSAF/SARIF/JSON exports, CI gating and fix recos",
5
5
  "keywords": [
6
6
  "sca",