pstrip64.sys 内核驱动程序暴露了一个 IOCTL,允许低权限用户将任意范围的物理内存映射到自己的虚拟地址空间中。该原语允许对系统物理 RAM 进行完全读写访问,使攻击者能够修改关键的内核结构并将权限提升至 NT AUTHORITY\SYSTEM。
该驱动程序创建了设备对象 \Device\PSTRIP64 和符号链接 \DosDevices\PSTRIP64,可供用户访问。
该漏洞存在于 DispatchDeviceControl 例程中,具体是 IOCTL 0x80002008 的处理程序。函数 sub_11000 打开指向 \Device\PhysicalMemory 的句柄,并通过 ZwMapViewOfSection 将其直接映射到调用进程的地址空间中。它从输入缓冲区接受物理地址和长度,通过 HalTranslateBusAddress 对其进行转换,并使用 ZwCurrentProcess() 进行映射。攻击者可以扫描物理内存以找到自己进程的 _EPROCESS 结构,并将安全令牌覆盖为 System 的令牌,或直接修补内核代码。
类似的漏洞最早出现在 CVE-2008-5725 中,涉及该应用早期版本中的 pstrip.sys 文件,当时 PowerStrip 驱动程序使用 IOCTL 0x800020A8,允许攻击者传递目标地址(如 HalDispatchTable)以及要写入该地址的数据。这次在最新版本中发现的漏洞明确允许用户将任意物理内存映射到自己的进程中。攻击者映射物理 RAM,扫描自己的进程结构,并手动编辑自己的令牌以获得管理员权限。直接对内存进行操作。
RtlInitUnicodeString(&DestinationString, L"\\Device\\PhysicalMemory");
// ...
result = ZwOpenSection(&SectionHandle, 0xF001Fu, &ObjectAttributes);
// ...
v8 = ZwMapViewOfSection(..., (HANDLE)0xFFFFFFFFFFFFFFFFLL, ...);
为了演示权限提升,我们开发了一个 PoC,但为避免滥用,不会公开提供任何代码。

