PoC Archive PoC Archive
High CVE-2026-0211 (repository explicitly labels this as a hypothetical/simulated CVE for coursework, not a confirmed vendor-assigned vulnerability) unpatched

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

Metadata

FieldValue
Date Added2026-07-05
Last Updated2026-06
Author / ResearcherHamza Arda Karabacak (student), advised by Keyvan Arasteh — İstinye University, “Sızma Testi” (Penetration Testing) course BGT006
CVE / AdvisoryCVE-2026-0211 (repository explicitly labels this as a hypothetical/simulated CVE for coursework, not a confirmed vendor-assigned vulnerability)
Categoryweb
SeverityHigh
CVSS ScoreNot specified in source — repository states this is a simulated/educational scenario and does not claim a real-world CVSS score
StatusPoC
Tagsnginx, quic, http-3, heap-overflow, dos, fuzzing, dcid, academic-lab, docker
RelatedN/A

Affected Target

FieldValue
Software / SystemA 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 AffectedLab-modified Nginx 1.25.3 with HTTP/3 (QUIC) enabled and DCID length bounds-checking intentionally weakened
Language / PlatformPython (recon/DoS/fuzzer scripts, Scapy), C (target patch/diff), Docker Compose
Authentication RequiredNo
Network Access RequiredYes

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

  1. Attacker runs 01_recon.py to send a dummy QUIC Initial packet over UDP and confirm the target answers on the HTTP/3 port.
  2. Attacker (via fuzzer.py) crafts a QUIC long-header Initial packet with dcid_len = 0xFF followed by 255 bytes of filler, and a normal-looking SCID, and sends it with Scapy.
  3. 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).
  4. Alternatively, 03_dos.py repeatedly floods the same malformed-DCID payload from many threads to exhaust CPU/memory and deny service.
  5. 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, and docker-compose.yml in this folder.

1
2
3
docker compose up -d --build
docker exec fuzzer_node python3 /fuzzer/01_recon.py 10.13.37.10 443
docker exec fuzzer_node python3 /fuzzer/03_dos.py 10.13.37.10 443 10

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_len near or at 0xFF
  • Spikes in malformed UDP/443 traffic from a small number of source IPs
  • ASAN/crash logs referencing ngx_event_quic_transport.c DCID parsing

Remediation

ActionDetail
Primary fixNo 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 mitigationFor 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.