fix(deps): clear RUSTSEC-2026-0285 by bumping rustls to 0.23.45 - #1460
Merged
Merged
Conversation
The `cargo-deny` job has been red on `main` since 78a11ec, and on PR #1459, for one reason: `advisories FAILED` against `rustls 0.23.43`. Every other job in both runs passed, so the failure is not attributable to either change — the advisory was published against a version the lockfile already carried, which is why a dependency-free commit turned CI red. RUSTSEC-2026-0285: rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level when they followed a key-changing message in the same record — a plaintext `EncryptedExtensions` packed into the `ServerHello` record, for example — where RFC 8446 section 5.1 requires the connection be terminated with an `unexpected_message` alert. The handshake transcript remains authenticated, so a network-position attacker can neither alter nor complete a handshake; the practical effect is that a peer may send in plaintext handshake messages that should have been encrypted without rustls rejecting the connection. Functionally the same bug as Go's GO-2026-4340 (CVE-2025-61730). `rustls` reaches this workspace only as a dev-only transitive dependency (`jsonschema` -> `reqwest` -> `hyper-rustls` / `tokio-rustls` / `rustls-platform-verifier`), so no shipped code path negotiates TLS through it and no published crate's dependency graph changes. The fix is therefore a lockfile bump to the advisory's minimum fixed release, 0.23.45. The diff is deliberately two lines. `cargo update -p rustls` also re-resolved `tempfile`'s `getrandom` edge from `0.4.3` to `0.3.4` — incidental churn, since `tempfile 3.27.0` requires `>=0.3.0, <0.5` and both versions remain in the lock through other dependents. That hunk is reverted; `cargo metadata --locked` accepts the result without re-resolving, so the minimal lockfile is stable rather than something the next cargo invocation would churn back. No pinning test accompanies this, unlike `h2`/RUSTSEC-2026-0258 in `big-code-analysis-web/src/lockfile_tests.rs`. That test exists because krates filters `h2 0.3.27` out of the graph before cargo-deny's checks run, leaving the advisory gate blind. `rustls` is in the graph and the gate saw it — a second guard over the same lockfile line would be redundant with a check that already works. Verified: `cargo deny --log-level warn --manifest-path ./Cargo.toml --all-features check advisories bans licenses sources` (CI's exact invocation) exits 0 with `advisories ok, bans ok, licenses ok, sources ok`; `make pre-commit` reports `BCA_GATE: pass (gate=pre-commit)`.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1460 +/- ##
=======================================
Coverage 97.97% 97.98%
=======================================
Files 359 359
Lines 93425 93425
Branches 92994 92994
=======================================
+ Hits 91533 91542 +9
+ Misses 1224 1216 -8
+ Partials 668 667 -1
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
dekobon
added a commit
that referenced
this pull request
Sep 14, 2026
Brings in #1460 (rustls 0.23.45, clearing RUSTSEC-2026-0285) and #1452 (single-language feature subsets build their tests again). The only conflict was `CHANGELOG.md`, where both sides inserted at the top of `### Fixed` — additive on both sides, so both are kept. The rustls entry merged cleanly into `### Security`. `.bca-baseline.toml` is `-merge` in `.gitattributes` and would have come back wholly conflicted had both sides touched it; main did not, so the branch's regenerated values carry through unchanged. Nothing main brings in moves a metric: its changes are CI config, a lockfile, a changelog and a test file.
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.
What broke
The
cargo-denyjob is red onmain(run 34870318030, commit 78a11ec) and on PR #1459 (run 34870039784). In both runscargo-denyis the only failing job — theciaggregator job then fails because it gates on it.Neither change is at fault. The advisory was published against a version the lockfile already carried, so the next commit to touch
mainturned CI red regardless of its content.#1459inherits the same failure from its base.The advisory
RUSTSEC-2026-0285 / GHSA-2mjx-qc3c-rqvc: rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level when they followed a key-changing message in the same record — a plaintext
EncryptedExtensionspacked into theServerHellorecord, for example — where RFC 8446 §5.1 requires the connection be terminated with anunexpected_messagealert.The handshake transcript remains authenticated, so a network-position attacker can neither alter nor complete a handshake. The practical effect is that a peer may send in plaintext handshake messages that should have been encrypted, without rustls rejecting the connection. Functionally the same bug as Go's GO-2026-4340 (CVE-2025-61730).
Exposure here is nil.
rustlsis a dev-only transitive dependency:No shipped code path negotiates TLS through it, and no published crate's dependency graph changes.
The fix
A lockfile bump to the advisory's minimum fixed release:
Three notes on why the diff is exactly two lines:
cargo update -p rustlsalso re-resolvedtempfile'sgetrandomedge from0.4.3to0.3.4. That is churn, not a fix:tempfile 3.27.0requires>=0.3.0, <0.5and both versions remain in the lock through other dependents.cargo metadata --lockedaccepts the reverted lockfile without re-resolving, so the minimal form is stable rather than something the next cargo invocation churns back.Locking 1 package to latest Rust 1.94 compatible version; themsrv (1.94)job covers it.h2/RUSTSEC-2026-0258 inbig-code-analysis-web/src/lockfile_tests.rs. That test exists because krates filtersh2 0.3.27out of the graph before cargo-deny's checks run, leaving the advisory gate blind — asdeny.tomlrecords.rustlsis in the graph and the gate saw it, so a second guard over the same lockfile line would be redundant with a check that already works.A
### Securityentry is added toCHANGELOG.mdunderUnreleased, matching how the previous advisory clears at2.1.0and2.0.0were recorded.Verification
cargo deny --log-level warn --manifest-path ./Cargo.toml --all-features check advisories bans licenses sources— CI's exact invocation — exits0:advisories ok, bans ok, licenses ok, sources ok.make pre-commit→BCA_GATE: pass (gate=pre-commit).make lintexits0with the changelog edit in place.Merging this should also clear the
cargo-denyleg on #1459 once it picks upmain.