Sudo 通过正则表达式错误地验证命令行参数

Sudo 通过正则表达式错误地验证命令行参数

假设我们有两个用户:alex 和 alexa。我们希望允许 alexhtop以 root 身份执行,以便查看磁盘使用情况统计信息,但我们不希望他们看到 root 可以执行的其他用户的进程。那么就需要允许他们以自己的用户名作为标志htop执行-u(重要提示:正如@HBruijn 提到的,指定用户标志并htop不能阻止执行器通过 U 键更改用户过滤器;让我们假装该标志确实限制了执行器来说明问题)。但我们还需要检查最后一个指定的-u参数是否为alex,而且我们不想强制它是最后一个指定的参数。正则表达式如下:

^.*(--user=alex|-u alex)\b((?!-u).)*$
  • ^表示字符串开始
  • (--user=alex|-u alex)-u-参数的捕获组
  • \b- 单词边界(因此 alex 无法指定-u alexa
  • ((?!-u).)*-u- 否定前瞻,在有效传递 ( -u alex)之后拒绝任何传递

然后我们将其写入/etc/sudoers文件:

echo "alex ALL=(ALL) NOPASSWD: /usr/bin/htop ^.*(--user=alex|-u alex)\b((?!-u).)*$" >> /etc/sudoers

然而,当 alex 尝试执行正常命令时,sudo 拒绝了他们:

$ sudo /usr/bin/htop -u alex 
[sudo] password for alex: 
Sorry, user alex is not allowed to execute '/usr/bin/htop -u alex' as root on machine.

当通过正则表达式检查时egrep(sudo 文档指出它与通过正则表达式验证字符串的方式类似),它按预期工作:

$ echo '-u alex' | egrep '^.*(--user=alex|-u alex)\b((?!-u).)*$'
-u alex

是什么原因导致 sudo 忽略该匹配的行为?使用 Ubuntu 22.04,Sudo 1.9.14p3。

相关内容