在沒有 setuid 的情況下臨時執行 setuid 二進製文件?
目前正在設置 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
,並且它不是root的setuid,那麼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 將!
視為歷史引用。