Repository navigation
chore(deps): bump Rust to 1.94 and wasmtime to 46.0.2 (RUSTSEC-2026-0222) - #209
Conversation
`event-listener` 5.4.1 allows `!Send` tags to cross thread boundaries via `StackSlot` (RUSTSEC-2026-0221, published 2026-07-13). It reaches the runtime-manager transitively through async-broadcast, so this is a lockfile-only change: no manifest edit, no API surface touched. Turned up when the vuln gate went red on an unrelated PR — the advisory database picked it up between this morning's runs and this afternoon's, so it now fails on master too. This clears RUSTSEC-2026-0221 only. `cargo audit` still reports RUSTSEC-2026-0222 (wasmtime 45.0.3, "Stores can mix up type indices between engines"), which is NOT fixable the same way: every patched line the advisory allows — 46.0.2+ and 47.0.3+ — pulls cranelift crates requiring Rust 1.94, while the repo pins 1.93 in rust-toolchain.toml, two CI workflows, and the service Dockerfiles. That is a cross-cutting toolchain decision and gets its own change rather than riding along here. Verified: cargo audit no longer reports 0221, release build clean.
…222)
wasmtime 45.0.3 lets Stores mix up type indices between engines
(RUSTSEC-2026-0222). Every patched line the advisory allows — 46.0.2+ and
47.0.3+ — pulls cranelift crates requiring Rust 1.94, so the fix is not a
dependency bump on its own; the toolchain has to move with it. That is why this
lands as one change rather than two: neither half compiles without the other.
Toolchain 1.93 -> 1.94.1 in every place it is pinned: rust-toolchain.toml, the
two CI workflow pins (sdlc-lint, runtime-exec-e2e), and the four service
Dockerfiles. `rust:1.94-slim` was confirmed to exist before relying on it —
a missing tag would have broken every container build while the local builds
stayed green.
wasmtime 45.0.2 -> 46.0.2 (with wasmtime-wasi, which is release-synced). Chose
the 46 line over 47 because it is the smaller step that clears the advisory, and
it needed no source changes at all.
The one thing the new toolchain broke is a tightened `clippy::result_large_err`
on the exec server's interceptor closure, over tonic's 176-byte `Status`. Both
halves of that signature are tonic's: `Interceptor` requires exactly
`FnMut(Request<()>) -> Result<Request<()>, Status>`, so the error cannot be
boxed without failing to implement the trait. Allowed with that reason, matching
the identical allow already on `validate_first_frame` in the same file.
Verified on 1.94.1 across all five Rust services:
clippy --all-targets -D warnings clean
rustfmt --check clean
cargo audit clean — 0221 and 0222 both gone
tests: gateway 31, model-router 38, surface-gateway 63, harness 155,
runtime-manager 350
Includes the event-listener 5.4.2 bump (RUSTSEC-2026-0221) from the branch this
is based on, so the vuln gate can actually reach green here.
🔎 Codex cross-audit (agent:audit)Blocking: none found. Findings:
Verification limits: I could not run Cargo/rustc checks because the sandbox is read-only and |
🔷 Gemini cross-audit (agent:audit-gemini)🚨 BLOCKING REGRESSION1. Compilation Failure in
|
🔷 Gemini cross-audit (agent:audit-gemini)Audit Findings for
|
🔎 Codex cross-audit (agent:audit)Blocking: none found. I did not find additional correctness or security regressions in Verification notes:
|
Closes the
vulngate, which is currently red onmaster.Why one PR and not two
wasmtime45.0.3 is affected by RUSTSEC-2026-0222 (Stores can mix up type indices between engines). Every patched line the advisory allows — 46.0.2+ and 47.0.3+ — pulls cranelift crates that require Rust 1.94. So the dependency fix does not compile without the toolchain move; neither half stands alone.Changes
rust-toolchain.toml, two CI workflow pins (sdlc-lint,runtime-exec-e2e), and four service Dockerfiles. Confirmedrust:1.94-slimexists before relying on it — a missing tag would have broken every container build while local builds stayed green.wasmtime-wasi, release-synced). Chose the 46 line over 47: smaller step that clears the advisory, and it needed no source changes.clippy::result_large_err, which fires on the exec server's interceptor closure over tonic's 176-byteStatus. Both halves of that signature are tonic's —Interceptorrequires exactlyFnMut(Request<()>) -> Result<Request<()>, Status>— so the error cannot be boxed without failing to implement the trait. Allowed with that reason, matching the identical allow already onvalidate_first_framein the same file.Verification (Rust 1.94.1, all five Rust services)
clippy --all-targets -D warningsrustfmt --checkcargo auditNote on #208
This branches off
fix/rustsec-2026-0221, so it includes the event-listener 5.4.2 bump — otherwisevulncould not go green here (it would still fail on the other advisory). Merging this makes #208 redundant; close it, or merge it first and this rebases cleanly.