Skip to content

chore(deps): move rustls to 0.23.46 and quinn-proto to 0.11.18 for RustSec advisories - #46

Merged
grumbach merged 2 commits into
WithAutonomi:mainfrom
grumbach:chore/rustls-0.23.46
Oct 20, 2026
Merged

grumbach merged 2 commits into
WithAutonomi:mainfrom
grumbach:chore/rustls-0.23.46

Conversation

@grumbach

@grumbach grumbach commented Oct 16, 2026 •

Copy link
Copy Markdown
Member

Linear issue

Closes V2-1595

Risk tier

  • T0 — docs / tooling / CI / pure UX-output. Repo CI only.
  • T1 — client-only, no network-facing behavior change. CI + prod compat smoke.
  • T2 — node/client logic with behavioral surface, no protocol/format/economics change. Dev testnet + ADR.
  • T3 — protocol / storage format / payments / routing. T2 evidence + adversarial testing.

Proposed rather than asserted. A library's Cargo.lock is only used when this repo is the workspace root: crates that depend on ant-protocol resolve their own lockfiles, so this changes what this repo's CI and tests build, not what ships downstream. Besides the four advisory fixes, 0.23.46 tightens TLS handling (stricter handshake checks, key-update and I/O fixes); the code builds unchanged on it and the tests below pass. WithAutonomi/saorsa-transport#190 made the same rustls move as T1. The second commit moves quinn-proto, which no build here compiles, the same kind of lockfile-only move as WithAutonomi/ant-node#251 (T1).

Compatibility

  • Wire: none for the Autonomi protocol and its message formats. TLS handling gets stricter: 0.23.46 rejects more malformed or nonconforming handshake and record input, and fixes key updates and I/O. quinn-proto is not compiled, so its move changes nothing that is built.
  • Storage: none.
  • API: none. No manifest and no source file is touched; this is the lockfile only.

Semver impact

  • breaking
  • feature
  • fix

Test evidence

