关键运行时环境变量(如PATH、JAVA_HOME、LD_LIBRARY_PATH)一旦被恶意篡改,可导致命令劫持、权限提升、敏感信息泄露甚至远程代码执行;加固需从源头阻断注入路径、收紧执行边界、分离敏感数据,并严格管控全局Profile文件权限与加载逻辑。
关键运行时环境变量(如 PATH、JAVA_HOME、LD_LIBRARY_PATH 等)一旦被恶意篡改,可导致命令劫持、权限提升、敏感信息泄露甚至远程代码执行。加固不是简单设 readonly,而是从源头阻断注入路径、收紧执行边界、分离敏感数据。
/etc/profile、/etc/profile.d/*.sh 和 /etc/bash.bashrc 是登录 shell 加载环境变量的主路径,但默认不校验子文件安全性:
chown root:root /etc/profile /etc/bash.bashrc && chmod 644 /etc/profile /etc/bash.bashrc
find /etc/profile.d -type f ! -perm 644 -o ! -user root -o ! -group root 定期扫描异常exit 1,防止静默加载恶意脚本PATH 中出现空字段(如开头或结尾的冒号)、.、/tmp、/var/tmp 或用户可写目录,极易被用于二进制劫持:
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin"
case ":$PATH:" in *":.:"*|*":/tmp:"*|*":/var/tmp:"*) echo "Unsafe PATH" >&2; exit 1;; esac
export PATH="..." 后紧跟 readonly PATH,虽不继承只读属性,但配合不可写路径才真正生效数据库密码、API密钥、内部服务地址等绝不能以 export SECRET=xxx 形式出现在全局配置中:
export.*_PASSWORD、export.*_KEY、export.*_TOKEN 的行/etc/secenv),并在 source 前校验:[ -r /etc/secenv ] && [ "$(stat -c '%U:%G' /etc/secenv)" = "root:root" ] && [ "$(stat -c '%a' /etc/secenv)" = "600" ] && source /etc/secenv
EnvironmentFile=/etc/sysconfig/java-env)管理 JAVA_HOME 和 CLASSPATH,避免污染用户级环境静态配置易被绕过,需结合运行时行为检测和定期基线比对:
bash -ilc 'echo $PATH' 模拟真实登录 shell,避免交互缓存干扰;再逐段检查:for d in $(echo $PATH | tr ':' 'n'); do ls -ld "$d" 2>/dev/null | grep -E '^-.*[w-]{2}..[w-]'; done
grep -r 'export.*=' /etc/profile* /etc/profile.d/ 2>/dev/null | grep -vE '(PATH|HOME|LANG|USER)'