b3s3da/TcnPeripheral64_PoC
GitHub: b3s3da/TcnPeripheral64_PoC
针对 Sunia SPB 外设驱动任意物理内存映射漏洞的 Windows 本地提权 PoC,通过 Token 窃取实现从普通用户到 SYSTEM 的权限跨越。
Stars: 5 | Forks: 0
# CVE-2026-XXXX: Sunia SPB 外设驱动 LPE
**漏洞利用标题:** Sunia SPB 外设驱动 - 任意物理内存读写导致本地权限提升
**日期:** 2026-01-20
**漏洞利用作者:** b3s3da
**供应商:** Sunia Electronics
**驱动版本:** 1.0.7.2 (TcnPeripheral64.sys)
**SHA256:** `fa4e294b11e613a27722559b043637bd4d0af5603ab7e8c7970caffd96cf7247`
**测试环境:** Windows 10 x64 (21H2), Windows 11 x64 (24H2)
**漏洞类型:** 通过任意物理内存读写实现本地权限提升 (LPE)
## 📝 描述
`TcnPeripheral64.sys` 驱动程序(Sunia SPB 外设驱动,随某些 Lenovo 设备提供)在其 IOCTL 处理程序中存在一个严重漏洞,允许非特权用户模式应用程序以读写权限(`PAGE_READWRITE`)映射任意物理内存。
该漏洞存在于 IOCTL `0x4002848` 的分发例程中。驱动程序接受用户提供的物理地址和大小,然后将其直接传递给由 `\Device\PhysicalMemory` 支持的 `MmMapIoSpace` / `ZwMapViewOfSection`,而未对请求的地址范围或调用者权限进行任何验证。
拥有低权限代码执行能力的攻击者可以利用此漏洞实现完整的本地权限提升至 `NT AUTHORITY\SYSTEM`,方法是:
1. 扫描物理内存以查找 `EPROCESS` 内核结构
2. 定位 `System` 进程 (PID 4) 和攻击者的进程
3. 使用 `System` 令牌覆盖攻击者进程的 `Token`
4. 生成一个继承 `SYSTEM` 权限的子进程
## 🔧 技术细节
| 属性 | 值 |
|----------|-------|
| **易受攻击驱动** | `TcnPeripheral64.sys` |
| **符号链接** | `\\.\SPBTESTTOOL` |
| **易受攻击 IOCTL** | `0x4002848` (十进制: `67119176`) |
| **易受攻击函数** | 偏移量 `0x2D08` 处的子程序 |
| **驱动哈希 (SHA256)** | `fa4e294b11e613a27722559b043637bd4d0af5603ab7e8c7970caffd96cf7247` |
### 漏洞根本原因
位于 `sub_140001120`(物理读取)和 `sub_140001290`(物理写入)的 IOCTL 处理程序调用 `MmMapIoSpace` 时使用了用户控制的 `PhysicalAddress` 和 `Size` 参数,且未进行任何边界检查:
```
// Decompiled from sub_140001120 (Read Physical Memory)
v10 = MmMapIoSpace(*v6, v9, MmCached); // v6 = user-supplied PhysAddr, v9 = user-supplied Size
memmove(v7, v10, v9); // copies to user output buffer
MmUnmapIoSpace(v11, v9);
```
未执行以下检查:
- 物理地址范围(允许映射内核内存、EPROCESS 结构、页表)
- 调用者的权限级别(任何用户都可以发送 IOCTL)
- 映射请求的大小
### IOCTL 结构
```
// Input Buffer (40 bytes minimum)
struct MapRequest {
uint64_t Size; // Mapping size
uint64_t PhysicalAddress; // Target physical address — NO VALIDATION
uint64_t Reserved[3]; // Padding
};
// Output Buffer (40 bytes)
struct MapResponse {
uint64_t Unknown1;
uint64_t Unknown2;
uint64_t SectionHandle;
void* MappedAddress; // Userspace pointer to mapped physical memory
uint64_t Object;
};
```
## ⚙️ 硬件初始化绕过 (BYOVD 上下文)
该驱动程序包含一个 `Hardware Init` 检查 (`sub_1400017A0`),它在启用 IOCTL 接口之前验证特定 ACPI 资源(GPIO/中断)的存在。在没有 Sunia 硬件的标准系统上,驱动程序初始化失败,返回 `Error 1` (`ERROR_INVALID_FUNCTION`)。
**利用技术:** 为了在任意目标上利用此漏洞(自带易受攻击驱动场景),必须将驱动程序手动绑定到遗留系统资源。这通过强制驱动程序附加到现有系统设备来绕过初始化检查。
## 🚀 概念验证
PoC (`src/main.cpp`) 演示了从非特权用户到 `NT AUTHORITY\SYSTEM` 的完整 LPE:
1. 通过 `\\.\SPBTESTTOOL` 符号链接打开驱动程序
2. 从 `ntoskrnl.exe` 导出函数动态解析 `EPROCESS` 偏移量(`PsGetProcessId`, `PsGetProcessImageFileName`, `PsReferencePrimaryToken`) — 跨 Windows 版本有效,无需硬编码偏移量
3. 通过 Superfetch API(`NtQuerySystemInformation` 类 79)枚举物理内存范围
4. 通过匹配 `ImageFileName`、验证 `ActiveProcessLinks`(内核指针)和 `UniqueProcessId` 来扫描物理内存中的 `EPROCESS` 结构
5. 将 `System` 进程令牌复制到利用程序的 `EPROCESS`
6. 生成以 `NT AUTHORITY\SYSTEM` 运行的 `cmd.exe`
### 驱动安装(绕过设置)
由于目标机器可能缺乏特定的 Sunia 硬件,请使用“遗留硬件”方法安装驱动程序:
1. 打开 **设备管理器** (`devmgmt.msc`)
2. 选择 **操作** → **添加过时硬件**
3. 选择 **“安装我手动从列表选择的硬件”**
4. 选择 **“系统设备”** → **下一步**
5. 点击 **“从磁盘安装...”** 并浏览到 `TcnPeripheral64.inf`
6. 选择 **“Sunia SPB Peripheral Driver”** 并完成安装
## 📸 截图
任意物理内存读写:
标签:BYOVD, CVE-2026, EPROCESS, IOCTL, Lenovo, LPE, MmMapIoSpace, PoC, Sunia SPB, TcnPeripheral64.sys, Token篡改, Web报告查看器, Windows 10, Windows 11, Windows内核安全, 任意物理内存读写, 内核利用, 协议分析, 子域名枚举, 暴力破解, 本地权限提升, 权限提升, 漏洞复现, 系统安全, 网络安全, 隐私保护, 驱动漏洞