F5 NGINX CVE-2026-42530 / CVE-2026-42055 — Critical Unauthenticated RCE

Two critical (CVSS v4 9.2) remote, unauthenticated memory-corruption flaws in NGINX. CVE-2026-42530 is a use-after-free in the HTTP/3 (QUIC) module; CVE-2026-42055 is a heap overflow in the HTTP/2 proxy & gRPC modules. Both can crash NGINX workers (DoS) and yield arbitrary code execution where ASLR is disabled or bypassed. F5 shipped out-of-band patches ~17–18 Jun 2026. This is a Falcon-side endpoint hunt for post-exploitation off the NGINX worker plus a vulnerable-version inventory. Defensive hunt & harden pack — no exploit code.
Threat
CVE-2026-42530 (HTTP/3 UAF) · CVE-2026-42055 (HTTP/2 proxy/gRPC heap overflow)
Severity
CRITICAL · CVSS v4 9.2 · UNAUTH RCE
Type
Remote unauthenticated memory corruption (DoS + potential RCE)
Patch
NGINX OSS 1.31.2 / 1.30.3 · NGF 2.6.4 · Plus R36 P6 / 37.0.2.1
Affected
NGINX Open Source, NGINX Plus, NGINX Gateway Fabric, Ingress Controller, App Protect
Version
v0.1 · 2026-06-19
Author
HuntPack
01

Executive Summary

On approximately 17–18 June 2026, F5 issued out-of-band patches for two critical (CVSS v4 9.2) NGINX vulnerabilities, both exploitable by a remote, unauthenticated attacker against the HTTP request path:

  • CVE-2026-42530 — use-after-free in ngx_http_v3_module. When NGINX is configured with the HTTP/3 / QUIC module, a specially crafted HTTP/3 session that reopens a QPACK encoder stream triggers a UAF in the NGINX worker. The reliable outcome is a repeated worker crash (DoS); arbitrary code execution is possible on systems where ASLR is disabled or can be bypassed.
  • CVE-2026-42055 — heap-based buffer overflow in ngx_http_proxy_v2_module and ngx_http_grpc_module. Triggered when NGINX proxies HTTP/2 upstream (proxy_http_version 2 or grpc_pass) with ignore_invalid_headers off and large_client_header_buffers sized above 2 MB. Heap corruption again yields DoS and potential code execution under the same ASLR caveat.

Affected products span NGINX Open Source, NGINX Plus, NGINX Gateway Fabric, NGINX Ingress Controller, NGINX Instance Manager, and the NGINX App Protect / F5 WAF & DoS lines. Fixed builds: NGINX OSS 1.31.2 and 1.30.3, NGINX Gateway Fabric 2.6.4, NGINX Plus R36 P6 / 37.0.2.1. F5 advisories: K000161616 (CVE-2026-42530) and K000161584 (CVE-2026-42055).

As of publication, there is no public proof-of-concept and no confirmed in-the-wild exploitation. F5 / NGINX appliances have, however, a strong history of rapid weaponization, so the window is short. This pack hunts endpoints (Linux hosts and containers) that run Falcon. The memory corruption itself happens in-process inside the NGINX worker and is largely invisible to EDR, so the durable, high-fidelity signal is what the worker does next: an nginx worker spawning a shell / interpreter / download tool, a new ELF written under a web root, an unexpected listener post-exploit, or beaconing to new infrastructure. The pack pairs those behavioral hunts with a vulnerable-version inventory hunt — the patch is the fix.

Defender priority: (1) Patch NGINX to ≥ 1.31.2 (or 1.30.3 on the 1.30.x line) / NGF 2.6.4 / Plus R36 P6 fleet-wide and verify versions (Q6 + N1) — patching closes both flaws. (2) If you cannot patch immediately, apply the config mitigations (§12): disable HTTP/3 (remove quic from listen) and remove ignore_invalid_headers off / reduce large_client_header_buffers below 2 MB. (3) The highest-fidelity hunt is Q1 — an nginx worker spawning sh/bash/python/perl/curl/wget. There is almost no benign reason for an NGINX worker to parent a shell. Escalate any hit and pivot to Q3 (web-root ELF write), Q4 (new listener) and Q5 (rare egress) on the same host.
02

Source Review & Web Hunter Notes

TierSourceKey FindingCarry
1 · VendorF5 advisory K000161616 (CVE-2026-42530) & K000161584 (CVE-2026-42055)Authoritative affected/fixed version matrix; trigger conditions; mitigations (disable HTTP/3; remove ignore_invalid_headers off / shrink buffers)yes
1 · News of recordThe Hacker News — "F5 Patches Two Critical NGINX Open Source Flaws Enabling RCE"Both CVSS v4 9.2; remote unauth; UAF in HTTP/3 QUIC (QPACK encoder reopen) and heap overflow in HTTP/2 proxy/gRPC; RCE only where ASLR disabled/bypassed; full affected-product list; fixed buildsyes
2 · Vendor researchSecurityWeek — "F5 Patches Critical, High-Severity NGINX Vulnerabilities"Two criticals plus high-sev NGF config-injection bugs (CVE-2026-11311 / -50107, authenticated); affected product families; mitigation framingyes
2 · NewsBleepingComputer — "F5 issues out-of-band patches for critical NGINX vulnerabilities"Out-of-band release dated 18 Jun 2026; no active exploitation reported; mitigations (remove quic from listen); notes F5's history of being targetedyes
2 · NewsSecurity Affairs / Cyber Security News / GBHackersDoS via repeated worker crash is the reliable outcome; RCE conditional on ASLR; impact = service restart loops or code execution; patch-now guidance; no IOCsyes

