在 OS X Darwin 中,為什麼我可以使用 cat 干擾跨使用者會話的文本輸入?
OS X Darwin:跨使用者身份中斷終端會話
簡而言之:
與
cat < /dev/ttys_
, 在終端。我的問題
這種 OS X 10.9.2 Darwin 行為對我來說似乎很奇怪,我想了解它為什麼會發生,以及它是否是實際的作業系統或應用程序錯誤。
重現行為的步驟
- 打開兩個終端視窗。
- 記下它們的設備路徑,即“
/dev/ttys001
”、“/dev/ttys002
”- 在一個終端視窗(即
/dev/ttys001
)中,執行sudo -u [some other user] sh
.- 在另一個終端視窗(即
/dev/ttys002
)中,執行cat < /dev/ttys001
(或任何設備路徑。)- 返回第一個視窗,鍵入文本。
意外行為
當我在相關的終端視窗中輸入文本時,會有明顯的延遲;此外,字元不會可靠地出現在任一視窗中。有些字元回顯到第二個視窗,有些出現在第一個視窗中,有些似乎消失了。
意外後果
這讓我擔心的原因是,一個非特權使用者執行的簡單命令似乎可以完全中斷另一個使用者的會話。
預期的可能原因
- 終端 2.4 中的文本輸入錯誤 (326)
- 一位使用者對 OS X 10.9.2 Darwin 中的錯誤進行了授權
- 對正在發生的事情的誤解。
您不會干擾跨使用者身份的文本會話。這裡只有一個使用者在執行會話,我們稱她為 Alice。Alice 在控制台上登錄並執行一系列應用程序,包括一些終端仿真器。
在其中一個終端中,Alice 執行
sudo -u bob sh
. 現在在 Bob 的賬戶下執行了一個 shell,但是終端是由 Alice 提供的。終端仿真器程序以使用者身份執行alice
。當您
cat /dev/ttys42
以 Alice 的身份執行時,您正在窺探甚至乾擾 Alice 執行的終端仿真器,而不是 Bob 執行的 shell。您在鍵入時會看到奇怪的現象,因為每個字節都有些隨機地傳輸到從終端讀取輸入的任何程序。通常在終端中只有一個前台程序:作業控制機制,特別是前台程序組的管理和 SIGTTIN 信號確保了這一點。
請注意,
/dev/ttys42
它由 Alice 擁有。如果 Bob 執行一個終端仿真器,那麼/dev/ttys42
它將歸 Bob 所有,而 Alice 無法讀取或寫入,因此 Alice 將無法在該級別進行干預。然而,如果這個終端在 Alice 的 GUI 會話中,那麼 Alice 可以在 GUI 級別進行干預(例如,通過窺探或註入擊鍵,或者讓 Bob 相信他正在與他啟動的終端互動,而實際上他正在與執行的應用程序互動愛麗絲)。