← Back to Feed CACHED · 2026-07-10 02:20:53 · CACHE_KEY CVE-2026-47291
CVE-2026-47291 · CWE-122 · Disclosed 2026-06-09

Integer overflow or wraparound in Windows HTTP

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

A rerun of MS15-034, gated this time by a registry value most admins never touched

CVE-2026-47291 is an integer overflow (CWE-190 leading to CWE-122 heap overflow) in HTTP.sys, the Windows kernel-mode HTTP listener that fronts IIS, WinRM, WSUS, Exchange, RDP Web, ADFS, PowerShell Remoting over HTTPS, and any .NET/HttpListener app. The driver performs 16-bit arithmetic on request size; a header block ≥ 65,535 bytes wraps the allocation to a tiny value, then writes the full request into it — arbitrary code in ring 0. Affected: Windows 10 1607/1809/21H2/22H2, Windows 11 23H2/24H2/25H2/26H1, Server 2012 through 2025 including Server Core. Fixed in the June 2026 Patch Tuesday cumulative rollups.

Microsoft's 9.8 CRITICAL is technically correct for the CVSS math — unauthenticated, network, code execution, kernel context. But the vendor rating hides the single most important operational fact: the default HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\MaxRequestBytes is 16,384 bytes, well below the 65,535-byte overflow threshold. Boxes that were never tuned are not reachable. The population that IS reachable — WSUS, some SharePoint front-ends, load-balancer-fronted APIs, and shops that raised the ceiling to accept large SOAP/Kerberos tickets — is the population you actually need to hunt. That's why we hold at HIGH rather than downgrade further: when it lands, it lands in the kernel.

"Kernel-mode RCE in HTTP.sys is CRITICAL on paper — but default MaxRequestBytes=16384 saves most of the fleet. Hunt the outliers."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify tuned HTTP.sys listener

Attacker fingerprints exposed HTTP endpoints and probes for tolerance of oversized headers. A benign request with ~20 KB of cookie/header padding either returns 200/400 (tuned above default) or 413/400 with Bad Request - Request Too Long (default). Scanners like httpsys-probe.py (published alongside the ManagerEmpty PoC) automate this bucket-sort.
Conditions required:
  • Network reach to TCP/80 or TCP/443 on the target
  • Target has raised MaxRequestBytes ≥ 65,535 or MaxFieldLength above default
Where this breaks in practice:
  • Default MaxRequestBytes = 16,384 bytes — non-exploitable and never changed on the majority of hosts
  • Upstream WAF/reverse proxy (F5, NetScaler, nginx, Cloudflare) typically caps headers at 8–16 KB and strips oversized requests before HTTP.sys sees them
Detection/coverage: Qualys 379412, Tenable 210553, Rapid7 vulndb 42881, Defender Vulnerability Management coverage as of 2026-06-11 all flag missing KB; none check MaxRequestBytes on their own.
STEP 02

Deliver crafted request

Attacker sends a single HTTP/1.1 request with a header block ≥ 65,535 bytes — typically thousands of Cookie: continuations or a bloated Authorization: Negotiate blob. HTTP.sys computes required buffer via truncated 16-bit math, allocates a small pool chunk, and copies the full request into it. Public PoC (ManagerEmpty/CVE-2026-47291-httpsys) demonstrates the corruption but ships DoS-grade payload only.
Conditions required:
  • Step 1 succeeded
  • TCP session reaches HTTP.sys without proxy normalization
Where this breaks in practice:
  • HTTP/2 and HTTP/3 negotiation paths avoid the vulnerable parser on modern IIS
  • Kerberos/NTLM authenticated pre-auth filters may reject before size check on Exchange/ADFS
Detection/coverage: Suricata SID 2049112 and Snort community rule 63204 detect request-line + header length > 65,000 bytes. Windows Firewall + WFP audit log 5157 will not fire.
STEP 03

Kernel heap corruption and control flow hijack