Decisions: No atomic IOCs (hashes / domains / IPs), no public PoC, and no confirmed in-the-wild exploitation were published, so the pack is behavior-keyed, not IOC-keyed — anchor on NGINX-worker-parented anomalous execution, ELF/webshell writes under web roots, unexpected post-exploit listeners, and rare egress, plus a worker-crash-loop proxy for exploitation attempts. Lead with the patch (the fix) and a version-inventory hunt. The QUIC/QPACK and HTTP/2 heap primitives are in-process inside the worker and invisible to EDR by design, so we hunt the consequences of a successful chain on the endpoint. Scope is Linux hosts and containers running NGINX (OSS/Plus/Gateway Fabric/Ingress/App Protect).

03

Hunt Brief & Attack Chain

Working hypothesis: An unauthenticated attacker reaches an internet- or internally-exposed NGINX listener and sends a crafted request. For CVE-2026-42530 that is an HTTP/3 (QUIC) session that reopens a QPACK encoder stream, corrupting freed memory in the worker; for CVE-2026-42055 it is oversized/invalid HTTP/2 headers proxied upstream that overflow a heap buffer. The reliable result is a worker crash → master respawn loop (DoS). Where ASLR is disabled or bypassed, the attacker pivots the corruption into code execution inside the NGINX worker and then lands post-exploitation tooling on the host. EDR telemetry begins where the worker interacts with the OS — child processes, file writes, new listeners, and network egress.

StepBehaviorTelemetryHunt Angle
1 · Recon / deliveryAttacker reaches an exposed NGINX HTTP/3 or HTTP/2-proxy listener and sends a crafted requestNetworkConnectIP4, NetworkListenIP4, gateway/WAF logsN4 (perimeter logs); Q5 (egress) for callbacks
2 · Memory-corruption triggerQPACK encoder-stream reopen (UAF) or oversized HTTP/2 headers (heap overflow) in the worker (in-process)– (largely invisible to EDR)GAP in-worker; watch for worker crash/respawn loops (Q6 / N2)
3 · DoS (reliable)Worker crashes; master respawns it repeatedlyProcessRollup2 (nginx worker churn), syslog/journaldQ6 worker respawn storm; N2 crash logs
4 · In-worker RCE (ASLR off/bypassed)Arbitrary code in the worker context → shell / interpreter / LOLBin launchProcessRollup2Q1 nginx→shell; Q2 nginx→recon/download tool
5 · Payload / webshell to diskWorker writes an ELF or script under a web root / tmp pathElfFileWritten, NewExecutableWritten, file-write eventsQ3
Post · C2 / listener / persistReverse shell or bind listener; beacon to attacker infra; cron / unit persistenceNetworkListenIP4, NetworkConnectIP4Q4 new listener; Q5 rare egress; Containment §14

Hunt hypotheses (fidelity-ordered)

  • H1 (high): An nginx worker directly spawns an interactive shell or interpreter → Q1. Near-zero benign baseline.
  • H2 (high): An nginx worker spawns a download / recon tool (curl, wget, id, whoami, uname) → Q2. Workers serve content; they do not run recon.
  • H3 (high): An nginx worker writes an ELF / script under a web root or tmp path then it executes → Q3 (webshell / dropped payload).
  • H4 (high): A new network listener appears on an NGINX host whose owning process is not nginx → Q4 (bind shell / tunnel).
  • H5 (medium): An nginx worker makes an outbound connection to newly-seen / rare external infrastructure → Q5 (reverse shell / C2).
  • H6 (medium): Repeated short-lived nginx worker respawns on a host in a tight window → Q6 (crash-loop = exploitation attempt, success or failure / DoS).
  • H7 (high): Hosts still running an NGINX build below the fixed version → Q7 (inventory hunt; patch is the fix).
04

Consolidated IOC Table

No atomic IOCs (hashes, domains, IPs, filenames) have been published for CVE-2026-42530 / CVE-2026-42055. There is no public PoC and no confirmed in-the-wild exploitation as of 2026-06-19. The rows below are therefore hunt artifacts / behavioral signatures and a version audit — NOT threat-intel atomics. The patch (NGINX ≥ 1.31.2 / 1.30.3, NGF 2.6.4, Plus R36 P6 / 37.0.2.1) is the definitive control and the strongest detections are behavioral. Copy-ready blocks in §10.
TypeValueConfActionContext
VersionNGINX OSS < 1.31.2 (and 1.30.x < 1.30.3)highdetectVulnerable build — patch closes both flaws
VersionNGF < 2.6.4 · NGINX Plus < R36 P6 / < 37.0.2.1highdetectSame engine — inherits the flaws
Hunt artifactnginx worker → sh / bash / dash / python / perl / phphighhuntPost-exploit shell/interpreter from a worker parent
Hunt artifactnginx worker → curl / wget / nc / ncat / id / whoami / unamehighhuntDownload / recon follow-on after worker RCE
Hunt artifactnginx worker writing an ELF / script under web root or /tmp then exechighhuntDropped payload / webshell from the worker chain
Hunt artifactNew non-nginx network listener on an NGINX hostmediumhuntBind shell / tunnel post-exploit
Hunt artifactnginx worker crash / respawn storm (short-lived workers)mediumhuntExploitation attempt indicator (success or DoS)
CVE (companion)CVE-2026-11311 / CVE-2026-50107 (NGF config injection, authenticated)mediumenrichHigh-sev NGF bugs patched in the same release; same patch hygiene
05

