chroot函数
函数原型 #include <unistd.h> int chroot(const char *path); chroot()将调用进程的根目录更改为path中指定的根目录。该目录将用于以/开头的路径名。根目录由调用进程的所有子进程继承。只有特权进程(Linux:在其用户名称空间中具有CAP_SYS_CHROOT功能的进程)可以调用chroot()。
chroot用来改变进程的根目录,使其不能访问目录之外的其他目录,必须在指定根目录下运行。
change root directory(更改root目录),Linux 系统默认的根目录结构都是 / 。chroot后,系统目录结构将以指定的位置作为 / 位置。
这个调用改变路径名解析过程中的一个成分,不做任何其他事情。特别是,它不打算用于任何类型的安全目的,既不打算完全沙盒进程,也不打算限制文件系统调用。
在过去,守护进程使用chroot()在将不受信任的用户提供的路径传递给系统调用(如open(2))之前对自己进行限制。但是,如果将一个文件夹移出chroot目录,攻击者也可以利用它来移出chroot目录。最简单的方法是chdir(2)到要移动的目录,等待它被移出,然后打开像../../../etc/passwd这样的路径。
如果不允许使用chdir(2),在某些情况下也可以使用稍微复杂一点的变体。如果一个守护进程允许指定一个“chroot目录”,这通常意味着,如果您希望阻止远程用户访问chroot目录之外的文件,那么您必须确保文件夹永远不会移出该目录。
此调用不会更改当前工作目录,因此在调用'。'可以在以'/'为根的树之外。特别地,超级用户可以通过以下方式逃离“chroot监狱”:
mkdir foo; chroot foo; cd ..
root 用户可以通过运行如下程序轻松逃离监狱:
mkdir(".out", 0755);
chroot(".out");
chdir("../../../../../");
chroot(".");
execl("/bin/bash", "-i", NULL);
上边的代码中,通过覆盖当前的监狱来创建一个新的监狱,并将工作直接更改为 chroot 环境之外的某个相对路径,再次调用 chroot