核心是分层控制环境变量来源、作用域、继承与运行时状态。需识别ld_preload等高危变量,对suid程序模拟最小环境,检查pam/systemd变量加载,实施启动级隔离、执行级净化、运行时冻结,并监控变更、加固php/docker等运行时场景。

限制环境变量滥用与注入风险,核心是切断攻击者通过变量污染、继承或动态修改实施环境劫持的路径。不能只靠“清空PATH”,而要分层控制变量的来源、作用域、继承关系和运行时状态。
识别高危变量与风险继承链
攻击常利用 LD_PRELOAD、PATH、HOME、PYTHONPATH、GCONV_PATH、NSS_* 等变量实现提权或代码加载。需结合进程上下文判断:
- 对 SUID/SGID 程序(如 passwd),用
env -i /usr/bin/passwd模拟最小环境,确认是否仍继承危险变量 - 检查 PAM 认证服务是否启用
pam_env.so readenv=1,该配置会从/etc/security/pam_env.conf动态加载变量,易被篡改 - 查 systemd 服务的变量来源:
systemctl show --property=Environment your-service和EnvironmentFile=路径,确认是否引入不可信配置文件
分层锁定变量作用域
单一手段无效,必须组合使用启动级、执行级、运行时三级控制:
-
启动级隔离:在 service Unit 文件中显式声明
Environment=,并设SecureBits=keep-caps+RestrictSUIDSGID=yes+RemoveIPC=yes,禁用环境继承 -
执行级净化:在
/etc/sudoers中启用Defaults env_reset,再用env_keep白名单仅保留LANG、TERM等安全变量,严禁LD_*类透传 -
运行时冻结:对关键守护进程(如 sshd、crond),启动后调用
prctl(PR_SET_NO_NEW_PRIVS, 1)并执行unset或clearenv()清除未使用变量
监控变量变更与异常调用
只看最终值没用,必须捕获变化过程:
- 用 auditd 监控特权进程 execve 行为:
-a always,exit -F arch=b64 -S execve -F euid!=uid -k env_abuse,记录每次执行的完整环境快照 - 定期提取进程实时环境:
cat /proc/PID/environ | tr '\0' '\n',与基线哈希比对,偏差即触发告警 - 审计 PAM 变量加载:在
/etc/pam.d/common-auth添加[default=bad] pam_faildelay.so delay=1000000,配合日志分析非预期的pam_env.so触发
PHP/Docker等运行时专项防护
应用层变量注入更隐蔽,需针对性加固:
- PHP 中禁用
putenv()、setenv()等函数,php.ini 加disable_functions = putenv,setenv - Docker 容器启动时避免用
--env-file直接加载明文密钥,改用--secret或挂载只读 tmpfs - 容器内禁止以 root 运行 PHP-FPM,用非特权用户启动,并在 php-fpm.conf 中设
clear_env = yes











