為什麼 FreeBSD 要求終端程序以 root 身份啟動?
在 FreeBSD 上,所有圖形終端程序(例如 xterm、rxvt)似乎都安裝了 setuid root,或者帶有 setuid root 包裝器。
在 Linux 上,我曾經使用過的任何發行版都不是這種情況。
為什麼 FreeBSD 需要終端程序的 setuid 執行檔或包裝器?這似乎是引入特權升級漏洞的好方法。
原來
xterm
是一個 set-uid 程序。一個原因是它需要能夠寫入utmp
文件以記錄誰在使用什麼設備。另一個原因是xterm
需要獲得用作其標準輸入/輸出的偽 tty 設備的所有權,並錯誤地將該所有權設置給訪問它的使用者。雖然大多數其他 Unix/Unix 類作業系統不再使用 setuid 或 setgid 位來實現相同的目標,但使用不同且更安全的方法,FreeBSD 似乎保留了原始解決方案。
除非有一些臨時錯誤報告/修復(未在埠的更改日誌中找到),FreeBSD 不需要 xterm 為 setuid,並且自 2011 年以來就沒有將其與 xterm 一起使用。港口維護人員的評論說
- Don't set suid bit. In our implementation, grantpt() and unlockpt() don't actually have any use, because PTY's are created on the fly and already have proper permissions upon creation (see src/lib/libc/stdlib/ptsname.c) [1]
其中指的是2008 年所做的更改:
The pts(4) driver also implements this feature, which means posix_openpt() will now return PTY's that are created on the fly.
鑑於2014 年的這個問題,聽起來好像 OP 正在研究一個舊系統。或者(確實會發生),OP 的系統可能已被某人修改,添加了 setuid 位。
根據平台(及其年齡),xterm 將使用 setuid 或 setgid 進行這些操作:
- 打開偽終端
- 更新 utmp(或 utmpx)
最初,BSD(和其他)偽終端實現要求應用程序找到特殊設備,然後使用root setuid 權限打開它。從1999 年開始,Unix98 取消了第一部分(尋找特殊設備)。到 2005 年左右,大多數偽終端實現已經消除了使用setuid安裝應用程序的需要。無論出於何種原因,它在 FreeBSD 中都被忽略了。
同樣,應用程序可能需要組權限(通過setgid)來更新和 使用的 utmp(或 utmpx)
last
文件who
。 自 2000 年以來xterm
,已規定為此目的使用 utempter 庫。xterm 的 FreeBSD 埠使用此功能,因此它也不需要 setgid。其他程序可能安裝為setuid或setgid用於相同的操作,但到 2014 年,任何終端程序都不太可能需要root使用者的 setuid 權限。在其他程序(例如 urxvt)中使用時,它們的維護者可能會忽略它。