The oversized copy overwrites adjacent NonPagedPoolNx allocations. Reliable exploitation requires shaping the pool with concurrent connections and hitting an object with a controllable pointer — same class of primitive as MS15-034 weaponization. No public working RCE payload as of 2026-07-10; the ManagerEmpty PoC crashes the box (BSOD KERNEL_MODE_HEAP_CORRUPTION).
Conditions required:
  • Heap grooming succeeds (needs several hundred parallel connections)
  • SMEP/SMAP/CET/HVCI configuration allows the specific ROP gadget selected
Where this breaks in practice:
  • HVCI / Memory Integrity blocks kernel shellcode on Windows 11 and Server 2022+ default builds
  • CFG + KASLR force per-boot gadget hunt
  • Pool low-fragmentation heap randomization degrades reliability
Detection/coverage: EDR that hooks nt!ExAllocatePool* (CrowdStrike Falcon, SentinelOne, Defender for Endpoint with kernel telemetry) sees the allocation pattern; naive AV does not.
STEP 04

SYSTEM code execution and lateral pivot

Successful control flow gives kernel-mode execution → trivially spawn a SYSTEM process, drop LSASS token, or install a rootkit. On WSUS/SCCM servers this is a supply-chain jump: attacker signs a definition/config push to every managed endpoint. On ADFS/AD CS Web Enrollment this is domain-wide credential theft.
Conditions required:
  • Step 3 succeeded
Where this breaks in practice:
  • EDR behavioral rules on SYSTEM-spawned cmd.exe from svchost/w3wp with no parent user token
  • Network segmentation of management servers
Detection/coverage: Sysmon 1/10/11 and EDR process-tree analytics catch post-exploitation staging; the kernel corruption itself is invisible to userspace agents.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone confirmed as of 2026-07-10. Microsoft MSRC labels *Exploitation More Likely*. No CISA KEV listing.
Public PoCManagerEmpty/CVE-2026-47291-httpsys — trigger + BSOD only. No public SYSTEM shell yet. Companion scanner httpsys-probe.py fingerprints tuned MaxRequestBytes.
EPSS0.21506 (~top 4% percentile) — elevated but not yet mass-exploitation territory
KEV statusNot listed
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 9.8 CRITICAL. IONIX rescored 10.0 with Scope=Changed given kernel context; MSRC keeps Scope=Unchanged.
Affected versionsWindows 10 1607/1809/21H2/22H2; Windows 11 23H2/24H2/25H2/26H1; Server 2012 → 2025 (incl. Server Core). All builds prior to June 2026 CU.
Fixed inKB5039217 (Server 2022 / Win11 23H2), KB5039212 (Server 2025 / Win11 24H2+), plus June 2026 SSU/LCU rollups per platform. Server 2012 R2 ESU: KB5039227.
Exposure telemetryShodan product:"Microsoft-HTTPAPI/2.0" returns ~4.1M nodes; Censys estimates <3% have non-default MaxRequestBytes based on probe response signatures. GreyNoise tag httpsys-oversized-header-probe at ~40 IPs/day since 2026-06-18 — scanning, not exploitation.
Disclosure date2026-06-09 (June Patch Tuesday)
ReporterReported to MSRC by Xiaoxiao Wu (@wuxx) of Cyber Kunlun Lab; independent rediscovery credited to k0shl.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to HIGH (8.2/10)

The decisive factor is the non-default configuration prerequisite: exploitation requires MaxRequestBytes ≥ 65,535, and telemetry shows fewer than 3% of Internet-facing HTTP.sys endpoints meet that bar. That narrows the reachable population from *every Windows web server* to *a small, identifiable subset*, so the vendor's 9.8 CRITICAL overstates fleet-wide risk — but kernel-mode RCE on the affected minority keeps this firmly HIGH rather than MEDIUM.

HIGH Vulnerability mechanics and patched build enumeration
HIGH Default-configuration non-exploitability
MEDIUM Real-world exposed population estimate (Censys-derived)
LOW Timeline to weaponized public RCE — PoC author is active

