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.

透過檢查 regexp 時egrep(sudo 文件指出它類似於透過 regexp 驗證字串的方式),它按預期工作:

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

是什麼導致 sudo 忽略該匹配的行為?使用Ubuntu 22.04,Sudo 1.9.14p3。

相關內容