← Back to Feed CACHED · 2026-07-31 01:45:43 · CACHE_KEY CVE-2026-42530
CVE-2026-42530 · CWE-416 · Disclosed 2026-06-17

NGINX Open Source has a vulnerability in the ngx_http_v3_module module.

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

Someone left the deadbolt unlocked, but only on two doors in a building with ten thousand, and only if you enter through the loading dock

CVE-2026-42530 is a use-after-free in NGINX Open Source's ngx_http_v3_module, specifically in the QPACK encoder stream lifecycle. When a QUIC session reopens an encoder stream, a stale pointer to stream-scoped memory persists at the connection level, allowing an unauthenticated remote attacker to crash the NGINX worker process via crafted HTTP/3 traffic over UDP/443. On systems where ASLR is disabled or bypassed, this could theoretically escalate to arbitrary code execution under the NGINX worker user (typically www-data or nginx). Only versions 1.31.0 and 1.31.1 are affected — two mainline releases, patched in 1.31.2 on June 17, 2026.

F5's vendor score of 8.1 (CVSS v3.1) and 9.2 (CVSS v4.0) overstates practical risk for most enterprises. The v3.1 vector already includes AC:H, acknowledging exploitation difficulty. The real-world narrowing goes further: the affected version window is just two mainline releases that most production fleets never adopted, HTTP/3 must be *explicitly* enabled via listen ... quic, and RCE requires ASLR to be absent — a condition that essentially doesn't exist on modern Linux. The reliable impact is DoS via worker restart, which NGINX auto-recovers from. The vendor score treats theoretical RCE as the primary impact; defenders should weight the DoS-only reality more heavily.

"Edge-facing UAF in NGINX HTTP/3 is real but version range and ASLR cap practical risk below vendor score"
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify NGINX with HTTP/3 enabled

The attacker scans UDP/443 looking for QUIC-capable NGINX instances. HTTP/3 uses QUIC over UDP, making it distinguishable from standard HTTPS on TCP/443. The Alt-Svc header in HTTP/2 responses also advertises HTTP/3 support, making passive discovery trivial from any HTTP response.
Conditions required:
  • Target NGINX is version 1.31.0 or 1.31.1
  • HTTP/3 is enabled via listen ... quic directive
  • UDP/443 is reachable from the attacker
Where this breaks in practice:
  • Only two mainline versions are affected — most enterprises run stable branches or older mainline
  • HTTP/3 is not enabled by default; requires explicit configuration
  • Many enterprise firewalls and WAFs do not pass UDP/443 by default
  • CDNs (Cloudflare, AWS CloudFront) terminate QUIC before it reaches origin NGINX
Detection/coverage: Shodan/Censys queries for QUIC-capable NGINX on UDP/443 can identify exposed instances. nginx -V on the host reveals whether --with-http_v3_module was compiled in.
STEP 02

Send malformed QPACK encoder stream

The attacker establishes a QUIC connection and opens, closes, then reopens the QPACK encoder stream. This exploits the lifecycle mismatch where the insert buffer was allocated from the encoder stream's memory pool but referenced by connection-level compression state. When the stream closes and reopens, the stale pointer references freed memory.
Conditions required:
  • Valid QUIC handshake completes (requires TLS 1.3)
  • NGINX worker processes the HTTP/3 stream before any application-level auth
Where this breaks in practice:
  • QUIC libraries capable of this level of stream manipulation are specialized — standard HTTP clients cannot do this
  • No public weaponized exploit exists; only a safe checker (0xBlackash/CVE-2026-42530)
Detection/coverage: NGINX error logs will show worker process crashes. Sigma rules and KQL queries exist for detecting NGINX processes spawning unexpected child processes (shells, curl, wget).
STEP 03

Trigger worker process crash (DoS)

The use-after-free causes the NGINX worker process to crash and restart. Repeated exploitation degrades service availability but does not achieve persistence or code execution. NGINX's master process automatically respawns workers, so sustained DoS requires continuous attack traffic.
Conditions required:
  • Step 2 succeeded
Where this breaks in practice:
  • Worker auto-restarts limit blast radius to transient service degradation
  • Rate limiting on UDP/443 can throttle repeated crashes
Detection/coverage: Monitor nginx_worker_restart metrics or systemd journal for repeated worker crashes. GreyNoise may flag scanning activity on UDP/443.
STEP 04

