新手防止路径劫持的核心是严格控制PATH构造与加载顺序:优先通过/etc/environment固定安全路径,禁用用户级拼接,启动时校验并优先使用绝对路径。

新手防止路径劫持,核心不是“多设几个变量”,而是让系统只信任你明确指定的、干净的命令路径,同时堵住被篡改的入口。关键在 PATH 的构造方式和加载顺序控制。
优先用 /etc/environment 固定基础 PATH
这是最安全的起点——它由 PAM 直接加载,不经过 shell 解析,用户无法通过 ~/.bashrc 覆盖或拼接。
- 编辑 /etc/environment(需 root 权限),只写严格格式的键值对:
PATH="/usr/local/bin:/usr/bin:/bin"
注意:等号两侧不能有空格,不支持 $HOME 或 :$PATH 这类追加写法 - 确认 PAM 已启用:
检查 /etc/pam.d/common-session 是否含session required pam_env.so(Ubuntu/Debian 默认开启;RHEL/CentOS 需手动添加)
禁用用户级 PATH 拼接操作
很多劫持发生在用户自己改 ~/.bashrc,比如写 export PATH="/tmp:$PATH",把恶意目录塞到最前面。
- 对所有已有用户,运行:
chmod 644 ~/.bashrc ~/.profilechown root:root ~/.bashrc ~/.profile - 清空或设为只读 /etc/skel/.bashrc,避免新建用户继承风险模板
- 检查 /etc/profile.d/ 下脚本:删除非系统自带、命名可疑(如 99-hack.sh)或含
$(whoami)、~/.config等动态路径的文件
关键服务启动时主动校验 PATH
配置再严,运行时仍可能被子进程修改。敏感脚本应自己把关:
- 在脚本开头加入校验逻辑:
case ":$PATH:" in<br> *":/tmp:"*|*":/var/tmp:"*|*":."*) echo "Dangerous PATH detected" >&2; exit 1;;<br>esac
- 执行重要命令时优先用绝对路径:
不用ls,改用/bin/ls;不用curl,改用/usr/bin/curl - 若必须依赖 PATH,先重置为已知安全值:
PATH="/usr/local/bin:/usr/bin:/bin"
别碰那些看似方便的“快捷写法”
以下操作看似省事,实则打开劫持后门:
- 避免在任何配置文件中写
export PATH="$PATH:/my/tool"—— 用户可提前污染 $PATH - 不要用
eval $(some_command)加载环境变量,除非完全信任该命令输出 - 禁止在 /etc/profile.d/ 脚本里调用
source ~/.env或类似用户可控文件

















