Debian

為什麼 CAP_CHROOT 等同於 root?

  • January 6, 2021

我很難理解CAP_CHROOT給定以下模板的根等效性。

我理解 1) 意味著創建一個目錄結構,其中包含所有依賴項(例如共享對象),其根將是chroot(2).

我的問題涉及模板中的後面步驟:

  • 為什麼需要後門ld.solibc2)?
  • 為什麼需要在 3) 中從 chroot 環境創建到 setuid-root 二進製文件的硬連結?
  • 為什麼chroot(2)在 4) 中呼叫啟動 setuid-root 二進製文件?

在此處輸入圖像描述

這不是必需的,這是一種方法。

通過更改根目錄,您使系統組件可以做出的假設無效。

/bin/su假設使用者數據庫位於/etc/passwd//etc/shadow中,即libc(或它連結到的任何庫)位於某個固定位置/lib,普通使用者無法修改。

如果您能夠創建不同的文件系統佈局,其中/bin/su可以執行相同的命令但可以隨意修改不同/etc/passwd或不同的命令libc,那麼您可以做任何事情(如su使用或可以使用(可能間接)/etc/passwd來驗證使用者,並在 libc 中執行程式碼)。

現在,通過這種方法,擁有CAP_CHROOT並不是您唯一需要的東西。您還需要對具有至少一個動態連結的 setuid-root 執行檔的文件系統上的目錄的寫訪問權(因為硬連結只能在給定的文件系統內完成)。

系統分區沒有使用者可寫區域(甚至是只讀區域)的系統並不少見。nosuid使用標誌安裝使用者可寫區域的文件系統也很常見。許多系統還禁止硬連結您不擁有的文件(fs.protected_hardlinks例如,參見 Linux 3.6+ 上的 sysctl)。

但是您不需要在 chroot 監獄中硬連結 setuid 執行檔。你也可以這樣做:

chdir("/");
chroot("/tmp/myjail");
execl("bin/su", "su", 0);

因為即使程序的根被更改chroot,目前工作目錄在之後仍然可用,即使該/目錄和bin/su從那裡解析的目錄不在監獄內。並且/bin/su仍然會在您的監獄中尋找ld.so,/etc/passwd或 libc ,因為它們是通過絕對路徑訪問的,因此相對於更改後的根目錄。讓目前工作目錄或任何文件描述符在監獄外的文件上打開,可以讓您走出監獄。

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