防止系统全局变量被劫持的核心是“控得准、清得净、验得实”,需在初始化阶段切断攻击链路:优先使用 /etc/environment(PAM 级别,绕过 shell 解析),严格格式 KEY=VALUE;慎用 /etc/profile 及 /etc/profile.d/*.sh,关键变量设为只读;锁定用户启动文件权限;运行时校验 PATH 与关键工具。

防止系统全局变量被劫持,核心不是“设得全”,而是“控得准、清得净、验得实”。关键在于初始化阶段就切断攻击链路:从加载源头隔离、权限源头锁定、内容源头净化,再辅以运行时验证。
优先使用 /etc/environment(PAM 级别,绕过 shell 解析)
这是最安全的初始化入口。它由 pam_env 模块在用户登录时直接读取,不经过任何 shell 解析,无法执行命令、不能引用变量、不受 ~/.bashrc 等用户文件干扰。
- 格式必须严格:每行 KEY=VALUE,等号两侧禁止空格,不支持 $PATH:/new/bin 这类拼接
- 启用前提:确认 /etc/pam.d/common-session 中已包含 session required pam_env.so(Ubuntu/Debian 默认开启;RHEL/CentOS 需手动添加)
- 示例内容:
HTTP_PROXY=http://10.0.1.10:8080
LANG=en_US.UTF-8
慎用 /etc/profile 及 /etc/profile.d/*.sh
这些文件由 login shell 执行,易被用户级脚本覆盖或篡改(如 unset PATH 或 export PATH="/tmp:$PATH"),安全性明显低于 /etc/environment。
- 若必须使用,对关键变量设为只读:
export PATH="/usr/local/bin:/usr/bin:/bin"
readonly PATH - /etc/profile.d/ 下脚本按字母序执行,命名建议加数字前缀(如 01-secure-env.sh),确保早于用户自定义脚本
- 禁止调用用户可控路径(如 $(whoami)、~/.config/env.sh),避免引入不可信上下文
锁定用户启动文件权限,阻断覆盖链
攻击者常通过篡改 ~/.bashrc、~/.profile 或 /etc/skel/ 模板注入恶意 export。需从创建源头和已有账户两头管控:
- 对现有用户执行:
chmod 644 ~/.bashrc ~/.profile ~/.bash_profile
chown root:root ~/.bashrc ~/.profile(需 root 权限) - 清理 /etc/skel/ 中默认启动文件,或设为只读,防止新建用户继承风险配置
- 检查并删除 /etc/profile.d/ 下非发行版自带、来源不明的 .sh 脚本
运行时校验与最小化 PATH 暴露
初始化完成不代表一劳永逸。关键服务应在启动时主动校验环境,而非盲目信任:
- PATH 应仅包含绝对必要、真实存在、权限受控的路径(如 /usr/bin、/opt/app/bin),禁用 %JAVA_HOME%/bin 等带变量引用的路径
- 敏感工具(如 kubectl、docker)建议通过用户级 PATH 隔离部署,避免污染系统级上下文
- 服务启动脚本中可加入校验逻辑:
if ! command -v mytool &>/dev/null; then echo "Critical tool missing"; exit 1; fi

