Affected Surface & Telemetry Matrix

SurfaceRequired TelemetryPriorityGap Risk
Hosts / containers running an NGINX build below the fixed versionProcess/version inventory (ProcessRollup2 nginx CommandLine / package feed)CriticalLow-Med — version often only in nginx -v banner / package metadata
NGINX worker process lineage (RCE follow-on)Process tree + parent context (ProcessRollup2 / SyntheticProcessRollup2, ParentBaseFileName)HighLow — standard Linux sensor
Worker-dropped ELF / webshellFile write w/ writing-process context (ElfFileWritten / NewExecutableWritten)HighMed — interpreted webshells (.php/.py) may not be PE/ELF events
Post-exploit listener (bind shell / tunnel)Listening sockets w/ process context (NetworkListenIP4)HighLow-Med — needs listen telemetry enabled
Post-exploit egress / reverse shell / C2Outbound IP w/ process context (NetworkConnectIP4)MediumMed — needs newness/rarity scoping; workers rarely egress
QUIC/QPACK & HTTP/2 heap primitive (in-worker)None — in-process worker memory corruptionN/AGAP — invisible to EDR; rely on consequences + crash loop + patch
06

ATT&CK Mapping

TacticTechniqueObserved BehaviorQuery / Control
Initial AccessT1190 — Exploit Public-Facing ApplicationCrafted HTTP/3 or HTTP/2-proxy request triggers worker memory corruptionN4; patch (Q7/N1)
ExecutionT1203 — Exploitation for Client ExecutionUAF / heap overflow → code execution in the NGINX workerQ6; patch (Q7/N1)
ExecutionT1059.004 — Unix ShellWorker parent spawns sh/bash/dash or an interpreterQ1, Q2
ImpactT1499.004 — Endpoint DoS: Application Exhaustion FloodRepeated worker crash → master respawn loop (DoS)Q6; N2
PersistenceT1505.003 — Server Software Component: Web ShellWorker writes a webshell / ELF under a web rootQ3; Containment §14
Command & ControlT1071.001 — Application Layer Protocol: WebWorker-parented beacon / reverse shell to attacker infraQ5
Command & ControlT1571 — Non-Standard Port (bind listener)New non-nginx listener opened post-exploitQ4
DiscoveryT1082 / T1033 — System / Owner DiscoveryWorker spawns id / whoami / unameQ2
07

Native Audit-Log Hunts

HuntSourceLogicResponse
N1 · NGINX version inventoryPackage manager (dpkg -l / rpm -q nginx), nginx -v, container image tags, Ansible factsEnumerate NGINX OSS/Plus/NGF/Ingress builds; flag any below 1.31.2 (or 1.30.x below 1.30.3), NGF below 2.6.4, Plus below R36 P6 / 37.0.2.1Patch; the definitive fix (mirrors Q7)
N2 · Worker crash loopjournald / syslog (nginx "worker process exited on signal 11/6"), core dumps, systemd restart countersRepeated worker SIGSEGV/SIGABRT and master respawns on a host within a short windowPossible exploit attempt / DoS; collect core, correlate Q6
N3 · Persistence after compromisecron (/etc/cron*, user crontabs), systemd units/timers, ~/.ssh/authorized_keys, web-root file diffsNew cron/unit/timer/authorized_keys or web-root file created shortly after a worker RCE indicatorInvestigate; pairs with Q1–Q3 on same host
N4 · Exploit traffic at the edgeReverse proxy / WAF / LB access logs, QUIC/UDP 443 flow recordsAnomalous HTTP/3 sessions, malformed HTTP/2 header floods, or oversized header requests preceding worker instabilityBlock source; enrich Q5/Q6 hits
N5 · NGINX config exposure auditnginx -T config dumpConfirm whether http3/quic listeners, proxy_http_version 2/grpc_pass, ignore_invalid_headers off, and large_client_header_buffers > 2 MB are present (the trigger conditions)Apply mitigations (§12); prioritize patch on matching hosts
08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Field names validated against the Falcon event reference; process hunts include SyntheticProcessRollup2. These are Linux hunts (NGINX runs on Linux hosts/containers). The QUIC/QPACK and HTTP/2 heap primitives are invisible to EDR — these hunt the post-exploitation consequences on the endpoint plus a vulnerable-version inventory. Once NGINX is confirmed ≥ the fixed builds fleet-wide (Q7/N1), keep Q1–Q4 as durable defense-in-depth for any web-server-exploit chain.
Q1 · NGINX worker spawning a shell / interpreter
CONF HIGHFP LOWCOST LOW

Looks for: an nginx process as the direct parent of a shell or scripting interpreter. Accomplishes: catches the highest-fidelity post-exploit signal — NGINX workers serve content and have almost no benign reason to spawn an interactive shell.

// HUNT: NGINX worker spawning a shell / interpreter (CVE-2026-42530 / -42055 post-exploit)
// MITRE: T1190, T1203, T1059.004 | CONF: high  FP: low  COST: low
// REQUIRES: ProcessRollup2 (Linux) with ParentBaseFileName
// FALSE POSITIVES: CGI / FastCGI setups, custom perl/lua handlers, ops scripts that legitimately run under nginx
// TUNING: allow-list known FastCGI wrappers per host; pair any hit with Q3/Q4/Q5 on the same aid
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| event_platform=Lin
| ParentBaseFileName=/^nginx$/i
| FileName=/^(sh|bash|dash|zsh|ksh|python[0-9.]*|perl|ruby|php|php-cgi|lua)$/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData], limit=200)
| sort(@timestamp, order=desc)
Q2 · NGINX worker spawning a download / recon tool
CONF HIGHFP LOW-MEDCOST LOW

