如何在文件系統中在 Linux 上使用 chdir(’..’) 創建一個 root 無法逃脫的 chroot?
我
/var/mychoot
在與 相同的文件系統上有一個目錄/
,並且我已將程序啟動/var/mychroot/prog
為sudo chroot /var/mychroot /prog
,因此程序以 EUID 0 執行。如果程序執行chdir("..") 轉義技術,則它能夠轉義 chroot 並查看
/
. (我已經在 Linux 4.18 上驗證了這一點。)我想阻止這樣的逃跑。事實上,我想防止各種 chroot 轉義,但在這個問題中,我只對如何在現代 Linux 系統上防止chdir("..") 轉義技術感興趣。為此,我正在尋找*chroot(2)*系統呼叫的替代方案。
我找到了 2 個解決方案:pivot_root和MS_MOVE,但它們僅在
/var/mychroot
是掛載點時才有效,因此如果/var/mychroot
只是/
文件系統中的子目錄,它們就會失敗。在這種情況下還有其他解決方案嗎?我想避免使用技術
LD_PRELOAD
(因為LD_PRELOAD
不影響靜態連結的執行檔),使用*ptrace(2)的技術(因為這樣我就無法strace
在 chroot 中執行,而且ptrace(2)*也很難正確處理:程序將崩潰或掛起)和真正的虛擬化(例如 Xen 或 KVM 或 QEMU;因為性能成本和不太靈活的記憶體配置)。回顧一下,我需要:
- *chroot(2)*系統呼叫的替代方案,
- root 可以限制以 root 身份執行的程序(EUID 0),
- 到文件系統的子目錄
/
,- 這可以防止chdir("..") 轉義技術,
- 並且不使用
LD_PRELOAD
或- *ptrace(2)*或
- 虛擬化(例如 Xen、KVM 或 QEMU),
- 它執行在現代 Linux 系統上,
- 帶有未打更新檔的核心。
它存在嗎?
為了防止
chdir("..")
您提到的特定逃生技術,您可以簡單地放棄在chroot(2)
您自己 chroot 後再次執行的能力/var/mychroot
。轉義技術需要再次呼叫chroot()
,因此阻止它足以阻止它工作。您可以使用 Linux 功能來做到這一點,方法是刪除
CAP_SYS_CHROOT
需要chroot(2)
可用的功能。例如:
outside# chroot /var/mychroot inside# capsh --drop=cap_sys_chroot -- inside# ./escape_chroot chroot(baz): Operation not permitted
(chroot 中的第二個提示符來自一個由 . 生成的 shell
capsh
。你可以讓它執行另一個命令,例如capsh --drop=cap_sys_chroot -- -c 'exec ./escape_chroot'
,但是更好的技術是只使用
pivot_root
,因為它可以防止許多其他可能chroot(2)
無法防止的漏洞。您提到它僅在
/var/mychroot
是掛載點時才有效,但是您可以通過簡單地將其綁定到自身來使其成為掛載點。請注意,您需要創建一個掛載命名空間以用於
pivot_root
創建監獄,否則它將嘗試更改文件系統中所有程序的根目錄,這很可能不是您想要的…所以整個序列是:
outside# unshare -m outside# mount --bind /var/mychroot /var/mychroot outside# cd /var/mychroot outside# mkdir old_root outside# pivot_root . old_root limbo# exec chroot . inside# umount /old_root
(同樣,這些命令中的許多都在生成新的 shell。
unshare
這樣做,chroot
本身也是如此。您可以通過將命令作為額外參數傳遞來解決這些問題。在某些情況下,您可能希望傳遞sh -c '...'
完整的腳本。)在這一點上,你
pivot_root
在一個單獨的掛載命名空間的監獄裡,事實上它/var/mychroot
只是原始根目錄的一個目錄(而不是一個單獨的設備或循環設備的掛載)並沒有真正阻止它工作,由於綁定安裝到自身。執行轉義碼,你會看到監獄按預期工作(即使轉義碼聲稱不是這樣):
inside# touch /inside_jail inside# ./escape_chroot Exploit seems to work. =) inside# ls -ld /inside_jail /old_root -rw-r--r--. 1 0 0 0 Jan 5 23:45 /inside_jail dr-xr-xr-x. 20 0 0 4096 Jul 5 23:45 /old_root
如您所見,仍在監獄中……漏洞利用程式碼有點天真,並假設只要操作(
chroot
,chdir
)成功,就足以逃離監獄,但事實並非如此…… .所以考慮使用這種技術來創建一個優於
chroot
並且不需要使用 Linux 功能來阻止其中的操作的監獄(例如創建額外chroot
的 s,這實際上可能對您實際嘗試執行的內容有用或需要)監獄。)