Achieve RCE (conditional)

If ASLR is disabled or the attacker can leak memory layout information, the use-after-free can be weaponized into arbitrary code execution under the NGINX worker process user. This would give the attacker access to TLS private keys, upstream credentials, and a network pivot point into backend infrastructure. The worker typically runs as an unprivileged user (nginx or www-data), requiring further privilege escalation.
Conditions required:
  • ASLR is disabled or reliably bypassable
  • Attacker has heap layout knowledge for the target binary
  • No additional hardening (seccomp, AppArmor, SELinux) restricts the worker
Where this breaks in practice:
  • ASLR is enabled by default on every modern Linux distribution and cannot be disabled without root
  • No public technique exists to bypass ASLR through this specific vulnerability
  • Exploit development for QUIC/HTTP/3 use-after-free is significantly more complex than traditional HTTP exploits
  • Worker runs unprivileged — even successful RCE requires local privilege escalation
Detection/coverage: EDR/HIDS will detect NGINX worker spawning shells or unexpected child processes. Network-level detection of reverse shells from NGINX worker UIDs.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNo confirmed exploitation. Not listed in CISA KEV. F5 advisory made no mention of active exploitation at disclosure. No campaigns attributed as of 2026-07-31.
Proof of ConceptSafe checker only. 0xBlackash/CVE-2026-42530 is a Python-based non-destructive scanner that fingerprints vulnerable versions via HTTP/3 connections. No weaponized PoC for DoS or RCE has been published.
EPSS Score0.03677 (3.7%) — moderate probability of exploitation in the next 30 days, reflecting the narrow version window and HTTP/3 prerequisite.
KEV StatusNot listed as of 2026-07-31.
CVSS VectorCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H (8.1 HIGH). F5 also assigned CVSS v4.0 base score of 9.2 (CRITICAL). The AC:H is key — the vendor acknowledges exploitation complexity is non-trivial.
Affected VersionsNGINX Open Source 1.31.0 and 1.31.1 (mainline branch only). Stable branches and NGINX Plus are not affected by this CVE.
Fixed VersionNGINX 1.31.2 (mainline), released 2026-06-17. Distro backports: check your package manager — the fix is a memory pool reallocation, easily backported.
Scanning / ExposureHTTP/3 adoption is ~30-35% of web traffic globally (W3Techs/Cloudflare 2026), but most of that is served by CDNs (Cloudflare, Google) that terminate QUIC at the edge. The fraction of origin NGINX servers on 1.31.0-1.31.1 with HTTP/3 directly exposed is estimated to be very small.
Disclosure Date2026-06-17 — coordinated disclosure with patch release.
Researcher / ReporterReported to F5 through coordinated disclosure. Specific researcher not publicly credited in the F5 advisory.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to HIGH (7.2/10)

The single most decisive factor is the extremely narrow affected version range — only two mainline releases (1.31.0–1.31.1) that most enterprise NGINX fleets never deployed. The network-edge role of NGINX prevents a further downgrade, but the practical exposure population is a small fraction of the NGINX installed base.

HIGH Affected version range and patch availability
HIGH HTTP/3 prerequisite for exploitation
MEDIUM Absence of weaponized PoC (could change)
LOW Fraction of enterprise NGINX deployments running 1.31.x mainline

Why this verdict

  • Narrow version window: Only NGINX 1.31.0 and 1.31.1 are affected — two mainline releases. Most enterprise deployments run stable branches or older mainline. This dramatically reduces the reachable population compared to a vulnerability affecting all NGINX versions.
  • HTTP/3 must be explicitly enabled: The listen ... quic directive is not present in default configurations. Many NGINX deployments serve HTTP/1.1 and HTTP/2 only, making them completely immune regardless of version.
  • RCE requires ASLR bypass: The realistic impact for virtually all deployments is DoS via worker restart, not code execution. ASLR is enabled by default on all modern Linux distributions. The vendor's HIGH/CRITICAL score weights a theoretical RCE that has no practical path on hardened systems.
  • Role multiplier: NGINX at the network edge (reverse proxy, load balancer, TLS terminator) is a high-value component. If RCE were reliable, a compromised edge NGINX would expose TLS private keys, upstream credentials, and provide a network pivot into backend infrastructure. This role prevents downgrading below HIGH despite the narrow version range. However, the DoS-only realistic outcome (worker auto-restarts) limits blast radius to transient availability degradation rather than fleet compromise.
  • No exploitation pressure: No KEV listing, no active campaigns, no weaponized PoC. EPSS at 3.7% reflects moderate but not urgent threat. The safe checker tool lowers the bar for identification but not for exploitation.

