必须显式限制sudo环境变量传递以防止本地提权,启用env_reset、禁用ld_preload等危险变量、设置secure_path并验证生效。

默认情况下,sudo 会保留部分环境变量(如 PATH、HISTFILE、LD_PRELOAD 等),攻击者可能利用这些变量劫持命令执行路径或注入恶意库,从而绕过权限限制完成本地提权。必须显式限制环境变量传递,才能有效缓解此类风险。
启用 env_reset 并配置安全的默认环境
env_reset 是 sudo 的关键安全选项,它会在执行命令前清空用户原始环境,仅保留白名单中的变量。确保该选项在 /etc/sudoers 中启用(通常默认开启):
- 运行
sudo visudo编辑配置文件 - 确认存在
Defaults env_reset行(无注释) - 可配合
Defaults env_keep显式声明允许保留的变量,例如:Defaults env_keep += "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME"
禁用危险变量自动继承
即使启用了 env_reset,某些变量仍可能被隐式继承(如 LD_PRELOAD、LD_LIBRARY_PATH)。需主动屏蔽:
- 添加
Defaults env_delete += "LD_PRELOAD LD_LIBRARY_PATH LD_AUDIT LD_DEBUG" - 若使用
sudo -E(保留全部环境),应禁止普通用户使用:在sudoers中加入Defaults !env_editor和Defaults !setenv,并避免授予SETENV权限 - 检查是否存在类似
user ALL=(ALL) SETENV: /bin/bash的高危规则,立即删除或替换为明确限定的命令
限制 PATH 防止命令劫持
攻击者常通过篡改 PATH 执行同名恶意程序(如伪造 ls 或 python)。应强制使用可信路径:
- 设置
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - 该路径不包含用户可写目录(如
/tmp、~/bin) - 对需要自定义
PATH的特殊场景,改用sudo env "PATH=/trusted/path" command显式指定,而非依赖用户环境
验证配置是否生效
修改后必须测试,避免误配导致运维中断:
- 执行
sudo -V | grep -i "env_reset\|secure_path"确认参数已加载 - 运行
sudo env | grep -E "(LD_|PATH|HIST)"检查敏感变量是否被清除 - 尝试
sudo sh -c 'echo $LD_PRELOAD',输出应为空 - 模拟攻击:在当前目录放一个假
ls,执行sudo ls,应调用系统真实/bin/ls而非当前目录版本