Why this verdict

  • Configuration gate: default MaxRequestBytes=16,384 is below the 65,535 overflow threshold — the majority of installs are non-exploitable without an admin-driven tuning change.
  • Front-door friction: reverse proxies, WAFs, and load balancers on production perimeters routinely cap header sizes to 8–16 KB, stripping the oversized request before HTTP.sys sees it.
  • Weaponization gap: public PoC currently produces BSOD, not SYSTEM shell. HVCI/CET/CFG on Server 2022+ and Win11 further degrade exploit reliability.
  • Role multiplier — WSUS/SCCM patch servers: these deployments frequently raise MaxRequestBytes for large update manifests and metadata pushes. Chain succeeds → attacker owns the patch distribution plane → fleet-scale supply-chain pivot. This is why we do not go below HIGH.
  • Role multiplier — ADFS / AD CS Web Enrollment: commonly tuned upward for large Kerberos/SAML tokens. Chain end-state = domain-wide credential theft or rogue certificate issuance.
  • Role multiplier — perimeter Exchange OWA / SharePoint: header ceilings frequently raised for federated auth blobs. Blast radius = mailbox tenant compromise.
  • Kernel context: when the chain does land, it lands as ring-0 — bypasses every user-mode EDR heuristic and enables rootkit persistence. Impact severity is maxed even if reach is narrow.

Why not higher?

No confirmed in-the-wild exploitation, no KEV listing, no public weaponized RCE, and the default configuration is non-exploitable. CRITICAL is reserved for chains that hit a canonical fleet-scale role in default configuration; here the high-value-role hit requires the admin to have already opted into the exploitable state.

Why not lower?

The bug is a kernel-mode RCE in a driver that sits in front of WSUS, ADFS, AD CS Web Enrollment, and Exchange — canonical high-value-role infrastructure that is disproportionately tuned above the exploit threshold. EPSS is already at the 96th percentile with an active PoC author and DoS-grade code public; weaponized RCE is a matter of engineering time. MEDIUM would understate the blast radius on the exposed minority.

05 · Compensating Control

What to do — in priority order.

  1. Verify and hard-cap MaxRequestBytes and MaxFieldLength below 65,535 on every HTTP.sys host — Set HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\MaxRequestBytes and MaxFieldLength to ≤ 32,768 (default is 16,384). This puts the host out of range of the overflow arithmetic. Deploy via GPO within the noisgate 30-day mitigation SLA for the HIGH bucket.
  2. Enforce upstream header-size caps at the reverse proxy / WAF — Configure F5 HTTP::header sanitize, NetScaler HTTP profile reqTimeout + max header size, nginx large_client_header_buffers 4 8k, or Cloudflare Managed Rule 100294 to reject header blocks > 16 KB. This defends even when downstream Windows config drifts. Same 30-day window.
  3. Enable HVCI / Memory Integrity on all Server 2022/2025 and Win11 hosts — Kernel-mode code integrity blocks the shellcode-execution stage of any working RCE payload. Roll out via Intune / GPO HypervisorEnforcedCodeIntegrity. Bake into standard image.
  4. Apply the June 2026 cumulative update (KB5039217 / KB5039212 / distro equivalents) — This is the definitive fix — migrates size tracking to 32-bit and adds pre-allocation bounds checks. Target completion within the noisgate 180-day remediation SLA for HIGH, prioritizing WSUS/SCCM, ADFS, AD CS, Exchange, and any Internet-facing IIS ahead of workstations.
  5. Add Suricata/Snort signature for header blocks > 60 KB — Deploy Suricata SID 2049112 to perimeter IDS to detect probing and eventual exploit attempts. Feed alerts to SIEM with a WSUS/ADFS asset tag correlation rule.
What doesn't work
  • Disabling IIS — HTTP.sys is used by WinRM, WSUS, PowerShell Remoting over HTTPS, and any .NET HttpListener application; stopping W3SVC leaves the driver loaded and reachable.
  • TLS-only configuration — the overflow happens after TLS termination in kernel; HTTPS does not mitigate.
  • Host-based firewall rules restricting to internal ranges — helps against Internet attackers but leaves WSUS/ADFS reachable from any compromised workstation, which is the realistic attack path.
  • User-mode EDR alone — the corruption executes in ring 0 before any user-mode agent gets a callback; only kernel-callback-capable EDR sees the pool-allocation anomaly.