Why not higher?

CRITICAL would require either active exploitation or a realistic RCE path. The AC:H in the vendor's own CVSS vector acknowledges exploitation difficulty, and the ASLR requirement for RCE makes code execution effectively theoretical on modern Linux. The affected version range (two mainline releases) means the vast majority of NGINX deployments are not vulnerable at all. A CRITICAL rating would overstate urgency for a DoS-primary vulnerability with this narrow an exposure window.

Why not lower?

NGINX is a canonical network-edge component — reverse proxies and load balancers sit at the trust boundary between the internet and internal infrastructure. The vulnerability is unauthenticated and network-reachable over UDP, bypassing TCP-focused security controls. Even as a DoS-only bug, repeated worker crashes at the edge can degrade availability for all services behind that NGINX instance. The role multiplier for edge infrastructure and the unauthenticated remote attack vector floor this at HIGH.

05 · Compensating Control

What to do — in priority order.

  1. Disable HTTP/3 if not business-critical — Remove or comment out listen ... quic directives and add_header Alt-Svc entries in your NGINX config. This completely eliminates the attack surface with zero impact if you're not actively serving HTTP/3 traffic. Deploy within 30 days per the noisgate mitigation SLA for HIGH severity, though if your NGINX instances are directly internet-facing on UDP/443, prioritize this within days.
  2. Block UDP/443 at the network perimeter — If HTTP/3 is not required, drop inbound UDP/443 at the firewall or security group level. This prevents the QUIC handshake from ever reaching NGINX. Even if HTTP/3 is needed, ensure only CDN edge nodes or trusted sources can reach UDP/443 on your origin. Deploy within 30 days.
  3. Upgrade to NGINX 1.31.2+ — The definitive fix. Version 1.31.2 moves the QPACK insert buffer allocation from stream-scoped to connection-scoped memory pools, eliminating the use-after-free. Apply within the 180-day noisgate remediation SLA for HIGH, but aim for your next maintenance window given the simplicity of the upgrade.
  4. Monitor for worker process crashes — Set up alerting on repeated NGINX worker restarts via systemd journal, nginx_worker_restart metrics, or your APM. Sustained worker crashes on HTTP/3-enabled instances may indicate exploitation attempts. Deploy monitoring immediately as a detection backstop.
  5. Ensure ASLR is enabled — Verify /proc/sys/kernel/randomize_va_space is set to 2 (full randomization) on all NGINX hosts. This is the default on modern Linux but can be disabled by misconfiguration or legacy tuning. This eliminates the RCE path entirely, leaving only DoS as the realistic impact.
What doesn't work
  • WAF rules on TCP/443 do not help. HTTP/3 uses QUIC over UDP/443, which bypasses traditional TCP-based WAFs and IPS. Your existing L7 inspection for HTTP/1.1 and HTTP/2 is blind to this attack vector.
  • Rate limiting on TCP connections does not help. QUIC connections are UDP-based and do not go through your TCP rate limiter. You need UDP-specific rate limiting or firewall rules.
  • ModSecurity / OWASP CRS do not help. These operate on HTTP/1.1 and HTTP/2 request inspection. The vulnerability is triggered at the QUIC/QPACK protocol layer before any HTTP-level inspection occurs.
  • Upgrading OpenSSL alone does not help. The vulnerability is in NGINX's QPACK implementation, not in the TLS library. OpenSSL/BoringSSL patches do not address this flaw.
06 · Verification

Crowdsourced verification payload.

Run this script on each NGINX host as any user with read access to the NGINX binary. Usage: bash check_cve_2026_42530.sh — no arguments needed. The script checks the compiled NGINX version and whether HTTP/3 is enabled in the running configuration.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# CVE-2026-42530 Checker — NGINX HTTP/3 QPACK Use-After-Free
# Run on: target NGINX host
# Privileges: read access to nginx binary and config
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -euo pipefail

NGINX_BIN=$(command -v nginx 2>/dev/null || echo "/usr/sbin/nginx")

