
仅启用 env_reset 不足以防止越权,它只是清空原始环境再重建白名单变量,但像 LD_LIBRARY_PATH、LD_PRELOAD 这类高危变量仍可能被继承。必须配合显式删除、路径锁定和验证,才能真正切断利用链。
确认并强制启用 env_reset
env_reset 并非所有系统默认开启,也不能依赖“已存在”假设。需人工确认并显式声明:
- 运行
sudo visudo,检查是否存在未注释的Defaults env_reset行;若被注释或缺失,手动添加 - 排查
/etc/sudoers.d/下配置是否含Defaults !env_reset或覆盖性env_keep = "",这类设置会直接禁用重置机制 - 注意:任何带
SETENV标签的规则(如%wheel ALL=(ALL) SETENV: /bin/bash)都会绕过env_reset,应立即移除
显式删除 LD_* 等危险变量
env_reset 的白名单不包含 LD_* 类变量,它们可能被隐式带入。必须用 env_delete 主动剥离:
- 在
/etc/sudoers中添加:Defaults env_delete += "LD_LIBRARY_PATH LD_PRELOAD LD_AUDIT LD_DEBUG" - 避免使用
env_keep保留任何以LD_开头的变量,哪怕只留一个也构成风险 - 额外加固:一并清除
EDITOR、VISUAL、SHELL和HISTFILE,防止编辑器提权或历史命令注入
锁定 secure_path 阻断命令层劫持
即使环境变量干净,攻击者仍可通过污染 PATH 放置同名恶意程序(如伪造 ls 或 python)实现提权:
- 设置严格可信路径:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - 确保该路径不含用户可写目录(如
/tmp、/dev/shm、$HOME/bin) - 为防意外继承,建议同时添加:
Defaults env_delete += "PATH" - 验证方式:
sudo sh -c 'echo $PATH'输出必须与secure_path完全一致,且无额外路径
验证是否真正生效
配置修改后必须实测,避免“看起来安全、实际无效”:
- 检查基础参数加载:
sudo -V | grep -i "env_reset\|secure_path" - 确认敏感变量已被清除:
sudo env | grep -E "(LD_|HIST|SHELL|EDITOR)"应无输出 - 模拟攻击测试:
sudo sh -c 'echo $LD_PRELOAD'返回为空;sudo ls必须调用系统/bin/ls,而非当前目录下的假程序 - 对生产环境,建议将验证步骤固化为部署后检查项

















