sudo默认清除环境变量而非隐藏,需用env_delete显式删除LD_*、PATH、HOME等敏感变量以防提权;配置后应通过sudo env | grep验证是否生效,并配合命令白名单、禁用交互shell等纵深防御措施。

在 Linux 的 sudo 配置中,“隐藏敏感环境变量传递”这个说法本身存在概念偏差——sudo 不会“隐藏”变量,而是默认清除绝大多数环境变量,只保留极少数安全白名单项。真正需要做的,不是隐藏,而是主动阻止敏感变量透传,防止它们被意外带入高权限上下文。这属于环境隔离而非信息隐藏,核心目标是避免 LD_PRELOAD、PATH、HOME、SHELL 等变量被用于提权、路径劫持或配置污染。
明确哪些变量必须禁止传递
以下变量一旦随 sudo 命令进入 root 或其他高权限进程,极易引发安全风险,应确保不被保留:
-
LD_* 系列:如
LD_PRELOAD、LD_LIBRARY_PATH—— 可加载任意共享库,实现函数劫持 -
PATH —— 若用户自定义 PATH 包含当前目录或写入权限目录(如
./或/tmp),可能导致执行恶意同名命令(如ls) -
HOME —— 会影响程序读取的配置文件位置(如
~/.bashrc、~/.gitconfig),可能触发非预期初始化逻辑 - SHELL、USER、LOGNAME —— 虽然常被误认为“无害”,但部分脚本依赖它们做身份判断或路径拼接,存在间接利用链
- PS1、PROMPT_COMMAND 等 shell 控制变量 —— 在交互式 sudo -s 中可能被解析执行
通过 env_delete 主动清除敏感变量
sudo 默认启用 env_reset(清空环境),但不会自动删掉所有危险项;要确保敏感变量被彻底剥离,需显式使用 env_delete:
- 用
sudo visudo -f /etc/sudoers.d/env-restrict.conf新建策略文件 - 添加如下行(注意是
+=追加,避免覆盖系统默认删除项):Defaults env_delete += "LD_PRELOAD LD_LIBRARY_PATH LD_AUDIT PATH HOME SHELL USER LOGNAME PS1 PROMPT_COMMAND" - 该配置对所有用户生效;如需按用户/组定制,可加主机和用户限定,例如:
alice ALL Defaults env_delete += "LD_PRELOAD HOME"
验证是否真正生效
改完配置后,不要仅靠“没看到变量”来判断,而要实测确认:
- 先在普通用户会话中设置一个测试变量:
export LD_PRELOAD=/tmp/malicious.so - 执行:
sudo env | grep -E "^(LD_|PATH|HOME|SHELL)" - 若输出为空,说明已成功过滤;若有残留,检查是否与其他
env_keep规则冲突(env_delete优先级高于env_keep,但若某变量既在env_keep又在env_delete,仍会被删) - 额外验证命令执行时行为:
sudo sh -c 'echo $LD_PRELOAD'应输出空行
配套加固建议
仅靠环境变量控制还不够,需组合其他机制形成纵深防御:
-
禁用交互式 shell 提权:在 sudoers 中添加
Defaults !shell_noop并配合Defaults requiretty,防止 webshell 或 cron 绕过终端限制调用sudo -i或sudo bash -
限制命令范围:即使环境干净,也要用
Cmnd_Alias明确白名单,避免NOPASSWD: ALL类宽泛授权 -
启用输入/输出审计:添加
Defaults log_input, log_output,记录所有经 sudo 执行的命令及其完整 I/O 流,便于事后追溯异常变量利用痕迹


















