通过限制 sudo 命令为绝对路径、禁用解释器与通配符、启用 secure_path 并配合完整性校验、noexec 和远程日志,可有效防御路径劫持与恶意脚本执行。

通过限制 sudo 命令的可执行路径,可以有效防止攻击者利用通配符、相对路径或环境变量污染等方式绕过权限控制执行恶意脚本。核心思路是:只允许用户以 root 权限运行明确指定的、绝对路径下的可信二进制文件,禁止 shell 解释器(如 /bin/sh、/bin/bash)和危险命令(如 env、perl、python)出现在 sudoers 中。
严格配置 sudoers 文件中的命令路径
在 /etc/sudoers 或独立的 /etc/sudoers.d/ 文件中,始终使用**完整绝对路径**声明可执行命令。避免任何形式的通配符(*)、shell 元字符(?、[)或目录通配(/usr/local/bin/*)。
- ✅ 正确写法:
alice ALL=(root) /usr/bin/systemctl restart nginx - ❌ 危险写法:
alice ALL=(root) systemctl restart nginx(未限定路径,可能被同名恶意程序劫持) - ❌ 危险写法:
bob ALL=(root) /usr/bin/*(通配符允许执行任意命令)
禁用解释器类命令与 shell 功能
绝大多数非法脚本执行依赖于调用解释器启动恶意代码。sudoers 中应显式禁止以下路径:
-
/bin/sh、/bin/bash、/bin/dash、/usr/bin/zsh -
/usr/bin/python*、/usr/bin/perl、/usr/bin/ruby -
/usr/bin/env(常被用于绕过路径限制,例如sudo env PATH=/tmp:$PATH /bin/sh) -
/bin/bash -c、/bin/sh -c等带-c参数的调用形式(即使路径正确也需禁止参数)
启用 sudo 的 secure_path 并定期审计
sudo 默认启用 secure_path,它会覆盖用户的 PATH 环境变量,仅保留系统管理员预设的安全路径(如 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)。但需确认该设置未被覆盖或禁用:
- 检查
sudo -V | grep "Value to override"输出是否包含secure_path - 确保 sudoers 中没有
Defaults env_reset被设为!env_reset或env_keep += "PATH" - 定期运行
sudo -l -U username审计每个用户的可用命令,确认无意外暴露的高危路径
配合其他加固手段提升实效性
仅靠路径限制不足以完全防御,建议组合以下措施:
- 对所有被 sudo 授权的二进制文件启用
setuid检查与完整性校验(如用rpm -V或dpkg --verify) - 启用
requiretty(默认开启),防止后台进程伪造终端提权 - 使用
NOEXEC标志(如Defaults!/path/to/cmd noexec)阻止命令 fork 出子 shell(对支持 noexec 的系统有效) - 记录所有 sudo 日志到独立远程日志服务器,并监控异常命令模式(如频繁调用
env或解释器)










