mein-0/cve-2026-29923
GitHub: mein-0/cve-2026-29923
CVE-2026-29923 的概念验证,利用 pstrip64.sys 驱动缺乏物理内存映射权限校验的缺陷实现 Windows 本地权限提升至 SYSTEM。
Stars: 0 | Forks: 0
# CVE-2026-29923 — pstrip64.sys 本地权限提升
这是 CVE-2026-29923 的一个最小概念验证。该漏洞存在于 `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 为块单位遍历物理 RAM。扫描每个块以寻找内核池
标记 `Proc`(`0x636F7250`),该标记用于标识包含进程
`_EPROCESS` 结构的池分配项。在信任 PID 之前,会使用三种轻量级启发式方法验证候选命中项:
- `PriorityClass == 0x2` — 所有活动进程都在 Normal 优先级下运行
- `ProcessLock == 0x0` — 稳定进程的锁字段是清零的
- `ImageFileName[0]` 是可打印的 ASCII 字符 — 垃圾内存很少能满足这一点
**2. 定位两个 token 指针**
需要两个目标:
- 我们自己进程在 `_EPROCESS` 中 `Token` 字段的**物理地址**
- System 进程(`PID 4`)`_EPROCESS` 中存储的 **token 值**
**3. 覆盖我们的 token**
映射包含我们 `Token` 字段的 4 KB 页面,并使用 System token 值覆盖该
字段。从此时起,Windows 内核会将我们的进程视为
`NT AUTHORITY\SYSTEM`。
**4. 启动 shell**
通过 `CreateProcessA` 启动 `cmd.exe`。由于子进程会继承
父进程的 token,因此生成的 shell 将以 SYSTEM 身份运行。
## MMIO 注意事项
在 x86 系统上,3 GB 到 4 GB 的物理地址窗口保留给 MMIO 使用。
尝试映射此范围内的页面会导致驱动程序返回错误代码 `74`
(`HalTranslateBusAddress` 失败)。扫描会跳过此窗口并在
`0x100000000` 处恢复,以捕获 Windows 放置在 4 GB 标记之上的内核结构。
## 32 位要求
驱动程序的映射处理程序将返回的虚拟地址写入一个 `DWORD` 字段
(`LowPart`),从而将 64 位的 VA 截断为 32 位。64 位构建版本会接收到
损坏的指针并立即崩溃。**必须编译为 x86 架构。**
## 受影响软件
| 软件 | 版本 |
|---|---|
| EnTech Taiwan PowerStrip | ≤ 3.90.736 |
驱动程序哈希值 (SHA-256):
```
ab01485bb7c8bc1a9c86096eeea6d31d8fad557bf4d44072b46373d2203faa6e
```
## EPROCESS 偏移量
硬编码的偏移量针对的是 **Windows 10 22H2 x64**。其他构建版本需要
更新这些值 — 请在 WinDbg 中使用 `dt nt!_EPROCESS` 进行确认。
| 字段 | 偏移量 |
|---|---|
| `PriorityClass` | `0x5B7` |
| `ProcessLock` | `0x438` |
| `UniqueProcessId` | `0x440` |
| `ImageFileName` | `0x5A8` |
| `Token` | `0x4B8` |
## 构建说明
打开 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` 身份运行。
## 缓解措施
**阻止加载驱动程序(首选)**
- 将上面的驱动程序哈希值添加到您所在组织的黑名单中
- 通过 WDAC 启用 [Microsoft 的易受攻击驱动程序黑名单](https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/microsoft-recommended-driver-block-rules)
- 启用 Hypervisor-Protected Code Integrity (HVCI)
**检测正在进行的漏洞利用**
- 针对未知驱动程序二进制文件的新内核模式服务安装发出警报
- 监控产生 `SYSTEM` 级别子进程的低/中等完整性级别进程
- 标记任何在合法的身份验证事件之外将 token 更改为 `NT AUTHORITY\SYSTEM` 的进程
## 免责声明
此代码仅出于教育和防御性研究目的发布。
请仅在您拥有或获得明确书面许可进行测试的系统上使用它。
作者对任何滥用行为不承担责任。
## 参考
- [Microsoft 易受攻击驱动程序黑名单](https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/microsoft-recommended-driver-block-rules)
- [WDAC 概述](https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/appcontrol)
- [Windows EPROCESS 内部机制](https://www.geoffchappell.com/studies/windows/km/ntoskrnl/inc/ntos/ps/eprocess/index.htm)
- [HalTranslateBusAddress — MSDN](https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/nf-ntddk-haltranslatebusaddress)
- [ZwMapViewOfSection — MSDN](https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-zwmapviewofsection)
标签:0day挖掘, PoC, Web报告查看器, Windows, Windows驱动, 内核安全, 客户端加密, 暴力破解, 本地提权