Nginx QUIC/HTTP-3 DCID Length Heap Overflow Lab (CVE-2026-0211)
by Hamza Arda Karabacak (student), advised by Keyvan Arasteh — İstinye University, "Sızma Testi" (Penetration Testing) course BGT006 · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-0211 (repository explicitly labels this as a hypothetical/simulated CVE for coursework, not a confirmed vendor-assigned vulnerability)
- Category
- web
- Affected product
- A custom, deliberately vulnerabilized fork of Nginx 1.25.3's QUIC transport module (ngx_event_quic_transport.c), run inside a purpose-built Docker lab — not the stock upstream Nginx release
- Affected versions
- Lab-modified Nginx 1.25.3 with HTTP/3 (QUIC) enabled and DCID length bounds-checking intentionally weakened
- Disclosed
- 2026-07-05
- Patch status
- unpatched
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-06 |
| Author / Researcher | Hamza Arda Karabacak (student), advised by Keyvan Arasteh — İstinye University, “Sızma Testi” (Penetration Testing) course BGT006 |
| CVE / Advisory | CVE-2026-0211 (repository explicitly labels this as a hypothetical/simulated CVE for coursework, not a confirmed vendor-assigned vulnerability) |
| Category | web |
| Severity | High |
| CVSS Score | Not specified in source — repository states this is a simulated/educational scenario and does not claim a real-world CVSS score |
| Status | PoC |
| Tags | nginx, quic, http-3, heap-overflow, dos, fuzzing, dcid, academic-lab, docker |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | A custom, deliberately vulnerabilized fork of Nginx 1.25.3’s QUIC transport module (ngx_event_quic_transport.c), run inside a purpose-built Docker lab — not the stock upstream Nginx release |
| Versions Affected | Lab-modified Nginx 1.25.3 with HTTP/3 (QUIC) enabled and DCID length bounds-checking intentionally weakened |
| Language / Platform | Python (recon/DoS/fuzzer scripts, Scapy), C (target patch/diff), Docker Compose |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
This repository is a university penetration-testing course project that models a hypothetical heap buffer overflow in Nginx’s QUIC (HTTP/3) packet parser, where the Destination Connection ID (DCID) length field is not properly bounds-checked before being used to read/copy the DCID bytes. The lab target is a custom-built, intentionally vulnerable Nginx container (not real-world production Nginx) fronting a mock “enterprise security gateway” website inside an isolated Docker network. Included Python tooling probes for QUIC/HTTP-3 support, crafts QUIC Initial packets with an oversized DCID length (0xFF / 255 bytes against an expected max of ~20), and either fuzzes the target with Scapy-crafted packets or floods it with malformed packets across many threads to trigger crashes/resource exhaustion. A companion patch under src/savunma/ demonstrates the defensive fix (stricter DCID length + buffer-bounds validation) that closes the simulated hole. Framed honestly, this is an academic reproduction of a QUIC parser bug class rather than an exploit against a currently-shipping Nginx release.
Vulnerability Details
Root Cause
The lab’s modified QUIC transport parser accepts a DCID length value that exceeds NGX_QUIC_CID_LEN_MAX (and specifically the sentinel value 0xFF) without rejecting the packet, allowing a crafted DCID length to drive an out-of-bounds read/copy from the packet buffer into a fixed-size heap-allocated CID structure.
Attack Vector
- Attacker runs
01_recon.pyto send a dummy QUIC Initial packet over UDP and confirm the target answers on the HTTP/3 port. - Attacker (via
fuzzer.py) crafts a QUIC long-header Initial packet withdcid_len = 0xFFfollowed by 255 bytes of filler, and a normal-looking SCID, and sends it with Scapy. - The lab-vulnerable parser copies the oversized DCID into a fixed-size heap buffer without validating the length against the buffer capacity, corrupting adjacent heap memory (detected via ASAN in the lab’s target container).
- Alternatively,
03_dos.pyrepeatedly floods the same malformed-DCID payload from many threads to exhaust CPU/memory and deny service. - Analysts inspect the target container’s ASAN/Nginx logs to confirm the crash and root-cause the overflow.
Impact
In the lab environment: heap memory corruption and process crash (denial of service) in the simulated Nginx QUIC parser, with the accompanying RCE payload template illustrating how a real-world equivalent bug of this class could theoretically be leveraged for code execution — this specific repository does not demonstrate actual code execution against production Nginx.
Environment / Lab Setup
Target: Docker container "target_nginx" — custom lab-patched Nginx 1.25.3 with HTTP/3 (10.13.37.10:443)
Attacker: Docker Compose, Python 3 with scapy, internal bridge network 10.13.37.0/24
Proof of Concept
PoC Script
See
src/saldiri/01_recon.py,src/saldiri/03_dos.py,src/saldiri/fuzzer.py,src/saldiri/payloads/,src/savunma/CVE-2026-0211-defense.patch, anddocker-compose.ymlin this folder.
| |
01_recon.py confirms QUIC/HTTP-3 is reachable; fuzzer.py sends a single crafted malformed-DCID QUIC Initial packet via Scapy to trigger the overflow; 03_dos.py repeats a similar malformed packet across multiple threads for sustained denial-of-service testing. Crash evidence is checked via the target container’s ASAN logs.
Detection & Indicators of Compromise
Signs of compromise:
- Nginx worker crashes or restarts correlated with inbound QUIC Initial packets carrying
dcid_lennear or at0xFF - Spikes in malformed UDP/443 traffic from a small number of source IPs
- ASAN/crash logs referencing
ngx_event_quic_transport.cDCID parsing
Remediation
| Action | Detail |
|---|---|
| Primary fix | No vendor patch applicable — this targets a course-authored, deliberately vulnerable Nginx fork, not a shipping release; the repo’s own CVE-2026-0211-defense.patch adds strict idlen > NGX_QUIC_CID_LEN_MAX || idlen == 0xFF bounds checking plus a buffer-length validation before the DCID read |
| Interim mitigation | For real-world deployments, keep Nginx/QUIC builds current, restrict HTTP/3 exposure where not needed, and monitor for malformed QUIC Initial packets at the network edge |
References
Notes
Mirrored from https://github.com/frudotz/ISU-SecOps-Nginx-RCE on 2026-07-05.