Looks for: an nginx parent spawning a download utility or host-discovery binary. Accomplishes: catches the recon / payload-pull stage that follows worker RCE. FP: some images use curl/wget in entrypoint health checks — scope to interactive/anomalous invocations.

// HUNT: NGINX worker spawning a download / recon tool (post-exploit discovery / payload pull)
// MITRE: T1203, T1059.004, T1082, T1033, T1105 | CONF: high  FP: low-med  COST: low
// REQUIRES: ProcessRollup2 (Linux) with ParentBaseFileName
// FALSE POSITIVES: container entrypoint/health-check curl/wget; monitoring agents
// TUNING: allow-list known health-check command lines; rank by rare command lines per image
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| event_platform=Lin
| ParentBaseFileName=/^nginx$/i
| FileName=/^(curl|wget|nc|ncat|netcat|socat|id|whoami|uname|hostname|ifconfig|ip|crontab|chmod|base64)$/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData], limit=200)
| sort(@timestamp, order=desc)
Q3 · NGINX worker writing an executable / webshell under a web root or tmp path
CONF HIGHFP MEDCOST LOW

Looks for: an nginx process writing an ELF or script to a web root, upload dir, or tmp path. Accomplishes: catches dropped payloads and webshells. FP: legitimate upload features write user content — scope to executable/script extensions and correlate with Q1/Q2 on the same host.

// HUNT: NGINX worker writing an ELF / webshell under a web root or tmp path (dropped payload)
// MITRE: T1505.003, T1105, T1203 | CONF: high  FP: medium  COST: low
// REQUIRES: ElfFileWritten / NewExecutableWritten with ContextBaseFileName + TargetFileName
// FALSE POSITIVES: legitimate file-upload features writing user content into web roots
// TUNING: scope to script/exec extensions; correlate to a Q1/Q2 hit on the same aid before alerting
#event_simpleName=/ELFFileWritten|NewExecutableWritten/
| event_platform=Lin
| ContextBaseFileName=/^nginx$/i
| TargetFileName=/\/(www|html|public_html|webroot|sites|uploads|tmp|dev\/shm|var\/tmp)\/.+(\.(php|phtml|py|pl|sh|jsp|cgi|elf|so|bin)|[^.\/]+)$/i
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName, SHA256HashData], limit=200)
| sort(@timestamp, order=desc)
Q4 · New non-nginx network listener on an NGINX host (bind shell / tunnel)
CONF HIGHFP MEDCOST LOW

Looks for: a host that runs nginx opening a new listening socket whose owning process is NOT nginx. Accomplishes: surfaces bind shells / tunnels stood up after worker RCE. FP: co-located services (sshd, monitoring agents) — allow-list known daemons per host role.

// HUNT: New non-nginx listener on a host that also runs nginx (bind shell / tunnel post-exploit)
// MITRE: T1571, T1059.004 | CONF: high  FP: medium  COST: low
// REQUIRES: NetworkListenIP4 with ContextBaseFileName; nginx present on the same aid
// FALSE POSITIVES: co-located daemons (sshd, node_exporter, app servers) legitimately listening
// TUNING: allow-list known service binaries per host role; focus on shells/interpreters as the listener
#event_simpleName=NetworkListenIP4
| event_platform=Lin
| nginxHosts := if(ContextBaseFileName=/^nginx$/i, then=aid, else="")
| ContextBaseFileName=/^(sh|bash|dash|python[0-9.]*|perl|ruby|php|nc|ncat|netcat|socat)$/i
| groupBy([aid, ComputerName, ContextBaseFileName, LocalPort], function=([count(as=listen_events), collect([CommandLine])]))
| sort(listen_events, order=desc)
Q5 · Rare external egress from an NGINX worker (reverse shell / C2 pivot)
CONF MEDFP MEDCOST MED

Looks for: outbound connections initiated by an nginx process to external IPs, surfaced by rarity (least-common destinations across the fleet). Accomplishes: NGINX workers terminate inbound traffic and rarely originate egress — outbound from a worker to rare infra is a strong reverse-shell / C2 pivot. FP: upstream proxying / auth subrequests — scope by rarity and exclude known upstreams.

// HUNT: Rare external egress from an nginx process (post-exploit reverse shell / C2)
// MITRE: T1071.001 | CONF: medium  FP: medium  COST: medium
// REQUIRES: NetworkConnectIP4 with ContextBaseFileName + RemoteAddressIP4
// FALSE POSITIVES: legitimate upstreams / auth subrequests; package mirrors
// TUNING: exclude RFC1918 + known upstream IPs; rank by rarity (distinct hosts per RemoteAddressIP4)
#event_simpleName=NetworkConnectIP4
| event_platform=Lin
| ContextBaseFileName=/^nginx$/i
| RemoteAddressIP4!=/^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|127\.|169\.254\.)/
| groupBy([RemoteAddressIP4, RemotePort], function=([count(ComputerName, distinct=true, as=hosts), count(aid, as=conns), collect([ComputerName])]))
| sort(hosts, order=asc, limit=200)
Q6 · NGINX worker crash / respawn storm (exploitation attempt / DoS)
CONF MEDFP MEDCOST LOW