if [[ ! -x "$NGINX_BIN" ]]; then
  echo "UNKNOWN — nginx binary not found at $NGINX_BIN"
  exit 2
fi

# Get version
VERSION_OUTPUT=$($NGINX_BIN -v 2>&1)
VERSION=$(echo "$VERSION_OUTPUT" | grep -oP 'nginx/\K[0-9]+\.[0-9]+\.[0-9]+')

if [[ -z "$VERSION" ]]; then
  echo "UNKNOWN — could not parse nginx version from: $VERSION_OUTPUT"
  exit 2
fi

echo "Detected NGINX version: $VERSION"

# Check if HTTP/3 module is compiled in
HAS_HTTP3=false
if $NGINX_BIN -V 2>&1 | grep -q 'http_v3_module'; then
  HAS_HTTP3=true
  echo "HTTP/3 module: COMPILED IN"
else
  echo "HTTP/3 module: NOT compiled in"
fi

# Check if quic is in running config
QUIC_ENABLED=false
CONFIG_FILE=$($NGINX_BIN -t 2>&1 | grep -oP 'configuration file \K[^ ]+' || echo "/etc/nginx/nginx.conf")
if [[ -r "$CONFIG_FILE" ]] && grep -rq 'listen.*quic' /etc/nginx/ 2>/dev/null; then
  QUIC_ENABLED=true
  echo "QUIC listener: ENABLED in config"
else
  echo "QUIC listener: not found in config"
fi

# Check ASLR status
ASLR=$(cat /proc/sys/kernel/randomize_va_space 2>/dev/null || echo "unknown")
echo "ASLR status: $ASLR (2=full, 1=partial, 0=disabled)"

# Version comparison
MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2)
PATCH=$(echo "$VERSION" | cut -d. -f3)

if [[ "$MAJOR" -eq 1 && "$MINOR" -eq 31 && ( "$PATCH" -eq 0 || "$PATCH" -eq 1 ) ]]; then
  if [[ "$HAS_HTTP3" == true && "$QUIC_ENABLED" == true ]]; then
    echo "VULNERABLE — NGINX $VERSION with HTTP/3 enabled. CVE-2026-42530 applies. Upgrade to 1.31.2+."
    exit 1
  elif [[ "$HAS_HTTP3" == true ]]; then
    echo "VULNERABLE — NGINX $VERSION has HTTP/3 compiled in but QUIC not detected in config. Exploitation unlikely but upgrade recommended."
    exit 1
  else
    echo "PATCHED (effectively) — NGINX $VERSION but HTTP/3 module not compiled in. Not exploitable."
    exit 0
  fi
else
  echo "PATCHED — NGINX $VERSION is not in the affected range (1.31.0–1.31.1)."
  exit 0
fi
07 · Bottom Line

If you remember one thing.

TL;DR
If you're running NGINX mainline 1.31.0 or 1.31.1 with HTTP/3 enabled, your immediate Monday-morning action is to either upgrade to 1.31.2 or disable the listen ... quic directive. The noisgate mitigation SLA for HIGH gives you 30 days to deploy compensating controls (disable QUIC or block UDP/443 at the perimeter), and the noisgate remediation SLA gives you 180 days to apply the actual patch across your fleet. In practice, the upgrade is a single package bump with no breaking changes, so aim for your next maintenance window rather than waiting the full 180 days. Before anything else, verify how many of your 10,000 hosts actually run affected 1.31.x mainline with HTTP/3 — the answer is likely a single-digit number, which makes this a targeted fix rather than a fleet-wide fire drill. Confirm ASLR is enabled (/proc/sys/kernel/randomize_va_space = 2) on all NGINX edge hosts to eliminate the theoretical RCE path entirely.

Sources

  1. F5 NGINX Security Advisory K000161616
  2. NGINX Official Security Advisories
  3. SOCRadar — CVE-2026-42530 & CVE-2026-42055 Analysis
  4. SecurityArsenal — Detection and Remediation Guide
  5. Penligent — QPACK Use-After-Free Technical Deep Dive
  6. 0xBlackash/CVE-2026-42530 Safe Checker (GitHub)
  7. The Hacker News — F5 Patches Two Critical NGINX Flaws
  8. CSA Singapore — High-Severity NGINX Alert
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.