核心是切断攻击者篡改PATH的路径:优先用/etc/environment固定PATH(由PAM加载、不可被shell覆盖),锁定用户启动文件权限,禁用/etc/profile.d/中动态拼接,关键操作强制使用绝对路径并运行时校验。

防止命令行路径劫持,核心不是“多设几个变量”,而是切断攻击者篡改 PATH 的路径。新手最容易被利用的环节是用户级启动文件(如 ~/.bashrc)和系统级脚本(如 /etc/profile.d/ 中的不安全脚本),攻击者常通过写入恶意 export PATH=... 来前置伪造目录,从而让 ls、curl 等常用命令被替换成后门程序。
优先用 /etc/environment 固定关键变量
这是最抗劫持的方式——它由 PAM 模块直接加载,不经过 shell 解析,无法执行命令,也不受用户文件影响。
- 编辑
/etc/environment(需 root 权限),只写严格格式:PATH="/usr/local/bin:/usr/bin:/bin",等号两边**不能有空格**,不支持$PATH引用或拼接 - 确认 PAM 已启用:检查
/etc/pam.d/common-session是否含session required pam_env.so(Ubuntu/Debian 默认开启;RHEL/CentOS 需手动添加) - 重启登录或新开终端生效,之后所有用户都会从这里获得初始
PATH,且无法被unset或export覆盖
锁定用户启动文件权限,阻断覆盖入口
攻击者一旦拿到普通用户权限,第一件事就是往 ~/.bashrc 里加恶意 export。必须剥夺其修改权。
- 对已有用户,运行:
chmod 644 ~/.bashrc ~/.profile && chown root:root ~/.bashrc ~/.profile - 清理
/etc/skel/下的默认模板(如skel/.bashrc),或同样设为root:root且644,避免新建用户继承风险 - 检查
~/.bash_profile和~/.profile是否存在冗余的source ~/.bashrc或重复export PATH,删掉或注释
谨慎使用 /etc/profile.d/,杜绝动态拼接
这个目录下的脚本按字母顺序执行,容易被用户自定义脚本覆盖,也容易因命名不当被绕过。
- 只放必要脚本,命名加数字前缀(如
01-secure-path.sh),确保早于用户可能创建的99-custom.sh - 脚本内禁止出现:
export PATH="$HOME/bin:$PATH"、$(whoami)、source ~/.env等任何引用用户可控内容的写法 - 设置只读:
chmod 644 /etc/profile.d/01-secure-path.sh,并用chown root:root锁定所有权
运行时验证与最小化 PATH
配置再严,也不能完全信任环境变量。关键操作应主动校验。
- 在重要脚本开头加入检查:
if [[ ":$PATH:" != *":/usr/bin:"* ]]; then echo "PATH corrupted!" >&2; exit 1; fi - 敏感操作(如 sudo、ssh、curl)尽量用绝对路径调用:
/usr/bin/curl而非curl - 定期检查异常 PATH 项:
echo $PATH | tr ':' '\n' | grep -E '^/tmp|^/var/tmp|^\.',发现可疑路径立即排查

