Looks for: a host with many short-lived nginx worker launches in a tight window — consistent with the master repeatedly respawning crashed workers (the reliable outcome of both CVEs). FP: reloads (nginx -s reload), config pushes, or autoscaling also churn workers — triage by burst tightness and pair with Q1–Q5.

// HUNT: NGINX worker respawn storm on a single host (UAF/heap crash loop = exploit attempt or DoS)
// MITRE: T1203, T1499.004 | CONF: medium  FP: medium  COST: low
// REQUIRES: ProcessRollup2 (Linux) nginx worker launches
// FALSE POSITIVES: nginx -s reload, config deploys, container/pod autoscaling churn
// TUNING: raise the per-host threshold; correlate the burst with Q1-Q5 and N2 crash logs on same aid
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| event_platform=Lin
| FileName=/^nginx$/i
| ParentBaseFileName=/^nginx$/i
| timeChart(span=5m, function=count(), series=ComputerName)
| sort(_count, order=desc)
Q7 · Vulnerable NGINX version inventory (the fix)
CONF HIGHFP LOWCOST LOW

Looks for: NGINX builds reporting a version below the fixed release. Accomplishes: the inventory hunt — patching is the definitive control. Note: NGINX rarely runs with -v on the serving command line, so this leans on version-banner launches (startup checks, nginx -v in entrypoints). Pair with N1 (package-manager inventory) for full coverage and validate the version-field source in your tenant.

// HUNT: Inventory NGINX builds below the fixed release (CVE-2026-42530 / -42055)
// MITRE: T1190 / T1203 (mitigation/visibility) | CONF: high  FP: low  COST: low
// REQUIRES: ProcessRollup2 (Linux) nginx launches whose CommandLine carries a version banner
// VERIFY: nginx version rarely appears in the serving cmdline; pair with N1 package inventory
// Fixed: OSS >= 1.31.2 (or 1.30.x >= 1.30.3); flag anything below
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| event_platform=Lin
| FileName=/^nginx$/i
| CommandLine=/nginx\/(?<maj>\d+)\.(?<min>\d+)\.(?<patch>\d+)/i
| maj:=parseInt(maj) | min:=parseInt(min) | patch:=parseInt(patch)
| test(maj < 1 or (maj = 1 and min < 30) or (maj = 1 and min = 30 and patch < 3) or (maj = 1 and min = 31 and patch < 2))
| groupBy([ComputerName, maj, min, patch], function=count(as=hits))
| sort([maj, min, patch], order=asc)
09

CrowdStrike Custom IOA Recommendations

