secure_path能防path劫持,因其强制sudo忽略用户path而只从预定义可信目录查找命令,阻断恶意程序伪装提权。需用sudo visudo配置为defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin",并配合env_reset、env_delete+="path"等加固。

直接在 /etc/sudoers 中设置 Defaults secure_path,就能强制所有 sudo 命令只从预定义的可信目录中查找可执行文件,彻底绕过用户自定义的 PATH——这是阻断 PATH 劫持类提权攻击最有效、最基础的一环。
为什么 secure_path 能防 PATH 劫持
普通用户可能把恶意二进制(比如伪装成 ls 或 vim 的后门程序)放在 ~/bin、/tmp 或当前目录,并通过修改自己的 PATH="~/bin:$PATH" 让它优先被调用。一旦用户用 sudo ls,若未启用 secure_path,系统就可能执行那个恶意 ls,从而以 root 权限运行攻击代码。
secure_path 一启用,sudo 就完全忽略用户的 PATH,只认你指定的路径列表,相当于给命令执行加了一道“白名单栅栏”。
如何正确配置 secure_path
使用 sudo visudo 编辑配置,添加或确认以下行:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"- 路径顺序重要:靠前的目录优先匹配,建议把
/usr/sbin和/sbin放在前面,确保关键管理命令(如useradd、iptables)不被覆盖 - 避免包含
.(当前目录)、~/bin、/tmp、/var/tmp等用户可控路径 - 若系统使用 snap 包,保留
/snap/bin;若不用,可删去
配合其他 Defaults 防止绕过
单设 secure_path 不够,攻击者可能通过其他方式绕过路径限制:
-
Defaults env_reset:显式开启环境重置,防止LD_PRELOAD或SHELL等变量干扰执行流程 -
Defaults env_delete += "PATH":进一步确保用户PATH不被意外继承(虽env_reset已默认清空,此为双重保险) -
Defaults !use_pty不要禁用伪终端——反而应确保Defaults use_pty启用,防止后台进程脱离控制 - 对高敏场景,可配合
Defaults noexec,让sudo vim中的!sh失效,切断解释器逃逸链
验证是否生效
配置保存后,立即验证:
- 运行
sudo -V | grep 'Value of secure_path',确认输出与你设置一致 - 临时在用户
PATH前插入一个含假id的目录:export PATH="/tmp/fakebin:$PATH",再执行sudo id,应仍返回真实id输出,而非假程序输出 - 检查
sudo visudo -c返回parsed OK,避免语法错误导致 sudo 失效
secure_path 不是锦上添花的选项,而是 sudo 安全基线的刚性要求。只要路径列表干净、无用户写入点、且与其他 Defaults 协同生效,就能堵住绝大多数基于环境变量的提权入口。











