sudo可通过配置/etc/sudoers限制编辑器路径以防止提权:需启用env_check、设置editor白名单、删除危险环境变量,并结合env_reset与日志审计确保安全。

sudo 命令本身不直接限制编辑器路径,但通过合理配置 /etc/sudoers,可以有效防止用户借由 sudo EDITOR=... 或 sudo -e 启动任意程序实现提权。
理解 sudo -e 和环境变量绕过风险
当用户执行 sudo -e /etc/hosts 或 sudo EDITOR=/bin/bash visudo 时,sudo 会调用用户可控的编辑器。若未加约束,攻击者可指定 /bin/bash、/usr/bin/python3 等交互式程序,获得 root shell。
- 默认情况下,sudo 会继承用户的
EDITOR、VISUAL环境变量 -
sudo -e本质是调用$EDITOR打开目标文件,而非固定使用 vi/vim - 即使禁用
EDITOR,用户仍可能通过sudo env EDITOR=/path/to/shell /path/to/editor尝试绕过
在 sudoers 中锁定可信编辑器路径
使用 env_check 和 editor 标签,强制限定仅允许特定绝对路径的编辑器运行。
- 在
/etc/sudoers中添加:Defaults env_check += "EDITOR VISUAL"
这确保 sudo 会检查并保留这两个变量(但不验证值是否安全) - 进一步限制可用编辑器:
Defaults editor="/usr/bin/vi:/usr/bin/vim:/usr/bin/nano"
此设置使sudo -e只能调用列出的二进制文件,忽略用户传入的EDITOR - 若需为某用户组单独控制:
%editors ALL=(ALL) NOPASSWD: SETENV: /usr/bin/vim
并配合Defaults:%editors editor="/usr/bin/vim"
禁用危险环境变量传递(推荐组合策略)
单靠 env_check 不够,应主动清除或重置高危变量,切断提权链路。
- 禁止传递所有自定义环境变量:
Defaults env_reset(默认已启用) - 显式清除
EDITOR和VISUAL:Defaults env_delete += "EDITOR VISUAL" - 或更彻底地:重设为安全值
Defaults env_keep += "SUDO_EDITOR"
再配合SUDO_EDITOR=/usr/bin/vim sudo -e file显式指定
验证与运维建议
配置后必须测试是否真正生效,避免“看似安全实则可绕过”。
- 运行
sudo -V | grep -i editor查看当前editor默认值和env_delete列表 - 尝试
EDITOR=/bin/sh sudo -e /dev/null—— 应报错或回退到默认编辑器,不能启动 sh - 定期审计
sudo -l输出,确认无过度宽松的SETENV或NOPASSWD权限 - 生产环境建议统一部署编辑器白名单,并配合日志审计(
Defaults log_input, log_output)