Run on this branch, two commits on top of main at 9ae38dd3, with the RustSec database at its current head (999ec89d).

  • cargo audit: on main's own Cargo.lock it reports nine vulnerabilities, the four rustls advisories (RUSTSEC-2026-0346 to RUSTSEC-2026-0349) and the five quinn-proto advisories (RUSTSEC-2026-0338 to RUSTSEC-2026-0342). After the first commit only the five quinn-proto ones remain; at this head it reports none and exits 0. The same eight warnings (unmaintained, unsound or yanked crates) appear on main and at every step; they do not fail the job.
  • cargo tree --locked --workspace --all-features --target all -e normal,build,dev --prefix none | sort -u: 586 unique lines on main and on this branch, identical except rustls v0.23.45 becoming rustls v0.23.46. The quinn-proto commit changes nothing in that output.
  • cargo metadata --locked accepts the lockfile on cargo 1.88 (older than the 1.91 MSRV), 1.95, 1.98 and 1.99, and cargo update --dry-run finds nothing to change for either -p rustls --precise 0.23.46 or -p quinn-proto --precise 0.11.18.
  • The checksums are the real ones: the cached rustls-0.23.46.crate hashes to 48e13bd8… and quinn-proto-0.11.18.crate to a9746dbd…, each the same as the crates.io sparse index, and neither release is yanked.
  • The published 0.23.45 and 0.23.46 have the same dependency requirements and rust-version (1.71). The published quinn-proto 0.11.16 and 0.11.18 have the same dependency requirements, features and rust-version (1.85), and quinn 0.11.11, the only lockfile entry that depends on it, requires ^0.11.15. So both entries' dependency lists are still correct.
  • On Rust 1.99.0: cargo fmt --all -- --check, cargo clippy --locked --all-targets --all-features -- -D warnings (CI's flags, plus --locked), cargo clippy --locked -- -D warnings, cargo doc --locked --all-features --no-deps with RUSTDOCFLAGS=--deny=warnings, cargo build --locked --no-default-features and cargo publish --locked --dry-run: all exit 0. Both Clippy runs, the documentation build and the test runs below also print Cargo's future-incompatibility note for proc-macro-error2 2.0.1, a dependency this PR leaves as main has it.
  • Tests on Rust 1.99.0, with CI's flags plus --locked: --all-features 109 passed, including the Anvil-backed payment::single_node tests; --no-default-features 105 passed; --no-default-features --features rpc 105 passed.
  • Production compatibility smoke: an ant binary built from ant-client commit 33b78931 (this change's ant-client counterpart, linking rustls 0.23.46) connected to the production network (six peers) and downloaded a 54,903,201-byte public file in 78.4 s. Separately, ant-node v0.21.0, v0.22.0, v0.23.0-rc.1 and v0.23.0 all lock rustls 0.23.45; the smoke log does not record which versions the peers it fetched from run.

New dependency

None. Two existing lockfile entries move: rustls from 0.23.45 to 0.23.46 and quinn-proto from 0.11.16 to 0.11.18. No entry is added or removed.

ADR

n/a, Tier 1.

Mitigation / rollback

Revert the two commits, together or either one alone. They touch only Cargo.lock, so there is nothing to migrate either way.


What this is

The Security Audit job fails on four advisories against rustls 0.23.45, all fixed in 0.23.46, and on five against quinn-proto 0.11.16, all fixed in 0.11.18. This PR moves both lockfile entries, one commit each.

rustls

The four advisories reached the RustSec database on 2026-10-14.

  • RUSTSEC-2026-0346: the Debug impls of client session values print the TLS 1.2 master secret or TLS 1.3 resumption PSK.
  • RUSTSEC-2026-0347: after an Encrypted Client Hello rejection, buffered application data goes to the outer server.
  • RUSTSEC-2026-0348: Brotli certificate decompression can allocate up to 1 GiB before authentication.
  • RUSTSEC-2026-0349: an unauthenticated ServerHello can make later connections to that server name use classical key exchange only.

Exposure depends on configuration. The brotli feature is off, so 0348 cannot trigger, and nothing in this repo or in the compiled crates that use rustls here (saorsa-transport, reqwest, hyper-rustls, tokio-rustls, rustls-platform-verifier, rustls-post-quantum; quinn and quinn-proto also depend on it but are lockfile-only and never compiled) enables ECH or implements a custom ClientSessionStore, so 0346 and 0347 do not apply. 0349 is the one that can apply: client session resumption is on by default, so an on-path attacker could make later connections to a server name use classical-only key exchange, as long as the genuine server accepts that share.

quinn-proto

The five advisories (RUSTSEC-2026-0338 to RUSTSEC-2026-0342) were already reported on main's lockfile, so the Security Audit job stayed red after the rustls commit. The review asked for them to be fixed in this PR with cargo update -p quinn-proto --precise 0.11.18, which is what the second commit is. 0.11.18 is the first release that fixes all five; the newer 0.11.19 declares the same dependencies, and 0.11.18 is kept because it is the version the review tested. Only the entry's version and checksum change.

quinn-proto is in the lockfile only: cargo tree --all-features --target all -i quinn-proto lists nothing, so no build compiles it. It is there because quinn, its only dependent, is an optional dependency of reqwest behind the http3 feature, which nothing enables; Cargo still records it in the lockfile. This commit therefore clears an audit finding; it does not change any compiled code.

`cargo audit` fails on RUSTSEC-2026-0346, RUSTSEC-2026-0347,
RUSTSEC-2026-0348 and RUSTSEC-2026-0349 against `rustls` 0.23.45. All
four are fixed in 0.23.46. They reached the RustSec database on
2026-10-14.

Only the `rustls` entry in `Cargo.lock` changes (version and checksum).
0.23.45 and 0.23.46 declare the same dependencies and `rust-version`,
every existing requirement on `rustls` already allows the new patch, and
the unique package lines of `cargo tree --locked --workspace
--all-features --target all -e normal,build,dev --prefix none` differ
only in the `rustls` version.

`cargo audit` still fails after this change, on five advisories against
`quinn-proto` 0.11.16 (RUSTSEC-2026-0338 to RUSTSEC-2026-0342). That
entry is left for a separate change; `quinn-proto` is in the lockfile
only and `cargo tree` does not list it, so no build compiles it.

@dirvine dirvine left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

REQUEST_CHANGES — inherited Security Audit failure

Reviewed exact head 19479c67d8896828b34786772c7926df3932e712 against base 9ae38dd37d213e9b303e7d78cf682242d55dff37.

The Rustls update itself is correct. The remaining blocker is the failed Security Audit job at this head. Cargo.lock still selects quinn-proto 0.11.16, which matches RUSTSEC-2026-0338, 0339, 0340, 0341 and 0342. These findings are inherited from the base; this Rustls change did not introduce them. Quinn is retained only in the lockfile and is absent from the reviewed all-feature/all-target compiled dependency trees, so this is an audit-gate finding, not a claim of demonstrated runtime exposure.

Concrete minimal fix

cargo update -p quinn-proto --precise 0.11.18
cargo metadata --locked --format-version 1 --all-features
cargo audit --json

Commit the resulting narrow lockfile change and rerun CI. Alternatively, land that fix in a separate prerequisite PR, then rebase this PR and rerun CI.

I exercised this fix in a disposable checkout of this exact head. Whole-lockfile comparison found only Quinn's version and checksum changed; its dependency list stayed identical. Locked metadata exited 0. Cargo audit exited 0 with zero vulnerability matches. Existing non-fatal unmaintained/unsound/yanked warnings remain; this is not a warning-free result. No fix has been pushed, and CI has not run on that disposable change.

Checks on the submitted Rustls change

  • Complete diff: only rustls 0.23.45 -> 0.23.46 and its checksum in Cargo.lock.
  • New checksum matches both the official registry index and the downloaded crate archive SHA256. Published dependency tables, features and MSRV are unchanged.
  • Locked all-feature metadata and all-target dependency-tree checks pass on base and head.
  • The four Rustls advisory matches are cleared. The other observed CI jobs passed; Security Audit remains red.

Review coverage

The required panel is incomplete: GLM 5.3 completed the risk role; Qwen 3.8 completed both roles. GLM's verification role produced no complete final verdict, and DS4 has no completed role review. This is 3/6 completed roles from 2/3 named models, not full-panel consensus.

This request is based on the independently verified failed audit and exercised minimal fix, not on missing panel seats. The incomplete panel still prevents approval. Human risk-tier confirmation, merge and release decisions remain separate.

`cargo audit` fails on RUSTSEC-2026-0338, RUSTSEC-2026-0339,
RUSTSEC-2026-0340, RUSTSEC-2026-0341 and RUSTSEC-2026-0342 against
`quinn-proto` 0.11.16. 0.11.18 is the first release that fixes all
five.

Only the `quinn-proto` entry in `Cargo.lock` changes (version and
checksum). 0.11.16 and 0.11.18 declare the same dependencies, features
and `rust-version`, and `quinn` 0.11.11, the only lockfile entry that
depends on it, requires `^0.11.15`.

`quinn-proto` is in the lockfile only: `cargo tree --all-features
--target all -i quinn-proto` prints nothing, so no build compiles it,
and the unique package lines of `cargo tree --locked --workspace
--all-features --target all -e normal,build,dev --prefix none` are the
same before and after. With this change `cargo audit` reports no
vulnerabilities.
@grumbach grumbach changed the title chore(deps): move rustls to 0.23.46 for four RustSec advisories chore(deps): move rustls to 0.23.46 and quinn-proto to 0.11.18 for RustSec advisories Oct 20, 2026

@dirvine dirvine left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE — prior Security Audit blocker resolved

Re-reviewed #46 at head 19fd80ce9481ef02eca79e2c0807d4471ff9b851, against base 9ae38dd37d213e9b303e7d78cf682242d55dff37. This supersedes my earlier REQUEST_CHANGES.

Verified

  • The incremental commit changes only the quinn-proto version/checksum: 0.11.16 → 0.11.18, as requested. The complete PR changes only Cargo.lock: that update plus rustls 0.23.45 → 0.23.46. No other package blocks, manifests or source files change.
  • Both new checksums match the official crates.io index and SHA-256 of downloaded crate archives. Both releases are non-yanked. Published dependency requirements, features and declared Rust minimum versions are unchanged.
  • Starting from the pristine base, the two precise Cargo updates reproduce the submitted lockfile byte-for-byte.
  • Local cargo audit --json exits 0 with zero vulnerability matches, versus nine on the base, using RustSec DB 999ec89d5d3f10f20be14750ec8c2d8b44e0ac9b. All five Quinn and four Rustls matches are cleared. The same eight existing warnings remain; this is not a warning-free result.
  • Local checks on macOS/aarch64, Rust/Cargo 1.96.0: locked all-feature metadata, formatting and git diff --check pass. cargo test --locked --all-features -- --test-threads=1 passes 109 tests, zero failures or ignored tests, including Anvil-backed tests, with RUSTFLAGS=-D warnings.
  • Exact-head CI is green: 15 successful check records, 12 distinct check names, none pending. Job steps/logs confirm Security Audit, Ubuntu/macOS all-feature tests, no-default-feature and portable-RPC tests, Clippy, docs, format, WASM and publish dry-run passed.

Panel coverage and caveat checks

6/6 substantive role reviews from 3/3 named models: GLM 5.3/OpenRouter (z-ai/glm-5.3), local Qwen 3.8 (qwen38-27b) and local DS4 Flash (deepseek-v4-flash), each in correctness/verification and adversarial/security roles. All six recommend APPROVE; no blocker dissent.

Two non-blocking panel caveats were checked against source rather than accepted as facts: Qwen suggested an MSRV increase, but both Quinn versions declare Rust 1.85 and this crate declares 1.91; DS4 questioned Quinn's absence from the compiled tree, but reqwest's optional HTTP/3 feature is disabled. Its presence only in the lockfile is expected.

Rustls may tighten TLS acceptance. I did not independently repeat the author's production smoke test. This root-lockfile change does not update downstream applications' lockfiles. No remaining blocker identified; merge and release remain separate human actions.

@grumbach
grumbach merged commit 927c7e5 into WithAutonomi:main Oct 20, 2026
15 checks passed
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.

2 participants