锁定和监控运行时环境变量的核心是建立作用域明确、继承可控、变更可溯的约束机制,需识别高危变量与继承链、实施分层锁定策略、部署细粒度监控告警,并通过实战检查点验证加固效果。

锁定和监控运行时环境变量,核心是切断攻击者通过变量注入、污染或继承实施环境劫持的路径。这不是简单地“清空PATH”,而是建立一套作用域明确、继承可控、变更可溯的运行时约束机制。关键在于区分“谁在设置”“谁在继承”“谁在读取”,并针对每个环节施加控制。
一、识别高危环境变量与继承链
攻击者常利用的变量不止LD_PRELOAD、PATH、HOME,还包括PYTHONPATH、PERL5LIB、GCONV_PATH、NSS_*系列等。需结合进程上下文判断风险:
- 对SUID/SGID程序,重点关注其启动时继承的变量(如
env -i /usr/bin/passwd可模拟最小环境) - 对PAM认证服务(如su、ssh),检查
/etc/pam.d/中是否启用pam_env.so readenv=1,该配置允许从/etc/security/pam_env.conf动态加载变量 - 对systemd服务,查看
systemctl show --property=Environment <service></service>及EnvironmentFile=路径,确认变量来源是否可信
二、实施分层变量锁定策略
单一手段无效,必须组合使用:
-
启动级隔离:在服务Unit文件中显式设置
Environment=并禁用继承,例如:SecureBits=keep-caps+RestrictSUIDSGID=yes+RemoveIPC=yes -
执行级净化:在sudoers中强制
Defaults env_reset,并通过env_keep白名单仅保留必要变量(如LANG、TERM),严禁LD_*类变量透传 -
运行时冻结:对关键守护进程(如sshd、crond),在启动后调用
prctl(PR_SET_NO_NEW_PRIVS, 1)并清除未使用的环境变量(可通过unset或clearenv()实现)
三、部署细粒度监控与告警
监控不能只看最终值,要捕获变化过程:
- 使用
auditd规则监控敏感系统调用:-a always,exit -F arch=b64 -S execve -F euid!=uid -k env_abuse,记录所有特权进程的execve及其环境快照 - 定期比对进程环境:用
cat /proc/PID/environ | tr '\0' '\n'提取实时变量,与基线哈希值比对,异常即告警 - 审计PAM变量加载行为:在
/etc/pam.d/common-auth中添加[default=bad] pam_faildelay.so delay=1000000并配合日志分析,识别非预期的pam_env.so触发
四、验证加固效果的实战检查点
完成配置后,必须验证是否真正生效:
- 尝试在受限shell中执行
sudo env "LD_PRELOAD=/tmp/mal.so" /bin/sh,应被拒绝或忽略 - 以普通用户身份运行
strace -e trace=execve su -c 'id' 2>&1 | grep environ,确认execve调用中无危险变量传递 - 检查
systemctl status sshd输出中的“Environment”字段,确认无意外变量注入











