CHROOT - Linux手册页
Linux程序员手册 第2部分
更新日期: 2019-03-06
名称
chroot-更改根目录
语法
#包括
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
说明
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。
错误说明
根据文件系统,可能会返回其他错误。下面列出了更常见的错误:
- EACCES
- 在路径前缀的组件上拒绝搜索许可。 (另请参见path_resolution(7)。)
- EFAULT
- 路径点超出您可访问的地址空间。
- EIO
- 发生I / O错误。
- ELOOP
- 在解析路径中遇到太多符号链接。
- ENAMETOOLONG
- 路径太长。
- ENOENT
- 该文件不存在。
- ENOMEM
- 内核内存不足。
- ENOTDIR
- 路径的组成部分不是目录。
- EPERM
- 呼叫者特权不足。
遵循规范
SVr4、4.4BSD,SUSv2(标记为LEGACY)。此功能不是POSIX.1-2001的一部分。
备注
通过fork(2)创建的子进程继承其父级的根目录。 execve(2)保留根目录不变。
魔术符号链接/ proc / [pid] / root可用于发现进程的根目录。有关详细信息,请参见proc(5)。
FreeBSD有一个更强大的jail()系统调用。
另外参见
chroot(1),chdir(2),pivot_root(2),path_resolution(7),switch_root(8)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。