Skip to content

Rebase onto quinn-proto 0.11.14 (SPO-428 / GHSA-6xvm-j4wr-6v98)#4

Merged
Kristopher Johnson (kristopherjohnson) merged 44 commits intomainfrom
kj/spo-428/rebase-quinn-proto-0.11.14
Apr 23, 2026
Merged

Rebase onto quinn-proto 0.11.14 (SPO-428 / GHSA-6xvm-j4wr-6v98)#4
Kristopher Johnson (kristopherjohnson) merged 44 commits intomainfrom
kj/spo-428/rebase-quinn-proto-0.11.14

Conversation

@kristopherjohnson
Copy link
Copy Markdown

Summary

Rebases Ditto's quinn fork onto the upstream quinn-proto-0.11.14 tag, which contains the fix for GHSA-6xvm-j4wr-6v98 — an unauthenticated remote DoS via panic during QUIC transport-parameter parsing.

Linear: SPO-428

Commits on top of quinn-proto-0.11.14

  1. build(deps): bump aws-lc-rs from 1.9 to 1.16.2 — Ditto security bump (was b7999e7b on sp/if_index). Picks up aws-lc-sys 0.39.1 / aws-lc-fips-sys 0.13.14 which address GHSA-9f94-5g5w-gf6r, GHSA-hfpc-8r3f-gw53, GHSA-65p9-r9h6-22vj.
  2. Add interface_index to RecvMeta — Ditto feature used by L2DS (was 8b91782a on sp/if_index).
  3. DO NOT MERGE! DIVERGENCE FROM STANDARD FOR DITTO USAGE ONLY — Ditto source-IP-check bypass required for L2DS implicit migration (was 20c9db08 on pa/non-standard/disable-ip-src-checks). See #1 for rationale.

The source-IP-check patch commit carries a one-line #[allow(clippy::collapsible_if)] added during this rebase because upstream's clippy lints now flag the intentionally nested if used to keep the patch easily revertible.

Verification

Ran on macOS (aarch64-apple-darwin) in this worktree:

  • cargo check --all-targets → clean
  • cargo test --all-targets → all default-member tests pass (263 in quinn-proto, 17 in quinn, 7 in quinn-udp)
  • cargo fmt --check → clean
  • cargo clippy --locked --all-targets -- -D warnings → clean
  • cargo check --locked --manifest-path quinn/Cargo.toml --all-targets --no-default-features → clean

The fuzz/ member fails to build on upstream quinn-proto-0.11.14 itself (API drift on Streams::new/SendStream::new); this is a pre-existing issue in the upstream release branch and not caused by this PR. It is not in default-members.

Notes for reviewers

  • Please do not squash. The three Ditto-specific commits should remain identifiable so future rebases onto newer quinn-proto versions stay mechanical.
  • Ditto's main repo (getditto/ditto) currently references branch = "sp/if_index" for quinn, quinn-udp, and quinn-proto. Updating that reference to consume this branch (or a specific rev from it) is out of scope for this PR and will be handled separately in getditto/ditto.

Aligns with 100 columns, attempts to improve clarity, takes inspiration
from tokio::io::AsyncWriteExt docs.
Co-authored-by: Benjamin Saunders <ben.e.saunders@gmail.com>
Bumps [url](https://github.com/servo/rust-url) from 2.5.4 to 2.5.7.
- [Release notes](https://github.com/servo/rust-url/releases)
- [Commits](https://github.com/servo/rust-url/commits)

---
updated-dependencies:
- dependency-name: url
  dependency-version: 2.5.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 4 to 5.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](actions/setup-java@v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.142 to 1.0.143.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](serde-rs/json@v1.0.142...v1.0.143)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-version: 1.0.143
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Dirkjan Ochtman (djc) and others added 14 commits August 31, 2025 17:48
```
warning: called `unwrap` on `self.exit_probe_rtt_at` after checking its variant with `is_none`
   --> quinn-proto/src/congestion/bbr/mod.rs:247:48
    |
238 |             if self.exit_probe_rtt_at.is_none() {
    |             ----------------------------------- help: try: `if let Some(<item>) = self.exit_probe_rtt_at`
...
247 |             } else if is_round_start && now >= self.exit_probe_rtt_at.unwrap() {
    |                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap
    = note: `#[warn(clippy::unnecessary_unwrap)]` on by default
```
   aws-lc-rs from 1.9 to 1.16.2

   Fixes security vulnerabilities in aws-lc dependencies:
   - aws-lc-sys updated to 0.39.1 (fixes GHSA-9f94-5g5w-gf6r,
   GHSA-hfpc-8r3f-gw53)
   - aws-lc-fips-sys updated to 0.13.14 (fixes GHSA-65p9-r9h6-22vj)
# How to handle this commit?

- This commit is intended to be used by Ditto as its `quinn-proto` vendored dependency.
- This commit SHOULD NOT be merged in `main`, but stay in a separate branch, which should be rebased
  on `main@upstream` regularly.

# Why does this commit exist?

The QUIC standard imposes that packets originating from an unvalidated path be discarded (unless
they are specifically probing packets in response to a `PATH_CHALLENGE`, which can only be started
once the handshake is completed).

This conflicts heavily with our usage in Ditto, where we perform "implicit server address migration"
as a way for peers to discover each other's link-local address for unicast links.

This implicit migration is performed by allowing the client to address the server through an
arbitrary "jumpstart" address; the server then responds, continuing the handshake, using its actual
link-local IPv6 as the `src_ip` for its datagrams. From that point onwards, packets from the client
will target this newly learnt IP.

This is no less secure than discarding packets based on source IP, as spoofing that IP is trivial;
the security being instead provided by cryptography that doesn't take IP headers into account.

Note that this implicit migration is not implemented here, but is _enabled_ by this commit.

The implicit migration is performed by keeping track of a packet's source IP, and setting it as the
peer's new IP from the moment the packet has been validated cryptographically; typically by
observing that `quinn-proto` raised an event pertaining to it.
@busec0
Copy link
Copy Markdown
Member

Kristopher Johnson (@kristopherjohnson) good to merge this?

@kristopherjohnson Kristopher Johnson (kristopherjohnson) merged commit 91ba148 into main Apr 23, 2026
3 checks passed
@kristopherjohnson Kristopher Johnson (kristopherjohnson) deleted the kj/spo-428/rebase-quinn-proto-0.11.14 branch April 23, 2026 17:03
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.