fix(deps): clear RUSTSEC advisory failures in supply-chain CI#682
Open
ohdearquant wants to merge 3 commits into
Open
fix(deps): clear RUSTSEC advisory failures in supply-chain CI#682ohdearquant wants to merge 3 commits into
ohdearquant wants to merge 3 commits into
Conversation
Invalid-pointer-dereference advisory in crossbeam-epoch's fmt::Pointer impl for Atomic/Shared when the underlying pointer is invalid. Fixed upstream in 0.9.20; lockfile-only bump, no API changes reach our code (crossbeam-epoch is a transitive dep of crossbeam 0.8.4, itself pulled by ruvector-core and most of the workspace). Verified: cargo build -p ruvector-core && cargo test -p ruvector-core --lib (228 passed, 0 failed). cargo audit and cargo deny check advisories both clear this advisory after the bump. Co-Authored-By: Leo <noreply@khive.ai>
…6-0195, RUSTSEC-2026-0194) quick-xml 0.26.0 carries two DoS advisories (unbounded namespace-decl allocation, quadratic duplicate-attribute check; both severity 7.5). No lockfile-only or minimal-range fix is currently possible: quick-xml is pulled only via inferno (flamegraph rendering) <- pprof (the optional 'profiling' feature of ruvector-bench, never a production dependency), and pprof's newest release (0.15.0) still requires inferno = "^0.11", whose newest patch (0.11.21, already latest-locked) still requires quick-xml = "^0.26". Verified directly via 'cargo update -p inferno'/'cargo update -p quick-xml' dry runs against a temporarily-bumped pprof requirement, not from changelog inspection. quick-xml in this path only parses profiler-internal XML produced locally by the flamegraph tooling, never network-facing or attacker-supplied input, so the DoS surface is not reachable in our usage even pre-fix. Documented in .cargo/audit.toml with a re-review trigger (pprof depending on inferno >=0.12), matching this file's existing pattern for other upstream-blocked advisories (e.g. RUSTSEC-2026-0002 for the same pprof/profiling feature). Co-Authored-By: Leo <noreply@khive.ai>
…TSEC-2026-0192)
ttf-parser is unmaintained per the upstream author (no further fixes
planned); the RustSec advisory itself states 'No safe upgrade is
available!'. Reaches the workspace's dependency graph at three
independent versions, none reachable by a version bump:
0.15.2 via rusttype 0.9.3 -> owned_ttf_parser (dev-only, scipix example)
0.20.0 via plotters 0.3.7 -> criterion (dev-dep, workspace-wide) and
ruvector-bench's own chart rendering (publish = false)
0.25.1 via imageproc 0.25.1 -> ab_glyph -> owned_ttf_parser (scipix)
All three paths are dev-dependencies or unpublished bench-only
tooling; none reach a published/production artifact, and font-parsing
inputs in all three are local example assets, not attacker-controlled.
This was failing 'cargo deny check advisories' (error[unmaintained]),
one of the workspace's five supply-chain CI layers. Documented in
deny.toml's advisories.ignore with a re-review trigger, matching the
file's existing pattern for similarly-situated unmaintained-with-no-fix
advisories (e.g. RUSTSEC-2026-0105 for rusttype in the same chain).
Verified: cargo deny check advisories -> advisories ok (previously
FAILED on this crate). Full cargo deny check -> advisories ok, bans ok,
licenses ok, sources ok. cargo build -p ruvector-bench --features
profiling succeeds unchanged.
Co-Authored-By: Leo <noreply@khive.ai>
Contributor
Author
|
CI note — the two red checks on this PR are repo-level, not from this diff:
Every build/test/audit job relevant to this change passes. |
This was referenced Jul 14, 2026
perf(diskann): reuse VisitedSet across searches, add search_with and allocation regression test
#683
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Dependency cleanup scoped strictly to the advisories your own supply-chain CI
(
supply-chain.yml) flags red, plus two more thatcargo-audit/cargo-denyalready surface but aren't gating CI yet. No drive-by version-freshness bumps.
What was red and what fixed it
crossbeam0.8.4, pulled byruvector-coreand most of the workspace)cargo update -p crossbeam-epoch --precise 0.9.20— lockfile-only, no code changesdeny.tomlignore list (see below)inferno←pprof, optionalprofilingfeature).cargo/audit.tomlignore list (see below)Row 1 was the only one of the four actually fixable by a version bump; it's
its own commit. Rows 2/3 both had no clean upgrade path, so instead of
forcing something invasive I documented them the same way this repo already
documents every other unfixable transitive advisory — a dated, justified
entry in the existing ignore list, not a silent skip.
1. crossbeam-epoch 0.9.18 → 0.9.20 (RUSTSEC-2026-0204)
Invalid-pointer-dereference bug in
crossbeam-epoch'sfmt::Pointerimplfor
Atomic/Sharedwhen the underlying pointer is invalid. Fixed upstreamin 0.9.20.
crossbeam0.8.4's own version requirement (^0.9) alreadypermits 0.9.20, so this is a pure lockfile bump —
Cargo.tomlis untouched.2. ttf-parser — RUSTSEC-2026-0192 (documented, not fixed)
The advisory text itself says "No safe upgrade is available!" — the
upstream author has stated the crate won't receive further fixes. It's
in the graph via three independent paths, none of them reachable by a
version bump:
0.15.2viarusttype 0.9.3 → owned_ttf_parser(dev-only,ruvector-scipixexample)0.20.0viaplotters 0.3.7 → criterion(dev-dep, workspace-wide) and viaruvector-bench's own chart rendering (publish = false)0.25.1viaimageproc 0.25.1 → ab_glyph → owned_ttf_parser(ruvector-scipixexample)All three paths are dev-dependencies or unpublished bench-only tooling —
none reach a published/production artifact — and the font-parsing inputs
in all three are local example assets, not attacker-controlled. This was
the thing actually failing
cargo deny check advisories(
error[unmaintained]), one of the workspace's five supply-chain CIlayers. I added it to
deny.toml'sadvisories.ignorelist with are-review trigger (adoption of a maintained fork such as
skrifabyrusttype/plotters/imageprocupstream), matching the file's existingentry style for
RUSTSEC-2026-0105(rusttype, same chain).Longer-term dependency alternatives for this chain are tracked in #681.
3. quick-xml 0.26.0 — RUSTSEC-2026-0195 / RUSTSEC-2026-0194 (documented, not fixed)
Two DoS advisories, both severity 7.5: unbounded namespace-declaration
allocation, and quadratic run time on duplicate-attribute checks. I
checked whether a version bump was possible before concluding it wasn't:
quick-xmlis pulled only viainferno(flamegraph rendering) ←pprof(the optionalprofilingfeature ofruvector-bench, never aproduction dependency).
pprof's newest release on crates.io (0.15.0) still requiresinferno = "^0.11".inferno 0.11.21(the newest patch already in the workspace's lockfilewithin that
^0.11range — confirmed viacargo update -p inferno,which reported 0 packages needing changes) still requires
quick-xml = "^0.26".I verified this directly rather than trusting changelogs: I temporarily
bumped
ruvector-bench'spprofrequirement to"0.15"and rancargo update -p pprof --precise 0.15.0, then triedcargo update -p inferno --precise 0.12.7, which failed withinferno = "^0.11"still required bypprof 0.15.0. I reverted thatexploratory change; it's not in the final diff.
quick-xml in this path only parses profiler-internal XML produced
locally by the flamegraph tooling — never network-facing or
attacker-supplied input — so the DoS surface isn't reachable in your
usage even pre-fix. This is currently a
cargo-auditfailure (the"vulnerability" type, which is the only type that fails your
cargo-auditCI step by default) but wasn't yet showing up as acargo-denyfailure, becausequick-xmlsits behind a non-defaultfeature and isn't part of
cargo-deny's default-feature reachabilitygraph (it does show up under
cargo audit, which scans the fullCargo.lockregardless of feature reachability — that's why it wasstill red on the layer-2 CI job). I added both IDs to
.cargo/audit.toml's ignore list with a re-review trigger (pprofdepending on
inferno >= 0.12), matching that file's existing entrystyle for
RUSTSEC-2026-0002(the samepprof/profilingfeature,different advisory).
Longer-term alternatives (including pprof's protobuf output mode, which
drops the inferno/quick-xml chain entirely) are tracked in #680.
Before / after
cargo audit(workspace root):error: 3 vulnerabilities found!(crossbeam-epoch, quick-xml ×2) /warning: 8 allowed warnings foundwarning: 8 allowed warnings found— 0 vulnerabilities, same 8 pre-existing informational warnings (unmaintained/unsound notices already tracked elsewhere in this file, untouched by this PR)cargo deny check(all four sub-checks):advisories FAILED(crossbeam-epoch vulnerability + ttf-parser ×3 unmaintained),bans ok, licenses ok, sources okadvisories ok, bans ok, licenses ok, sources oknpm audit --omit=dev --audit-level=critical(npm/workspace, thegate your CI actually enforces): unchanged, still green — 0 critical
before and after. See the npm section below for what I found and why I
didn't touch it.
Test evidence
cargo build -p ruvector-core && cargo test -p ruvector-core --lib(thecrate that pulls
crossbeammost broadly): 228 passed, 0 failed, 1ignored.
cargo build -p ruvector-bench --features profiling(the crate thatpulls
pprof/inferno/quick-xml/ttf-parser): builds clean,unchanged from before this PR (no code in this PR touches
ruvector-bench— the quick-xml/ttf-parser advisories are documented,not bumped).
cargo deny checkandcargo auditboth re-run clean after everycommit (see before/after above).
npm — found, not fixed here
npm/package-lock.json(the only tracked npm lockfile, per your own CIcomment) currently carries 36 advisories via
npm audit --omit=dev: 0critical, 23 high, 13 moderate. Your
supply-chain.ymlgate(
--audit-level=critical) is green both before and after this PR — noneof these are "red" by your own CI's definition, and several are already
covered by the
overridesblock innpm/package.json(though a couple,like
protobufjs, have had new advisories land since that override waslast set — e.g.
GHSA-wcpc-wj8m-hjx6, unboundedAnyexpansion DoS,high, on top of the range your existing
protobufjs >=7.5.6overridealready permits).
Most of these (
protobufjs,@grpc/grpc-js,undici,ws,form-data,minimatch,hono,http-proxy-middleware, several@google-cloud/*packages) report
fixAvailable: truewith noisSemVerMajorflag —i.e.
npm audit fixwithout--forceshould clear them non-breakingly.A handful (
fastifyfamily,node-cron,uuid) only have asemver-major fix path and would need real review, matching your own
Q3-2026 cutover-plan note in the workflow file.
I could not actually run
npm audit fixto verify or apply this: itrequires
npm install, and this workspace ships per-platform nativebinaries as local workspace packages (not npm-registry
optionalDependencies) — e.g.packages/router-darwin-x64declares"os": ["darwin"], "cpu": ["x64"]. npm workspace linking doesn't skipplatform-mismatched workspace members the way it does for registry
optional deps, so on my arm64 host every install attempt fails hard with
EBADPLATFORMon that package before it gets anywhere near resolvingthe actual advisories (I tried
--omit=optionaltoo; same result — it'sa workspace-link failure, not an optional-dependency one). This should
run cleanly on your CI's x64 runner or any real x64/Rosetta machine.
Recommend running
npm audit fixthere and reviewing thefastify/node-cron/uuidmajors as a separate, deliberate follow-up PR ratherthan bundling them here.
Known remaining (informational only, not gating anything)
These already show up as
cargo auditwarnings today and are untouchedby this PR — none of them fail any current CI gate, and all but two were
already documented in
deny.toml/.cargo/audit.tomlbefore this PR:RUSTSEC-2026-0163(pqcrypto-internals, unmaintained) andRUSTSEC-2026-0162(pqcrypto-traits, unmaintained) — same PQCleanarchival situation as the already-ignored
pqcrypto-dilithium/pqcrypto-kyberentries, just not yet added to either ignore list.Informational only (
cargo auditwarns, doesn't fail; not incargo-deny's default-feature reachability graph either, so it isn'tfailing that check now). Left alone here to keep this PR's diff to
exactly what's failing CI plus the two advisories your
cargo-auditstep already flags red.
RUSTSEC-2026-0173(proc-macro-error2, unmaintained),RUSTSEC-2026-0190(anyhow, unsound
downcast_mut),RUSTSEC-2026-0186(memmap2, unsoundpointer offset) — already documented in
deny.toml, unaffected by thisPR.
Scope note
I stuck to what's actually red plus the two
cargo-auditfindings yourCI doesn't gate on yet, rather than doing a general version-freshness
sweep. In particular I deliberately did not touch
randanywhere inthe workspace —
ruvector-diskann(and possibly others) still use therand0.8-era API (thread_rng/gen), and arandmajor bump wouldcascade into real call-site migrations across the workspace, which is a
separate, larger piece of work than "clean up the red."