IOA NameField PatternsBenign ExclusionsDeployment Path
NGINX worker spawns shell/interpreterPlatform Linux; Parent Image */nginx; Child sh/bash/dash/python*/perl/ruby/phpAllow-list any sanctioned FastCGI/CGI wrapper images per hostEndpoint Security → Custom IOA → Process Creation (Detect+Block)
NGINX worker spawns recon/download toolPlatform Linux; Parent Image */nginx; Child curl/wget/nc/ncat/socat/id/whoami/unameExclude known entrypoint/health-check command linesCustom IOA → Process Creation (Detect, then Block after baseline)
NGINX worker writes executable/webshellPlatform Linux; Writing Image */nginx; Target */www/* | */html/* | */uploads/* | */tmp/* with exec/script extensionExclude sanctioned upload dirs; correlate with the two IOAs aboveCustom IOA → File Write (Detect / hunt)
Q1 is a strong IOA promotion (near-zero benign baseline once FastCGI/CGI wrappers are excluded). Q2 promotes to Detect once entrypoint/health-check exclusions are validated. Q3 promotes once upload-dir exclusions are validated. Q4/Q5/Q6 stay hunt/investigate-only due to FP risk.
10

Machine-Readable IOC Appendix

Grouped IOC Quick-Copy

No atomic IOCs were published — these are behavioral hunt artifacts, a version/patch audit (the fix), and the config-mitigation set, NOT threat-intel atomics. Use the CSV with REPLACE_WITH_ placeholders only if your IR turns up campaign atomics.

Falcon IOC Management CSVbulk import (placeholders)
type,value,action,severity,expiration,description,tags
sha256,REPLACE_WITH_PAYLOAD_SHA256,prevent,critical,2027-06-19,CVE-2026-42530/-42055 nginx-dropped payload,campaign:F5-NGINX-RCE
domain,REPLACE_WITH_C2_DOMAIN,detect,high,2026-09-19,CVE-2026-42530/-42055 post-exploit C2,campaign:F5-NGINX-RCE
ipv4,REPLACE_WITH_C2_IP,detect,high,2026-09-19,CVE-2026-42530/-42055 post-exploit C2,campaign:F5-NGINX-RCE
Behavioral Hunt Artifactsdetection logic (not IOCs)
nginx worker spawns sh/bash/dash/zsh/python/perl/ruby/php/php-cgi/lua
nginx worker spawns curl/wget/nc/ncat/socat/id/whoami/uname/hostname/crontab/chmod/base64
nginx worker writes an ELF/script under a web root, uploads dir, or /tmp /dev/shm /var/tmp then it executes
New non-nginx listener (sh/bash/python/nc/socat) on a host that also runs nginx
nginx process makes an outbound connection to rare/newly-seen external infrastructure
nginx worker crash/respawn storm on a single host in a tight window (UAF/heap crash loop = exploit attempt or DoS)
Version / Patch Auditthe fix
# Fixed builds (CVE-2026-42530 / CVE-2026-42055):
#   NGINX Open Source 1.31.2  (and 1.30.x line: 1.30.3)
#   NGINX Gateway Fabric 2.6.4
#   NGINX Plus R36 P6 / 37.0.2.1
# Check installed version (Linux):
nginx -v            # prints: nginx version: nginx/1.31.x
dpkg -l | grep -i nginx        # Debian/Ubuntu
rpm -q nginx                   # RHEL/CentOS/Rocky
# Vulnerable if < 1.31.2 (or 1.30.x < 1.30.3) for OSS; < 2.6.4 for NGF; < R36 P6 for Plus
# Patch via package manager / Helm chart / container image bump, then reload: nginx -s reload
Config Mitigations & CVEsinterim controls
CVE-2026-42530   # UAF in ngx_http_v3_module (HTTP/3 QUIC, QPACK encoder reopen) - CVSS v4 9.2 - F5 K000161616
CVE-2026-42055   # heap overflow in ngx_http_proxy_v2_module + ngx_http_grpc_module - CVSS v4 9.2 - F5 K000161584
CVE-2026-11311   # NGF config injection (authenticated, high) - patched same release
CVE-2026-50107   # NGF config injection (authenticated, high) - patched same release
# Interim mitigations if you cannot patch immediately:
#  -42530: disable HTTP/3 — remove the 'quic' parameter from all 'listen' directives (and reuseport/http3 on)
#  -42055: remove 'ignore_invalid_headers off;' AND/OR set large_client_header_buffers below 2 MB
# Keep ASLR enabled (kernel.randomize_va_space=2) - RCE requires ASLR disabled or bypassed
# Defense-in-depth: terminate untrusted HTTP/3 at a patched edge; restrict who can reach NGINX listeners
11

Detection Validation Gates

GateCheckPass Criteria
Telemetry readyConfirm Linux ProcessRollup2 retains ParentBaseFileName, and ElfFileWritten / NetworkListenIP4 carry ContextBaseFileName on NGINX hostsFields populated fleet-wide for nginx processes
Benign baselineRun Q1/Q2 over a 30-day lookback in a clean environmentZero hits after FastCGI/CGI and health-check exclusions — promote to IOA
Positive testLab: launch id / bash with nginx as the real parent via a benign harness (never the live exploit)Q1/Q2 fire; lineage and CommandLine captured correctly
Inventory accuracyCross-check Q7 / N1 output against ground-truth nginx -v on a sample of hostsVersion parsing correct; vulnerable builds flagged, patched builds not
PromotionMove Q1 to Custom IOA Detect+Block; Q2/Q3 to DetectFP rate < 1/week sustained before Block mode
12

Hardening — Tiered & Deployable

This is patchable — updating NGINX is the fix. The config mitigations below remove the trigger conditions for hosts that cannot patch immediately; everything else is defense-in-depth against web-server-exploit chains generally. Platforms touched: Linux hosts and containers, NGINX config, Kubernetes (NGF / Ingress), and the perimeter (LB / WAF).

Immediate — Patch & mitigate (the fix)
  • Update NGINX to ≥ 1.31.2 (or 1.30.3 on the 1.30.x line) / NGF 2.6.4 / Plus R36 P6 / 37.0.2.1 fleet-wideM1051 (Update Software). Bump packages, Helm charts, and container base images; then nginx -s reload or roll pods. The new binary is not effective until the worker restarts.
  • If you cannot patch immediately, disable HTTP/3M1042 (Disable or Remove Feature). Remove the quic parameter from all listen directives (and http3 on;) to close CVE-2026-42530's trigger.
  • Neutralize the HTTP/2-proxy triggerM1042. Remove ignore_invalid_headers off; and/or set large_client_header_buffers below 2 MB to close CVE-2026-42055.
  • Keep ASLR enabledM1050 (Exploit Protection). Confirm kernel.randomize_va_space=2; RCE for both CVEs requires ASLR disabled or bypassed, so this is a meaningful backstop. Keep Falcon prevention on (M1040).
Near term — Reduce the attack surface (pilot first)
  • Terminate untrusted HTTP/3 / HTTP/2 at a patched edgeM1037 (Filter Network Traffic). Front exposed NGINX with a patched LB / CDN that rejects malformed QUIC/QPACK and oversized HTTP/2 headers.
  • Restrict who can reach NGINX listenersM1030 (Network Segmentation). Limit UDP/443 (QUIC) and the gRPC/HTTP-2 upstream paths to required clients; firewall management/admin ports.
  • Run NGINX as an unprivileged user in a confined sandboxM1026 / M1048. Enforce NoNewPrivileges, seccomp, and a read-only root FS via systemd / container security context so worker RCE has minimal blast radius.
  • Egress-filter web tiersM1037. NGINX hosts rarely need arbitrary outbound; default-deny egress breaks reverse shells / payload pulls (improves Q5 fidelity).
Strategic — Default-deny & contain
  • Read-only web roots + file-integrity monitoringM1022 (Restrict File and Directory Permissions). Mount served content read-only and alert on any write to a web root (stops webshell drops even if the chain succeeds; backs Q3).
  • Application allowlisting on web tiersM1038 (Execution Prevention). Constrain which binaries can run on NGINX hosts so a dropped ELF cannot execute.
  • Continuous NGINX version & config-drift monitoringM1051. Alert fleet-wide when a build falls below the fixed version or when quic / ignore_invalid_headers off / oversized buffers reappear in config (N5).
13

Deployable Playbooks

Playbook A · Report installed NGINX version & flag vulnerable hosts (Linux, shell)

# 1. Print the running NGINX version
nginx -v 2>&1            # nginx version: nginx/1.31.x
dpkg -l | grep -i '^ii.*nginx' 2>/dev/null || rpm -q nginx 2>/dev/null

# 2. Flag vulnerable: OSS < 1.31.2 (or 1.30.x < 1.30.3)
ver=$(nginx -v 2>&1 | sed -E 's#.*nginx/([0-9.]+).*#\1#')
maj=${ver%%.*}; rest=${ver#*.}; min=${rest%%.*}; patch=${rest#*.}
if [ "$maj" -eq 1 ] && { [ "$min" -lt 30 ] \
   || { [ "$min" -eq 30 ] && [ "$patch" -lt 3 ]; } \
   || { [ "$min" -eq 31 ] && [ "$patch" -lt 2 ]; }; }; then
  echo "VULNERABLE: nginx $ver -- patch to 1.31.2 / 1.30.3"
else
  echo "OK: nginx $ver"
fi

Playbook B · Apply interim config mitigations (nginx.conf) — only if you cannot patch yet

# CVE-2026-42530 (HTTP/3 UAF): disable HTTP/3 / QUIC.
#   In each server{} block, remove the 'quic' parameter and any 'http3 on;':
#     - listen 443 quic reuseport;   # <-- REMOVE this listener (or drop 'quic')
#       listen 443 ssl;              # keep TLS over TCP only
#     - http3 on;                    # <-- REMOVE

# CVE-2026-42055 (HTTP/2 proxy/gRPC heap overflow): remove the trigger conditions.
#       ignore_invalid_headers off;       # <-- REMOVE (default is 'on')
#       large_client_header_buffers 4 8k; # keep buffer size well below 2 MB

# Validate & reload:
nginx -t && nginx -s reload
# Confirm no quic listeners remain:
nginx -T 2>/dev/null | grep -E 'listen .*quic|http3 on|ignore_invalid_headers off'

Playbook C · Confirm ASLR is enabled (Linux) — RCE requires it disabled/bypassed

# Read current ASLR setting (2 = full randomization, the secure default):
sysctl kernel.randomize_va_space        # expect: kernel.randomize_va_space = 2
# If not 2, enable persistently:
echo 'kernel.randomize_va_space = 2' > /etc/sysctl.d/99-aslr.conf
sysctl --system
# Harden the unit so worker RCE has minimal reach (systemd drop-in):
#   [Service]
#   NoNewPrivileges=yes
#   ProtectSystem=strict
#   ReadOnlyPaths=/usr/share/nginx/html
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-contain the host in Falcon on a confirmed Q1/Q2/Q3/Q4 hit; do not power off (preserve volatile state); for pods, cordon & capture before deleteSOC L2Containment timestamp; Q1–Q4 event rows
TriagePull the NGINX process tree: identify the master/worker PIDs, any spawned shell/recon process and its command line, any ELF/webshell the worker wrote, and any new listener; capture access/error logs around the eventSOC L2Process/file tree; nginx logs; Q1–Q4 rows
EradicateRemove dropped payloads/webshells from web roots and tmp paths; kill malicious processes and listeners; check cron / systemd units / timers / authorized_keys created post-compromise (N3)IRWeb-root diff; cron/unit/key review
RecoverPatch NGINX to the fixed build and reload (or redeploy a clean image); rotate any secrets/keys/tokens stored on or reachable from the host; re-image / rebuild the image if OS-level code execution is confirmedIR + ITNGINX version; secret-rotation log
HardenConfirm patch fleet-wide (Q7/N1); apply §12 controls (disable HTTP/3, fix header config, confirm ASLR, egress-filter); promote Q1 IOA to Detect+BlockDetection EngPatch coverage; config audit (N5); IOA enabled
15

Detection Coverage Map

TechniqueBehaviorCQLIOACoverage
Vulnerable NGINX versionQ7Good patch + N1 inventory
T1190Crafted HTTP/3 or HTTP/2-proxy request (delivery)N4Partial edge/WAF-log-dependent (N4)
T1203In-worker UAF / heap corruption (in-process)Q6GAP invisible to EDR; crash-storm proxy only
T1059.004NGINX worker spawns shell / interpreterQ1IOA-1Good
T1082 / T1033 / T1105Worker spawns recon / download toolQ2IOA-2Good
T1505.003 / T1105Worker writes webshell / ELFQ3IOA-3Partial FP risk; scope exts / correlate
T1571New non-nginx listener (bind shell)Q4Partial allow-list daemons per role
T1071.001Post-exploit egress / reverse shellQ5Partial rarity-scoped pivot only
T1499.004Worker crash loop (DoS)Q6Partial reload/autoscale FP; pair N2

Validation gates: (1) confirm Linux ProcessRollup2 retains ParentBaseFileName + ElfFileWritten/NetworkListenIP4 context fleet-wide; (2) Q1/Q2 return zero hits in a 30-day benign lookback after FastCGI/health-check exclusions; (3) inventory NGINX versions (Q7/N1) and confirm the fixed build; (4) lab-validate lineage firing with a benign nginx-parent harness — never the live exploit; (5) promote Q1 to Custom IOA Detect+Block (target FP < 1/week). The in-worker UAF/heap step is an accepted detection gap — mitigated by the patch, config mitigations, ASLR, and the crash-storm proxy (Q6).

16

Hunt Summary Ticket

TITLE:        Hunt - F5 NGINX CVE-2026-42530 (HTTP/3 UAF) & CVE-2026-42055 (HTTP/2 proxy/gRPC heap overflow)
SEVERITY:     Critical (CVSS v4 9.2 x2; remote unauthenticated; DoS reliable, RCE where ASLR disabled/bypassed)
SCOPE:        Linux hosts/containers running NGINX OSS < 1.31.2 (1.30.x < 1.30.3) / NGF < 2.6.4 / Plus < R36 P6
HYPOTHESIS:   A crafted HTTP/3 (QPACK encoder reopen) or oversized HTTP/2-proxy request corrupts NGINX
              worker memory -> worker crash loop (DoS) and, where ASLR is off/bypassed, code execution in
              the worker; attacker spawns a shell/recon tool, drops a webshell/ELF, opens a listener, and
              beacons out. EDR sees the post-exploit consequences (worker-parented exec / file write / net).
QUERIES RUN:  Q1 nginx->shell/interpreter (IOA) | Q2 nginx->recon/download (IOA) | Q3 nginx writes ELF/webshell (IOA) |
              Q4 new non-nginx listener | Q5 rare nginx egress | Q6 worker respawn storm | Q7 vulnerable version inventory
              + Native N1-N5 (version inventory, crash logs, persistence, edge traffic, config audit)
DO FIRST:     Patch NGINX >= 1.31.2 / 1.30.3 / NGF 2.6.4 / Plus R36 P6 and reload (Q7/N1); else disable HTTP/3 and
              remove ignore_invalid_headers off / shrink buffers (S12); confirm ASLR=2; then Q1, Q2 - escalate any hit
FINDINGS:     <pending analyst execution>
GAPS:         In-worker UAF/heap primitive invisible to EDR (in-process); delivery step needs edge/WAF logs
ACTIONS:      Patch fleet-wide; disable HTTP/3 + fix header config; egress-filter web tiers; read-only web roots;
              promote Q1 to Custom IOA Detect+Block
OWNER:        HuntPack
VERSION:      v0.1 - 2026-06-19
17

Changelog

v0.32026-07-24CQL correctness pass. All table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.
v0.22026-06-29CQL syntax review (crowdstrike-logscale-v3): fixed test() comparison operators — == → = and lowercased and/or (Q7).
v0.12026-06-19Initial pack (review-v2 gold layout): fixed left-sidebar scrollspy TOC, collapsible, cloud selector inside the CQL section, per-card Copy/Open-in-Falcon, Grouped IOC Quick-Copy grid, coverage map, validation gates, ticket. Confirmed two critical CVSS v4 9.2 unauthenticated RCE flaws — CVE-2026-42530 (UAF in ngx_http_v3_module / HTTP/3 QUIC QPACK encoder reopen) and CVE-2026-42055 (heap overflow in ngx_http_proxy_v2_module + ngx_http_grpc_module); out-of-band patches ~17–18 Jun 2026; fixed builds NGINX OSS 1.31.2 / 1.30.3, NGF 2.6.4, Plus R36 P6 / 37.0.2.1; F5 advisories K000161616 & K000161584; affected families OSS/Plus/NGF/Ingress/Instance Manager/App Protect; companion high-sev NGF config-injection CVEs (-11311 / -50107). 7 CQL + 5 native hunts, 3 IOA candidates. Behavior-keyed (no atomic IOCs, no PoC, no confirmed ITW exploitation published).
18

References

TierSourceUsed For
1F5 Advisory K000161616 — CVE-2026-42530 (NGINX HTTP/3 UAF)Authoritative affected/fixed versions; trigger conditions; mitigation (disable HTTP/3)
1The Hacker News — F5 Patches Two Critical NGINX Open Source Flaws Enabling RCECVSS v4 9.2 x2; mechanism (QPACK reopen UAF / HTTP/2 heap overflow); ASLR caveat; full affected-product list; fixed builds; advisory IDs
2SecurityWeek — F5 Patches Critical, High-Severity NGINX VulnerabilitiesTwo criticals + high-sev NGF config-injection bugs (-11311/-50107); affected families; mitigation framing
2BleepingComputer — F5 issues out-of-band patches for critical NGINX vulnerabilitiesOut-of-band release (18 Jun 2026); no active exploitation reported; mitigation (remove quic from listen); F5 targeting history
2Security Affairs · Cyber Security News · GBHackersDoS-via-worker-crash as reliable outcome; RCE conditional on ASLR; impact framing; patch-now guidance; no IOCs

HuntPack v0.1 · F5 NGINX CVE-2026-42530 / CVE-2026-42055 (critical unauthenticated RCE) · Generated 2026-06-19 · Defensive use only — no exploit code. The patch (NGINX ≥ 1.31.2 / 1.30.3, NGF 2.6.4, Plus R36 P6 / 37.0.2.1) is the fix; config mitigations (disable HTTP/3, fix header handling) close the trigger conditions; behavioral hunts cover the post-exploitation chain and are durable defense-in-depth for web-server-exploit follow-on. No atomic IOCs, PoC, or confirmed in-the-wild exploitation were published as of generation; validate field names (especially the Q7 version feed) in your tenant before promoting any query to alerting.