2

我使用以下命令对目录进行了 chroot:

os.chroot("/mydir")

如何在chrooting之前返回到上一个目录?也许可以取消根目录?

解决方案:

感谢菲哈格。我找到了解决方案。简单的例子:

import os
os.mkdir('/tmp/new_dir')
dir1 = os.open('.', os.O_RDONLY)
dir2 = os.open('/tmp/new_dir', os.O_RDONLY)

os.getcwd()                # we are in 'tmp'
os.chroot('/tmp/new_dir')  # chrooting 'new_dir' directory
os.fchdir(dir2)
os.getcwd()                # we are in chrooted directory, but path is '/'. It's OK.
os.fchdir(dir1)
os.getcwd()                # we came back to not chrooted 'tmp' directory

os.close(dir1)
os.close(dir2)

更多信息

4

1 回答 1

3

如果你没有改变你当前的工作目录,你可以简单地调用

os.chroot('../..') # Add '../' as needed

当然,这需要CAP_SYS_CHROOT能力(通常只授予root)。

如果您更改了工作目录,您仍然可以 escape,但更难:

os.mkdir('tmp')
os.chroot('tmp')
os.chdir('../../') # Add '../' as needed
os.chroot('.')

如果chroot更改当前工作目录,您可以通过打开目录并使用fchdir返回来解决此问题。

当然,如果您打算在正常程序的过程中退出 chroot(即不是演示或安全漏洞利用),您应该重新考虑您的程序。首先,你真的需要逃避 chroot 吗?为什么不能事先将所需的信息复制到其中?

此外,考虑使用第二个进程,该进程位于 chroot 之外并响应 chroot 进程的请求。

于 2012-04-05T17:23:41.790 回答