Skip to content

fix(deps): take the rustls fix for RUSTSEC-2026-0285 - #445

Merged
emrecdr merged 1 commit into
mainfrom
fix/rustls-advisory-rustsec-2026-0285
Sep 29, 2026
Merged

emrecdr merged 1 commit into
mainfrom
fix/rustls-advisory-rustsec-2026-0285

Conversation

@emrecdr

@emrecdr emrecdr commented Sep 29, 2026

Copy link
Copy Markdown
Owner

main has been red for two weeks, and not because of anything anyone merged.

Diagnosis

The cargo-deny job fails on RUSTSEC-2026-0285. The proof that this is
time-based rather than change-based is that the identical commit flipped
verdict:

CI run Commit cargo-deny
2026-09-10 ccf6340b success
2026-09-14 ccf6340b success
2026-09-21 ccf6340b failure
2026-09-28 ccf6340b failure

The advisory was published between the 14th and the 21st. Every open pull
request inherits the failure, which is why the Dependabot runs look broken —
neither #442 nor #444 caused it, and #442 does not contain rustls, so
merging it would not clear it either.

The advisory

rustls before 0.23.45 accepts TLS 1.3 handshake messages across an
encryption-level boundary rather than terminating with an unexpected_message
alert, as RFC 8446 §5.1 requires. The handshake transcript stays authenticated,
so a network-position attacker cannot alter or complete a handshake — it is a
conformance defect, not an authentication break, and the same bug as Go's
CVE-2025-61730.

It reaches us through ureq, in two places:

  • Runtime — [dependencies], whose only caller is
    enrichment/client.rs, the advisory narrative layer's HTTPS client. Exposure
    is limited to runs that opt into narratives and contact a model endpoint.
  • Build — [build-dependencies], where build.rs fetches the SPA's
    vendored JavaScript under the spa feature that released binaries enable.
    The SHA pinning bounds this half: altered bytes fail the digest check rather
    than being embedded.

The fix

Lockfile only. rustls 0.23.40 → 0.23.45 and rustls-webpki 0.103.13 →
0.103.15 are patch releases inside the range already requested, so no manifest
change is needed.

Verification

  • Probed, not assumed. cargo deny check advisories reproduces
    RUSTSEC-2026-0285 on the old lockfile and reports advisories ok on the new
    one — so the pass comes from the bump, not from a stale local advisory DB.
  • cargo deny check — advisories ok, bans ok, licenses ok, sources ok.
  • cargo clippy --workspace --all-targets --all-features -- -D warnings clean.
  • cargo fmt --all --check clean.
  • 822 lib unit, 137 CLI, 39 MCP tests pass.

Once this lands, #442 and #444 need their branches updated to pick it up
before their own cargo-deny will go green.

https://claude.ai/code/session_01LRZ8yoFPCFgfZ8raBUeDeP

rustls before 0.23.45 accepts TLS 1.3 handshake messages across an
encryption-level boundary instead of terminating the connection with an
`unexpected_message` alert, as RFC 8446 section 5.1 requires. The transcript
stays authenticated, so this is a conformance defect rather than a break of
authentication, but a peer can send in plaintext handshake messages that
belong after the key change and rustls will not reject them.

It reaches us through `ureq`: a runtime dependency whose only caller is the
enrichment layer's HTTPS client, and a build dependency where `build.rs`
fetches the SPA's vendored JavaScript under the `spa` feature that released
binaries enable. The SHA pinning bounds the build-time half, since altered
bytes fail the digest check rather than being embedded.

Lockfile only -- `rustls` 0.23.40 -> 0.23.45 and `rustls-webpki` 0.103.13 ->
0.103.15 are patch releases inside the range already requested, so no
manifest changes.

This is why `cargo-deny` has been failing: the identical commit ccf6340
passed the gate on 2026-09-14 and failed it on 2026-09-21 and 2026-09-28,
so `main` has been red on a published advisory rather than on any change,
and every open pull request inherits that failure. Verified by probe --
`cargo deny check advisories` reproduces RUSTSEC-2026-0285 on the old
lockfile and reports `advisories ok` on the new one.

Claude-Session: https://claude.ai/code/session_01LRZ8yoFPCFgfZ8raBUeDeP
@emrecdr
emrecdr merged commit 36227b3 into main Sep 29, 2026
14 checks passed
@emrecdr
emrecdr deleted the fix/rustls-advisory-rustsec-2026-0285 branch September 29, 2026 05:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant