PATH 劫持是怎么发生的
进程按名称调用程序时,Windows 会沿着 PATH 的目录顺序依次查找。如果 PATH 中存在普通用户可写、且排在系统目录之前的路径,攻击者放一个同名程序就能劫持调用链,实现本地提权或持久化。这类问题多数不是设计缺陷,而是安装与运维时把程序目录、共享目录甚至盘符根目录随手写进了系统 PATH。
基本信息
| 加固项 | 执行路径劫持面 |
|---|---|
| 适用平台 | Windows Server / Windows 10 及以上 |
| 检查对象 | 系统级 PATH 与用户级 PATH |
| 检查身份 | 普通用户(非管理员) |
| 验收要点 | 所有 PATH 目录对普通用户不可写 |
| 风险等级 | 中 |
典型使用场景
- 基线核查:把 PATH 可写目录检查纳入主机加固清单
- 提权事件复盘:提权链路上常出现被替换的合法程序名
- 新系统交付:安装第三方软件后复查 PATH 是否被追加了可写目录
- 资产清理:发现指向临时目录、共享盘或已卸载软件残留路径的 PATH 项
核查 PATH 与测写权限
核查 PATH 与测写权限
# 查看系统级与用户级 PATH 的实际内容
[Environment]::GetEnvironmentVariable('Path','Machine')
[Environment]::GetEnvironmentVariable('Path','User')
# 以普通用户身份逐个目录测写权限(管理员测写结果无意义)
$env:PATH -split ';' | Where-Object { $_ } | ForEach-Object {
$d = $_ -replace '"',''
if (Test-Path $d) {
try {
$t = Join-Path $d ('wtest_' + [guid]::NewGuid().ToString() + '.tmp')
[IO.File]::WriteAllText($t, 'x'); Remove-Item $t -Force
Write-Output ("WRITABLE: " + $d)
} catch { }
}
}可疑 PATH 形态与处置
| PATH 形态 | 风险 | 处置 |
|---|---|---|
| 盘符根目录(C:\ 等) | 部分系统上非管理员可写 | 移出 PATH,或先收紧目录 ACL |
| 共享目录与 UNC 路径 | 写权限由文件服务器决定,不受本机 ACL 控制 | 从系统 PATH 中移除 |
| 已卸载软件的残留目录 | 目录可被重建后写入程序 | 清理无效 PATH 项 |
| 用户级 PATH 指向用户目录 | 用户可自行放置同名程序 | 结合应用控制评估是否需要保留 |
必须用普通权限账户测试:管理员测写永远显示可写,得到的结论没有参考价值。
用户级 PATH 与系统级 PATH 是两处配置,域环境还可能由 GPO 追加,核查时三处都要看。
被劫持的程序往往由提权后的服务或管理员进程调用,这正是 PATH 劫持能直接拿到高权限的原因。