首页/安全/安全加固速查/PATH 可写目录核查(劫持面)
主机加固基线90 条

PATH 可写目录核查(劫持面)

系统 PATH 中若存在非管理员可写目录,攻击者可放置同名程序劫持其他进程调用,是本地提权的常见入口;用普通权限账户筛查。

安全加固速查安全更新于 2026-10-13

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 劫持能直接拿到高权限的原因。

易错点

  • 用管理员账户做测写验证:结果全是可写,检查彻底失去意义
  • 只查系统级 PATH,漏掉用户级与 GPO 下发项:留下真实的劫持面
  • PATH 中保留网络共享路径:UNC 目录的写权限由文件服务器决定,本机收紧 ACL 也没有用
  • 发现可写目录后只改 ACL 不移出 PATH:目录结构或权限后续变更时会重新变成可写

数据来源与参考

  • MITRE ATT&CK:PATH 劫持(T1574.007)
  • Microsoft Learn:文件系统权限与最小权限

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