CVE-2026-47291 — HTTP.sys Remote Code Execution Vulnerability
Executive Summary
Integer overflow or wraparound in Windows HTTP.sys allows an unauthorized attacker to execute code over a network.
Overview
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C
EPSS Score
Affected Products
| Product | KB Article | Severity | Impact | Restart Required |
|---|---|---|---|---|
| Windows 10 Version 1607 for 32-bit Systems | 5094122 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 1607 for x64-based Systems | 5094122 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 1809 for 32-bit Systems | 5094123 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 1809 for x64-based Systems | 5094123 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for 32-bit Systems | 5094127 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for ARM64-based Systems | 5094127 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for x64-based Systems | 5094127 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for 32-bit Systems | 5094127 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for ARM64-based Systems | 5094127 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for x64-based Systems | 5094127 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 23H2 for ARM64-based Systems | 5093998 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 23H2 for x64-based Systems | 5093998 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 24H2 for ARM64-based Systems | 5094126 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 24H2 for x64-based Systems | 5094126 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 25H2 for ARM64-based Systems | 5094126 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 25H2 for x64-based Systems | 5094126 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 Version 26H1 for ARM64-based Systems | 5095051 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows 11 version 26H1 for x64-based Systems | 5095051 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 | 5094042 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 (Server Core installation) | 5094042 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 R2 | 5094041 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 R2 (Server Core installation) | 5094041 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2016 | 5094122 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2016 (Server Core installation) | 5094122 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2019 | 5094123 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2019 (Server Core installation) | 5094123 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2022 | 5094128 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2022 (Server Core installation) | 5094128 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2025 | 5094125 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2025 (Server Core installation) | 5094125 (Security Update) |
Critical | Remote Code Execution | Yes |
Patches
| Article | Type | Restart |
|---|---|---|
5094122 |
Security Update | Yes |
5094123 |
Security Update | Yes |
5094127 |
Security Update | Yes |
5093998 |
Security Update | Yes |
5094126 |
Security Update | Yes |
5095051 |
Security Update | Yes |
5094042 |
Monthly Rollup | Yes |
5094041 |
Monthly Rollup | Yes |
5094128 |
Security Update | Yes |
5094125 |
Security Update | Yes |
Patch Diff
Remote, pre-auth kernel pool overflow (CWE-190 -> CWE-122) in HTTP.sys HTTP/1.x header parsing. UlpParseNextRequest tracks receive buffers in a per-request buffer-reference array with 16-bit capacity (+0x640) and count (+0x642) fields. When count reaches capacity it grows the array: ExAllocatePool3(0x28 + capacity*8), memmove(count<<3), then capacity += 5 as a 16-bit add WITH NO OVERFLOW CHECK. After 13,107 growths capacity=0xFFFB; +5 = 0x10000 truncates to 0. The next reference forces a grow that allocates only 0x28+0*8 = 40 bytes but memmoves count<<3 (~524,256 bytes) -> ~500KB NonPagedPool overflow. Reachable only over HTTP/1.x-over-TLS: SChannel delivers each TLS record as a separate buffer (1:1 record->reference), so an attacker sends one header line per TLS record; plaintext HTTP coalesces and cannot climb the count. Needs MaxRequestBytes >= 262144 (non-default). IN-HOUSE ghidriff diff of 10.0.26100.8521 -> .8655 confirms the ZDI/TrendAI root cause exactly and reveals the fix: the growth logic is extracted into a new routine UlpReferenceBuffers that adds new=capacity+5; if (new < capacity) bail - the missing 16-bit overflow check. The fix is GATED behind a Known Issue Rollback global UxKirRefBufferOverflowCheck: when that byte is 0 the patched binary runs the ORIGINAL unchecked growth path, so file version alone does not determine patch state. Credit: MSRC haowei yan, goodbyeselene (@ynwarcs); public analysis Yazhi Wang & Jonathan Lein (TrendAI/ZDI).
| Function | Address | Change | Note |
|---|---|---|---|
UlpParseNextRequest |
pre: inline growth (calls memmove) -> post: calls UlpReferenceBuffers |
code (vulnerable inline growth removed, replaced by call to fixed routine) | Pre-patch inlines the buffer-ref array growth: ExAllocatePool3(0x28 + *(ushort*)(state+0x640)*8), memmove(*(ushort*)(state+0x642) << 3), *(short*)(state+0x640) += 5 with no overflow check. Post-patch the inline block is replaced by cVar4 = UlpReferenceBuffers(state, buffer). Match 80%; loses direct memmove/ExAllocatePool3, gains UlpReferenceBuffers in its called-list. |
UlpReferenceBuffers |
140097880 (effectively new; ghidriff mis-matched to WPP_SF_qII at 21%) |
added (extracted, bounds-checked growth routine; KIR-gated) | New routine holding the growth logic. Branches on global UxKirRefBufferOverflowCheck: if 0, runs the ORIGINAL vulnerable path (0x28 + capacity*8 alloc, capacity += 5, no check); if non-zero, computes uVar6 = capacity + 5, `if (uVar6 < capacity) goto bail` (16-bit overflow guard), allocates uVar6<<3, memmoves count<<3, stores the checked capacity. Both paths ship in .8655. |
Attack Path
One HTTP header line per TLS record overflows a 16-bit array-capacity counter, desyncing a 40-byte allocation from a ~500KB memmove in the kernel
Derived from the patch delta: the checks added by the vendor identify which fields crossed a trust boundary unvalidated. Reachability and privilege are taken from the call chain in the RCA report.
Known Exploits
Acknowledgments
Microsoft
haowei yan
goodbyeselene