pts*_*pts 4 linux chroot container
/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;因为性能开销和不太灵活的内存配置)。
回顾一下,我需要:
/,LD_PRELOAD或它存在吗?
为了防止您提到的特定转义技术,您可以在被锁定后chdir("..")简单地放弃再次执行的能力。转义技术需要再次调用chroot(2)/var/mychrootchroot(),因此阻止它足以阻止它工作。
您可以使用 Linux 功能来做到这一点,只需删除CAP_SYS_CHROOT所需的功能即可chroot(2)。
例如:
outside# chroot /var/mychroot
inside# capsh --drop=cap_sys_chroot --
inside# ./escape_chroot
chroot(baz): Operation not permitted
Run Code Online (Sandbox Code Playgroud)
(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
Run Code Online (Sandbox Code Playgroud)
(同样,这些命令中的许多命令都会生成新的 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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,仍在监狱内......利用代码有点天真,并假设只要操作(chroot,chdir)成功,就足以逃脱监狱,但事实并非如此。 。
因此,考虑使用这种技术来创建一个监狱,该监狱优于chroot并且不需要使用 Linux 功能来阻止其中的操作(例如创建额外的chroots,这对于您实际尝试在监狱。)