Permissions

在沒有 setuid 的情況下臨時執行 setuid 二進製文件?

  • July 23, 2015

目前正在設置 xpra,它希望使用虛擬驅動程序以非 root 使用者身份執行 X 實例,但係統 Xorg 二進製文件是 SUID。由於系統會自動更新,我不希望製作和維護二進製文件的非 SUID 副本。我也試圖避免使用像copy-execute-delete這樣的hack,例如在tmp目錄中(更願意讓它成為一個乾淨的單行,我本能地認為這應該是可能的,儘管可能存在一些微妙的安全漏洞此功能將打開)。符號連結是可以接受的,儘管 AFAIK 不提供權限位屏蔽功能。

我目前最好的解決方案是在 bin 目錄上安裝 nosuid 綁定,這似乎可以解決問題,但如上所述,我仍然更喜歡不會在我的系統樹/fstab 中留下崩潰的解決方案(例如,一些神奇的環境變數以與 nosuid 掛載相同的方式禁用 suid,或者某些命令行執行繞過 suid 機制的忍術)。

有什麼想法嗎?

如果X是動態連結,您可以呼叫動態連結器,如:

/lib/ld.so /path/to/X

(適應ld.so您的系統(如/lib/ld-linux.so.2)。

例子:

$ /lib64/ld-linux-x86-64.so.2 /bin/ping localhost
ping: icmp open socket: Operation not permitted

如果你有strace,並且不是rootsetuid,那麼

strace -e '!all'*程序名*[*參數*]

應該管用。  strace(1)說(在錯誤下):

使用 setuid 位的程序在被跟踪時沒有有效的使用者 ID 權限。

因為如果非特權使用者可以跟踪 setuid 程序,這將是一個安全問題(因為跟踪可以讓您檢查和修改程序的記憶體)。而且,在一個名為 SETUID INSTALLATION 的特殊部分中,它對上述內容進行了一些對沖:

如果strace將 setuid 安裝到 root,則 … setuid 和 setgid 程序 被執行並以正確的有效權限進行跟踪。…只有受信任的具有完全 root 權限的使用者才應該被允許做這些事情,…

因此,如果strace將 setuid 安裝到 root,則上述技巧將不起作用。但一般情況下不應如此。而且,即使是這樣,您也可以通過製作一個私有的、非 SUID 的strace. (我在想,即使/bin/strace自動更新,您也不需要更新您的私人副本。)

至於命令,-e告訴跟踪  strace什麼事件。-e all將意味著“跟踪所有事件”(這是預設設置),因此-e '!all'意味著不跟踪。1  這應該會導致strace實際上什麼都不做,只是在您的程序(X 程序)執行時等待並觀察。如果它無論如何都會產生不需要的輸出,請將輸出重定向到/dev/null. (這假設您不需要查看 X 伺服器的控制台輸出。)


1您可能需要引用!all 以防止 shell 將!視為歷史引用。

引用自:https://unix.stackexchange.com/questions/46955