sudo不内置禁止find -exec,真正起作用的是/etc/sudoers中的命令白名单与参数限制,通过限定路径、禁用-exec/-delete等危险选项实现防护,而非sudo程序自身屏蔽子命令。

sudo 本身不禁止 find -exec 这类用法,真正起作用的是配置策略——它靠 /etc/sudoers 中的命令白名单和参数限制来堵住这类路径,而不是靠 sudo 程序内部“屏蔽”某个子命令。
核心防护逻辑:不放行危险组合
攻击者常试图用 sudo find /tmp -name "x" -exec bash \; 获得 root shell,但该操作能否成功,完全取决于 sudoers 是否明确允许这个 完整命令行。只要配置得当,即使 find 本身有 -exec,也无法绕过限制。
- ✅ 正确写法(安全):
alice ALL=(root) /usr/bin/find /home/alice/* -type f -name "*.log"
→ 限定路径、限定参数、禁用 -exec/-delete/-ok 等危险选项 - ❌ 危险写法(必须避免):
alice ALL=(root) /usr/bin/find
→ 允许任意参数,-exec、-delete、-ls 都可被滥用
关键加固手段
仅靠“不允许用 -exec”不够,要从语法层直接封死:
-
显式禁止高危参数:在 sudoers 中用
!-exec,!-delete,!-ok,!-ls排除
例如:alice ALL=(root) /usr/bin/find /var/log !-exec !-delete !-ok - 用 NOPASSWD 时更要收紧:免密执行权限极大降低攻击门槛,必须搭配最细粒度参数约束
-
优先用更安全的替代命令:比如用
sudo grep -r "error" /var/log/替代sudo find /var/log -name "*.log" -exec grep "error" {} \;
验证与审计建议
配置后务必实测边界,不能只看语法是否合法:
- 运行
sudo -l -U alice查看用户实际被授予的命令范围,确认 -exec 确实不在允许列表中 - 定期检查 sudoers 中是否存在通配符(如
/usr/bin/find *)或宽泛路径(如/usr/bin/*) - 启用
Defaults log_input,log_output,记录所有 sudo 命令及其 stdin/stdout,便于回溯可疑调用
本质上,sudo 不是“防住 find”,而是通过精确授权让 find 失去作恶能力。配置越具体,风险越低;放得越宽,-exec 就越危险。











