Sudo は正規表現を使用してコマンドライン引数を誤って検証します

Sudo は正規表現を使用してコマンドライン引数を誤って検証します

2 人のユーザーがいるとします: alex と alexa。ディスク使用状況の統計情報を見るために、alex が root として実行できるようにしたいのですが、root が実行できる他のユーザーのプロセスは表示させたくありません。そのため、フラグを自分のユーザー名にhtopして実行できるようにする必要があります。htop-u(重要な注意: @HBruijn が述べたように、ユーザー フラグを指定しても、htop実行者が U キーでユーザー フィルターを変更することを妨げるものではありません。問題を説明するために、フラグが実行者を制限すると仮定しましょう)-uただし、最後に指定した引数が であることを確認する必要がありalex、それを最後に指定した引数に強制したくはありません。正規表現は次のようになります。

^.*(--user=alex|-u alex)\b((?!-u).)*$
  • ^文字列の開始を示す
  • (--user=alex|-u alex)-u-パラメータのキャプチャグループ
  • \b- 単語境界(そのためアレックスは指定できなかった-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 を使用しています。

関連情報