这是一个针对 CVE-2026-29923 的最小概念验证(PoC)。该漏洞位于 pstrip64.sys 内核驱动(EnTech Taiwan PowerStrip ≤ 3.90.736)中,允许无特权的用户态进程提升至 NT AUTHORITY\SYSTEM。
pstrip64.sys 暴露了一个 IOCTL(0x80002008),该 IOCTL 接受用户提供的物理地址,并通过打开 \Device\PhysicalMemory 以及以当前进程句柄调用 ZwMapViewOfSection,将其直接映射到调用进程的虚拟地址空间中。此过程中没有任何权限检查,除了 HalTranslateBusAddress 强制执行的地址验证外也没有任何地址校验,并且符号链接 \\.\PSTRIP64 上不存在访问控制。
最终结果是从无特权进程获得不受限制的物理内存读写原语。
在拥有任意物理内存读/写能力后,该利用按以下四个步骤进行。
1. 扫描 EPROCESS 结构
物理内存以 2 MB 块为单位进行遍历。每个块都会扫描内核池标记 Proc(0x636F7250),该标记标识包含进程 _EPROCESS 结构的池分配。在信任 PID 之前,候选命中会通过以下三种轻量级启发式规则进行验证:
PriorityClass == 0x2 — 所有存活进程都以 Normal 优先级运行ProcessLock == 0x0 — 稳定进程的该锁字段应为空ImageFileName[0] 是可打印 ASCII — 垃圾内存很少满足此条件2. 定位两个令牌指针
需要两个目标:
_EPROCESS 中 Token 字段的物理地址_EPROCESS 中存储的令牌值3. 覆盖我们的令牌
包含我们 Token 字段的 4 KB 页面被映射,并将该字段覆盖为系统令牌值。从此刻起,Windows 内核会将我们的进程视为 NT AUTHORITY\SYSTEM。
4. 派生一个 Shell
通过 CreateProcessA 启动 cmd.exe。由于子进程继承父进程的令牌,生成的 Shell 将以 SYSTEM 身份运行。
在 x86 系统上,3 GB – 4 GB 物理地址窗口保留给 MMIO。尝试映射该范围内的页面会导致驱动返回错误 74(HalTranslateBusAddress 失败)。扫描会跳过此窗口,并从 0x100000000 继续,以捕获 Windows 放置在 4 GB 标记之上的内核结构。
该驱动的映射处理程序将返回的虚拟地址写入 DWORD 字段(LowPart),从而将 64 位虚拟地址截断为 32 位。64 位构建会收到损坏的指针并立即崩溃。请按 x86 编译。
| 软件 | 版本 |
|---|---|
| EnTech Taiwan PowerStrip | ≤ 3.90.736 |
驱动哈希(SHA-256):
ab01485bb7c8bc1a9c86096eeea6d31d8fad557bf4d44072b46373d2203faa6e
硬编码偏移针对的是 Windows 10 22H2 x64。其他版本需要更新的值——请使用 WinDbg 中的 dt nt!_EPROCESS 确认。
打开 Visual Studio x86 开发者命令提示符并运行:
cl /EHsc /O2 exploit.c /Fe:poc.exe
或者在 Visual Studio 中将平台目标设置为 x86,并以 Release 模式构建。除 Windows SDK 外,该二进制无需任何外部依赖。
首先加载 pstrip64.sys(加载驱动需要管理员权限,但加载后运行利用程序本身不需要),然后:
poc.exe
将打开一个新的 cmd.exe 窗口,并以 NT AUTHORITY\SYSTEM 身份运行。
阻止驱动加载(首选)
检测正在进行的利用行为
SYSTEM 级子进程NT AUTHORITY\SYSTEM 的进程此代码仅用于教育和防御性研究目的。请仅在您拥有或已获得明确书面许可进行测试的系统上使用。作者不对任何滥用行为负责。
| 字段 | 偏移 |
|---|
PriorityClass | 0x5B7 |
ProcessLock | 0x438 |
UniqueProcessId | 0x440 |
ImageFileName | 0x5A8 |
Token | 0x4B8 |