遵循规范

SVr4、4.4BSD,SUSv2(标记为LEGACY)。此功能不是POSIX.1-2001的一部分。

说明

chroot()将调用进程的根目录更改为path中指定的目录。该目录将用于以/开头的路径名。调用过程的所有子级都继承根目录。

只有特权进程(Linux:在其用户名称空间中具有CAP_SYS_CHROOT功能的进程)可以调用chroot()。

此调用将更改路径名解析过程中的成分,并且不执行其他任何操作。特别是,它既不打算用于任何类型的安全性目的,也不是为了完全沙盒化进程或限制文件系统调用。过去,守护程序使用chroot()来限制自己,然后再将不受信任的用户提供的路径传递给系统调用(例如open(2))。但是,如果将文件夹移出chroot目录,则攻击者也可以利用该文件夹来移出chroot目录。最简单的方法是将chdir(2)移至要移动的目录,等待将其移出,然后打开../../../etc/passwd之类的路径。

如果不允许chdir(2),则在某些情况下也可以使用稍微复杂一点的变体。如果守护程序允许指定" chroot目录",则通常意味着如果要阻止远程用户访问chroot目录之外的文件,则必须确保文件夹永远不会移出该目录。

该调用不会更改当前的工作目录,因此在调用aq之后。 aq可以在以aq / aq扎根的树之外。特别是,超级用户可以通过执行以下操作从" chroot监狱"中逃脱:

mkdir foo; chroot foo; cd ..

该调用不会关闭打开的文件描述符,并且此类文件描述符可能允许访问chroot树之外的文件。

返回值

成功时,返回零。如果出错,则返回-1,并正确设置errno。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

错误说明

根据文件系统,可能会返回其他错误。下面列出了更常见的错误:

EACCES
在路径前缀的组件上拒绝搜索许可。 (另请参见path_resolution(7)。)
EFAULT
路径点超出您可访问的地址空间。
EIO
发生I / O错误。
ELOOP
在解析路径中遇到太多符号链接。
ENAMETOOLONG
路径太长。
ENOENT
该文件不存在。
ENOMEM
内核内存不足。
ENOTDIR
路径的组成部分不是目录。
EPERM
呼叫者特权不足。
CHROOT - Linux手册页

Linux程序员手册 第2部分
更新日期: 2019-03-06

语法

#包括

int chroot(const char * path);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

chroot():

Since glibc 2.2.2:
_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)
    || /* Since glibc 2.20: */ _DEFAULT_SOURCE
    || /* Glibc versions <= 2.19: */ _BSD_SOURCE
Before glibc 2.2.2: none

备注

通过fork(2)创建的子进程继承其父级的根目录。 execve(2)保留根目录不变。

魔术符号链接/ proc / [pid] / root可用于发现进程的根目录。有关详细信息,请参见proc(5)。

FreeBSD有一个更强大的jail()系统调用。

另外参见

chroot(1),chdir(2),pivot_root(2),path_resolution(7),switch_root(8)

名称

chroot-更改根目录

日期:2019-08-20 17:58:36 来源:oir作者:oir