Security

根使用者與其他使用者的真正區別是什麼?

  • March 3, 2018

一些任意帳戶和 之間的根本區別是什麼root?它只是UID零以外的東西嗎?

那麼, su二進製文件究竟做了什麼以及它如何將使用者提升為 root?我知道使用者必須首先sudo通過我們在/etc/sudoers.

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

查看su執行檔的權限,我們發現*-rwsr-xr-x4755*(即已setuid設置)。

su二進製文件讀取此配置文件並檢查請求 root 權限的使用者是否屬於組sudoadmin?如果是這樣,假設使用者是預期組的一部分並且知道嘗試替換的適當使用者密碼(例如root,特別是),二進製文件是否會以 root 身份生成另一個 shell(考慮到setuid位)?


tl;dr 特權提升的行為是否依賴於susetuid二進製文件中的位,還是有其他機制來更改目前程序的 UID?在前者的情況下,似乎只有 EUID 會改變離開 UID != EUID。這是一個問題嗎?

相關 在 Android 環境中如何模擬所有這些?據我所知,對 root 的訪問已經完全被剝奪了——儘管程序仍然在這個特權級別上執行。

如果我們刪除sudosu這是否足以防止特權提升,或者 Android 是否採取了進一步的措施?

根是使用者 0

關鍵是使用者 ID 0。核心中有很多地方會檢查呼叫程序的使用者 ID,並且只有當使用者 ID 為 0 時才授予執行某些操作的權限。

使用者名無關;核心甚至不知道使用者名。

Android 的權限機制在核心級別是相同的,但在應用程序級別完全不同。Android 有一個 root 使用者 (UID 0),就像任何其他基於 Linux 核心的系統一樣。雖然 Android 沒有使用者帳戶,並且在大多數設置中不允許使用者(如在人工操作和擁有設備中)以 root 使用者身份執行操作。“rooted” Android 是一種允許設備所有者/使用者以 root 身份執行操作的設置。

setuid 的工作原理

setuid執行檔以擁有該執行檔的使用者身份執行。例如,susetuid 是 root 擁有的,所以當任何使用者執行它時,執行的程序su都會以 root 使用者身份執行。的工作su是驗證呼叫它的使用者是否被允許使用root帳戶,如果驗證成功則執行指定的命令(如果沒有指定命令,則執行shell),如果驗證失敗則退出。例如,su可能會要求使用者證明他們知道 root 密碼。

更詳細地說,一個程序具有三個使用者 ID有效UID,用於安全檢查;真實的UID ,用於一些權限檢查,但主要用作原始使用者 ID 的備份,以及保存的使用者 ID,允許程序臨時將其有效 UID 切換為真實使用者 ID,然後返回前一個有效的 UID(這很有用,例如當 setuid 程序需要以原始使用者身份訪問文件時)。執行 setuid 執行檔將有效的 UID 設置為執行檔的所有者並保留真實的 UID。

執行 setuid 執行檔(和類似機制,例如 setgid)是提升程序權限的唯一方法。幾乎所有其他事情都只能降低程序的權限。

超越傳統的 Unix

到目前為止,我描述的是傳統的 Unix 系統。所有這些在現代 Linux 系統上都是正確的,但 Linux 帶來了一些額外的複雜性。

Linux有一個能力系統。還記得我說過核心有許多檢查,其中只允許以使用者 ID 0 執行的程序嗎?事實上,每個檢查都有自己的能力(嗯,不完全是,一些檢查使用相同的能力)。例如,有一種訪問原始網路套接字的能力,以及另一種重新啟動系統的能力。除了使用者和組之外,每個程序都有一組功能。如果程序作為使用者 0 執行,或者如果它具有與檢查相對應的能力,則該程序通過檢查。需要特定權限的程序可以作為非 root 使用者執行,但具有必要的能力;如果程序存在安全漏洞,這會限制影響。執行檔可以設置為一個或多個功能:這類似於 setuid,但適用於程序的功能集而不是程序的使用者 ID。CAP_NET_RAW而不是 setuid 根。

Linux 有幾個安全模組,最著名的是SELinux。安全模組引入了額外的安全檢查,甚至可以應用於以 root 身份執行的程序。例如,可以(並不容易!)設置 SELinux 以便以使用者 ID 0 的身份執行程序,但有很多限制,以至於它實際上無法做任何事情

Linux 有使用者命名空間。在核心內部,使用者實際上不僅僅是一個使用者 ID,而是由一個使用者 ID 和一個命名空間組成的一對。命名空間形成層次結構:子命名空間在其父命名空間內細化權限。全能使用者是根命名空間中的使用者 0。命名空間中的使用者 0 僅在該命名空間內具有權力。例如,使用者命名空間中的使用者 0 可以冒充該命名空間的任何使用者;但從外部來看,該命名空間中的所有程序都以同一個使用者身份執行。

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