Linux

使用者名(與 uids 相比)有多重要?

  • December 5, 2018

背景: 我最近讀到了一個freedesktop.org-bug,它允許為>執行任何systemctl命令。於是我跑了: uid``INT_MAX

root@host$> useradd -u 4000000000 largeuiduser
root@host$> su largeuiduser
largeuiduser@host$> systemctl ["whatever"]
[bug exists, and "whatever" gets executed]
largeuiduser@host$> exit
root@host$> userdel largeuiduser

尋找一種更清潔的方式我後來發現

root@host$> setpriv --reuid 4000000000 systemctl ["whatever"]
[bug exists, and "whatever" stuff gets executed]

表明要利用該錯誤,不需要(臨時)使用者名。很明顯,我不太確定:使用者名實際上有多重要?.

問題 因此我的問題是。從核心(linux/posix)的角度來看,使用者名有多麼可有可無?它們是否需要,可以使用嗎?

我的懷疑是,使用者名只是一種專門用於使用者空間的“便利設施”。

一個好的答案會嘗試通過提供有關使用者名在哪些設置中成為“必要”以及在哪些設置中它們是“可消耗”的資訊來闡明這一點。

在 Linux 和 BSD 世界中,核心幾乎完全根據數字使用者和組 ID 執行。有一個標準化的 C 庫提供對使用者數據庫的訪問,其中名稱可以從 ID 中查找,反之亦然,這就是應用程序軟體如何從人類提供的名稱中獲取系統呼叫所需的 ID,然後再返回。程序憑證和訪問控制列表條目都根據 ID 進行操作。

一個例外是setlogin()BSD 世界中的(非標準化)API 函式,它根據字元串、使用者名而不是數字使用者 ID 進行操作。然而,核心對這個字元串沒有解釋。

人們可以編寫完全根據數字 ID 執行的應用程序,並將其呈現給人類。但這不是大多數軟體的編寫方式,原因很簡單,人類使用名為.

核心也沒有不存在帳戶的概念。就核心而言,所有 ID(除了一些保留值)都是有效的。您可以(作為超級使用者)啟動一個以 UID 24394 執行的程序,並創建該 UID 擁有的文件系統對象(當然,在它有權訪問的地方),核心不會抱怨。

請注意,PolicyKit 錯誤與 UID 無關。這是關於一個名為pkttyagentabending 的程序……

錯誤:pkttyagent.c:156:main:斷言失敗:(polkit_unix_process_get_uid(POLKIT_UNIX_PROCESS(主題))> = 0)

…並且授權機制在這種情況下失敗打開而不是失敗關閉,返回使用者通過桌面匯流排獲得授權。

進一步閱讀

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