06 · Verification

Crowdsourced verification payload.

Run on each Windows target as local administrator (needed to read HKLM HTTP parameters and query Get-HotFix). Invoke: powershell -ExecutionPolicy Bypass -File .\Check-CVE-2026-47291.ps1. Outputs VULNERABLE, PATCHED, or UNKNOWN and a non-zero exit code on VULNERABLE.

noisgate-verify.ps1
POWERSHELLREAD-ONLYSAFE
#requires -RunAsAdministrator
# Check-CVE-2026-47291.ps1 — HTTP.sys integer overflow assessment
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN

$ErrorActionPreference = 'SilentlyContinue'

# 1. Patched KBs by product family (June 2026 rollups)
$fixedKBs = @('KB5039217','KB5039212','KB5039227','KB5039199','KB5039205')
$installed = Get-HotFix | Select-Object -ExpandProperty HotFixID
$patched = $false
foreach ($kb in $fixedKBs) { if ($installed -contains $kb) { $patched = $true; break } }

# 2. Read HTTP.sys config threshold
$httpParams = 'HKLM:\SYSTEM\CurrentControlSet\Services\HTTP\Parameters'
$maxReq = (Get-ItemProperty -Path $httpParams -Name 'MaxRequestBytes' -EA SilentlyContinue).MaxRequestBytes
$maxField = (Get-ItemProperty -Path $httpParams -Name 'MaxFieldLength' -EA SilentlyContinue).MaxFieldLength
if ($null -eq $maxReq)   { $maxReq   = 16384 }   # Windows default
if ($null -eq $maxField) { $maxField = 16384 }

# 3. Is HTTP.sys actually loaded / listening?
$httpDriver = Get-Service -Name 'HTTP' -EA SilentlyContinue
$listening = $httpDriver -and $httpDriver.Status -eq 'Running'

Write-Host "[*] KB patch present     : $patched"
Write-Host "[*] MaxRequestBytes      : $maxReq"
Write-Host "[*] MaxFieldLength       : $maxField"
Write-Host "[*] HTTP.sys driver up   : $listening"

if ($patched) {
    Write-Host 'PATCHED' -ForegroundColor Green
    exit 0
}
if (-not $listening) {
    Write-Host 'PATCHED (HTTP.sys not running — not exposed)' -ForegroundColor Green
    exit 0
}
if ($maxReq -lt 65535 -and $maxField -lt 65535) {
    Write-Host 'PATCHED (config below overflow threshold — mitigated but still apply June 2026 CU)' -ForegroundColor Yellow
    exit 0
}
if ($maxReq -ge 65535 -or $maxField -ge 65535) {
    Write-Host 'VULNERABLE — missing June 2026 CU AND MaxRequestBytes/MaxFieldLength >= 65535' -ForegroundColor Red
    exit 1
}
Write-Host 'UNKNOWN' -ForegroundColor Yellow
exit 2
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: pull an inventory of every Windows host where MaxRequestBytes or MaxFieldLength is ≥ 65,535 — that's your exploitable subset, likely dominated by WSUS/SCCM, ADFS, AD CS Web Enrollment, Exchange, and SharePoint front-ends. For those hosts the noisgate mitigation SLA for HIGH gives you 30 days: hard-cap the registry value below 32,768 via GPO and push a header-size limit at your upstream WAF/reverse proxy this sprint. Everything else — full deployment of June 2026 cumulative updates (KB5039217/KB5039212/family) — runs on the noisgate remediation SLA of 180 days, with the identity-plane and patch-distribution servers pulled to the front of the queue. If CISA adds this to KEV or a working SYSTEM-shell exploit lands publicly, treat as active exploitation and collapse both windows to hours.

Sources

  1. NVD — CVE-2026-47291
  2. Uganda CERT advisory
  3. IONIX threat center
  4. Tenable CVE record
  5. CVE.report — HTTP.sys RCE
  6. CyberSec AI analysis
  7. Public PoC — ManagerEmpty/CVE-2026-47291-httpsys
  8. Strobes VI CVE detail
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.