Linux

如何在文件系統中在 Linux 上使用 chdir(’..’) 創建一個 root 無法逃脫的 chroot?

  • November 14, 2020

/var/mychoot在與 相同的文件系統上有一個目錄/,並且我已將程序啟動/var/mychroot/progsudo chroot /var/mychroot /prog,因此程序以 EUID 0 執行。

如果程序執行chdir("..") 轉義技術,則它能夠轉​​義 chroot 並查看/. (我已經在 Linux 4.18 上驗證了這一點。)

我想阻止這樣的逃跑。事實上,我想防止各種 chroot 轉義,但在這個問題中,我只對如何在現代 Linux 系統上防止chdir("..") 轉義技術感興趣。為此,我正在尋找*chroot(2)*系統呼叫的替代方案。

我找到了 2 個解決方案:pivot_rootMS_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,這實際上可能對您實際嘗試執行的內容有用或需要)監獄。)

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