sudo默认启用env_reset策略以清空危险环境变量,必须显式配置env_keep、禁用ld_preload等高危变量,并依赖secure_path强制可信路径,否则环境变量将成为提权跳板。

sudo提权后,环境变量并不自动“变安全”,反而可能成为攻击入口。关键不在于是否提权,而在于提权过程中环境变量如何被处理、保留或清除。
sudo默认会重置大部分环境变量
为防止恶意利用,sudo默认启用env_reset策略。这意味着执行sudo command时,原始Shell中的PATH、HOME、LD_PRELOAD等变量会被清空,替换为一套受限的、预设的安全变量(如LANG、TERM)。
- 可通过
sudo -V | grep "env_reset"确认该策略是否启用 - 查看当前生效的环境变量:执行
sudo env | grep -E "(PATH|HOME|LD_|USER)" - 未被env_keep显式保留的变量,基本不会透传到root上下文中
危险配置会让环境变量成为提权跳板
一旦sudoers中出现不安全的env_keep或setenv设置,攻击者就能控制关键变量实现越权执行:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
-
Defaults env_keep += "LD_PRELOAD":允许普通用户指定动态链接库,加载后可直接获得root权限(CVE-2025-32463正是利用此路径) -
Defaults env_keep += "PATH":若PATH包含/tmp或用户可控目录,再配合SUID程序调用未加路径的命令(如ps),就可能执行同名恶意程序 -
Defaults setenv:完全禁用环境重置,使所有用户环境变量原样透传,风险极高,应避免使用
secure_path是PATH安全的兜底机制
即使PATH被保留,sudo仍通过secure_path强制限定命令搜索路径。它独立于用户PATH,优先级更高:
- 典型值:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - 可通过
sudo -V | grep "Value to override"查看当前配置 - 该路径只包含系统管理员明确信任的目录,有效阻断在/tmp或~/bin下放置恶意ls、sh等程序的尝试
验证与加固建议
不要依赖“用了sudo就安全”的直觉。日常应主动检查和约束环境变量行为:
- 用
sudo -l查看自身权限时,留意输出中是否含env_keep或setenv字样 - 编辑sudoers务必使用
visudo,确保env_reset开启,并仅保留必要变量(如LANG、LC_*) - 禁用
setenv,避免env_keep包含LD_PRELOAD、PATH、HOME、SHELL等高危项 - 对生产环境定期扫描:检查
grep -r "env_keep\|setenv" /etc/sudoers*,及时清理宽松配置










