Clear the Dependency Audit backlog and make the job meaningful again (#282) #283
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/dependency-audit"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #282.
The scheduled Dependency Audit has been red on
mainevery run since at least 2026-08-03 (runs 640, 642, 643), all three jobs failing. Genuine CVEs, not infrastructure — the job log was pulled rather than guessed at.Five advisories, four fixed outright
cryptography48.0.1 → 50.0.0aiohttp3.14.1 → 3.14.3npm audit fix --package-lock-onlybrace-expansion/fast-uricryptography is a two-major jump, so the full suite was run against it rather than trusting the version number.
authlib==1.7.2depends on it as well, so the OIDC paths are in scope, not just the AES-GCM at-rest encryption it's pinned for directly.Those four frontend advisories were not in the CI log. It's tail-truncated and only surfaced the react-router pair. Building the wrapper below is what exposed them — five advisories total, not one.
The fifth is allowlisted, because there is no fix to apply
GHSA-qwww-vcr4-c8h2(high) inreact-router, vulnerable range7.12.0 – 8.2.0. We're onreact-router-dom@7.18.2.react-router-domhas no fixed version. Itslatestdist-tag is 7.18.2 and no 8.x was ever published — in v8 the package folded intoreact-routeritself. The fix,react-router@8.3.0, is only reachable by migrating offreact-router-domentirely.npm audit fix --forceproposes a downgrade to 7.11.0. That is not an upgrade path.@vitejs/plugin-rsc. I fetched and read the advisory to confirm this rather than inferring it from the title.The v8 migration is real work and deliberately out of scope here; the allowlist entry names it as the removal trigger.
The allowlist mechanism
npm audithas no native ignore, and both workarounds are bad:--audit-level=criticalhides real high findings, andaudit-ci/better-npm-auditadds a dependency to the thing whose job is auditing dependencies.scripts/check_npm_audit.mjsparsesnpm audit --json, drops IDs inscripts/npm-audit-allowlist.json, and fails on everything else.Exit 2 is deliberate and distinct — a broken audit must never look like a clean one. All three paths were exercised.
The allowlist entry carries the reason, the review date, a recheck date, and an explicit "delete this if the frontend adopts RSC or the v8 migration lands." Adding an entry is meant to read as a security decision, not a config tweak.
Why nothing warned you — the actual root cause
renovate.jsonalready configuredvulnerabilityAlerts. But that only fires on platform-supplied advisory data (GitHub Dependabot alerts), and Forgejo doesn't provide it — so the rule has been inert on this host the whole time.That's how Renovate came to automerge
react-router-domto 7.18.2 inb51223e, deeper into a range with an open high-severity advisory, four commits before anyone noticed. Auto-merge was doing exactly what it was told; nothing was teaching it about advisories.osvVulnerabilityAlerts: truemakes Renovate query the OSV database itself, independent of the platform.Verification
Run with the same
pip-audit==2.10.0the workflow pins, not inferred from version numbers:Plus all three test suites green, as above.
Why this matters beyond the CVEs
A permanently-red scheduled job is worse than no job — it teaches you to ignore the thing that would tell you about the next real vulnerability. This gets the audit to genuinely green, with exactly one documented, dated, revocable exception.
🤖 Generated with Claude Code