為什麼 CAP_CHROOT 等同於 root?
我很難理解
CAP_CHROOT
給定以下模板的根等效性。我理解 1) 意味著創建一個目錄結構,其中包含所有依賴項(例如共享對象),其根將是
chroot(2)
.我的問題涉及模板中的後面步驟:
- 為什麼需要後門
ld.so
或libc
2)?- 為什麼需要在 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 ,因為它們是通過絕對路徑訪問的,因此相對於更改後的根目錄。讓目前工作目錄或任何文件描述符在監獄外的文件上打開,可以讓您走出監獄。