COOLJAPAN
← All posts

OxiQUIC 0.2.1 Released — Anti-Amplification, Per-Path Congestion Control, and ECN Close the RFC 9000 Security Gaps

OxiQUIC 0.2.1 closes five RFC 9000 security gaps — spoofed-source reflection amplification, unbounded per-stream and CRYPTO-buffer memory growth, and a forgeable Retry handshake — adds bidirectional ECN (RFC 9000 §13.4 / RFC 9002 §7.4) and true per-path congestion control for multipath, and ships runnable QUIC/HTTP-3 examples. 445 tests passing, the sovereign Pure Rust QUIC layer for the COOLJAPAN ecosystem.

release oxiquic pure-rust cooljapan noffi quic networking security http3

A QUIC server that reflects three times the traffic it receives at a spoofed address is not a transport bug — it’s a DDoS amplifier with your name on it.

Today we released OxiQUIC 0.2.1 — a security-hardening release for the COOLJAPAN Pure Rust QUIC transport and HTTP/3 stack. It closes five distinct RFC 9000 gaps that let an attacker turn a well-behaved QUIC endpoint into a reflection amplifier or a memory-exhaustion target, adds full bidirectional ECN support, and gives multipath connections real per-path congestion control instead of one shared average.

No ring. No aws-lc-rs. No FFI, no -sys crates on the path you actually ship. OxiQUIC builds its RFC 9000/9001/9002 stack directly on the rustls::quic TLS 1.3 API, driven by an in-house Pure Rust crypto provider over tokio UDP — compiles to a single static binary with no system libraries and no build-time C toolchain in the way.

Why OxiQUIC 0.2.1 is a game changer

Five separate cracks in the RFC 9000 security model, each independently exploitable, all fixed in the same release:

OxiQUIC 0.2.1 ends all of that.

One thing to know before you upgrade: RFC 9000 §7.3 requires both endpoints to send initial_source_connection_id, and 0.2.1 now correctly rejects a peer that omits it. OxiQUIC ≤ 0.2.0 never sent that transport parameter, so 0.2.1 cannot complete a handshake with an OxiQUIC ≤ 0.2.0 peer — both sides need to upgrade together. Interop with other RFC 9000 implementations is unaffected; they always sent it.

Technical Deep Dive: where the hardening lives

  1. Anti-amplification and path validation (oxiquic-transport::connection, endpoint). Per-path allowance tracking now lives alongside the existing handshake-path accounting, and a new path-validation timer (RFC 9000 §8.2.1/§8.2.3/§8.2.4) replaces an unanswered PATH_CHALLENGE with a fresh-nonce one on PTO expiry, doubling the interval per attempt and abandoning validation cleanly after three tries.
  2. Retry authentication (Connection::new_server_after_retry, RetryTranscript). The full §7.3 connection-ID transcript is captured and verified, and the bundled server endpoint wires it in automatically — no opt-in required.
  3. ECN, both directions (oxiquic-transport::ecn, endpoint::ecn_recv). Connection::handle_datagram_with_meta takes a DatagramMeta carrying the datagram’s source address and IP ECN codepoint; it’s counted per RFC 9000 §13.4.1 and echoed back as an ACK-ECN (0x03) frame. On an unsupported platform or a kernel that refuses the socket option, the reason is typed (EcnRecvUnsupported::Platform/::SockOpt) — nothing is synthesized, and a missing codepoint is never silently counted as Not-ECT.
  4. Per-path recovery (multipath::PathRecovery). Every sent packet now records the path it went out on, so acks, losses, and CE marks attribute correctly — the piece multipath scheduling needed to rank paths by their own RTT and bandwidth instead of a connection-wide blend.
  5. Runnable examples (oxiquic/examples). quic_echo_server/quic_echo_client (a self-signed loopback echo pair, --features dangerous) and h3_get (a self-contained HTTP/3 GET round trip, --features h3) mirror the README quick-start snippets and are compiled by cargo build --examples.

Getting Started

[dependencies]
oxiquic = "0.2.1"

Open a QUIC connection and a bidirectional stream:

use oxiquic::prelude::*;
use std::net::SocketAddr;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr: SocketAddr = "93.184.216.34:443".parse()?;
    let conn = oxiquic::connect(addr, "example.com").await?;
    let (stream_id, mut send, mut recv) = conn.open_bidi().await?;
    // ... write/read via AsyncWrite / AsyncRead
    Ok(())
}

Or run the new echo example directly:

cargo run --example quic_echo_server -p oxiquic --features dangerous
cargo run --example quic_echo_client -p oxiquic --features dangerous

What’s New in 0.2.1

Tips

This is the foundation

OxiQUIC belongs to NoFFI — the COOLJAPAN initiative to replace every C/C++/Fortran/-sys FFI dependency in the Rust ecosystem with a clean, memory-safe, 100% Pure Rust implementation. A security release that closes reflection-amplification and memory-exhaustion vectors is exactly the kind of hardening that keeps a “safe by construction” transport credible under real attack traffic, not just under a fuzzer.

OxiQUIC sits underneath a growing list of sibling COOLJAPAN projects: OxiHTTP and OxiRPC carry it as their HTTP/3 and QUIC transport layer, and MielinOS uses it for its networking stack. The crypto provider stands on OxiCrypto, and the optional TLS provider plugs into OxiTLS, keeping the entire handshake path Pure Rust from the AEAD up to the certificate chain.

Repository: https://github.com/cool-japan/oxiquic

Star the repo if you want a QUIC stack that closes reflection-amplification vectors instead of shipping them by default. ⭐

The era of “well, ring handles the crypto so it’s probably fine” is over. Pure Rust QUIC — hardened, safe, and sovereign — is here.

KitaSan at COOLJAPAN OÜ August 6, 2026

↑ Back to all posts