加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix/Linux编程:改变进程的根目录------chroot()

发布时间:2022-12-05 14:31:00 所属栏目:Unix 来源:网络
导读: 每个进程都有一个根目录,该目录是解释绝对路径时的起点。默认情况下,这是文件系统的真实根目录(新进程从其父进程处继承根目录)。有些场合需要改变一个进程的根目录,而特权级(CAP_SYS_C

每个进程都有一个根目录,该目录是解释绝对路径时的起点。默认情况下,这是文件系统的真实根目录(新进程从其父进程处继承根目录)。有些场合需要改变一个进程的根目录,而特权级(CAP_SYS_CHROOT)进程通过 chroot()系统调用能够做到这一点

NAME
       chroot - change root directory
SYNOPSIS
       #include 
       int chroot(const char *path);

chroot()系统调用将进程的根目录改为由path指定的目录(如果path是符合链接,还将对其解引用)。自此,对所有绝对路径名的解释都将以该文件系统的这一位置作为起点。鉴于这会将应用程序限定于文件系统的特定区域,有时也将此称为设立了一个chroot监禁区。

通常情况下,不是随便什么程序都可以在chroot监禁区中运行的,因为大多数程序与共享库之间采用的是动态链接的方式。因此unix目录,要么只能局限于运行静态链接程序,要么就在监禁区中复制一套标准的共享库系统目录。

chroot()系统调用从未被视为一个完全安全的监禁机制。首先,特权级程序可以在随后对chroot()的进一步调用中利用种种手段而越狱成功。比如,特权限程序可以使用mknod()来创建一个内存设备,并通过该设备来访问RAM的内容,到那时,就一切皆有可能的。通常,最好不要在chroot监禁区文件系统内放置set-user-ID-root程序。

即使是无特权程序,也必须小心防范如下几条可能的越狱路线

int fd;
fd = open("/", O_RDONLY);
chroot("/home/ocea");  //jailed
fchdir(fd);
chroot(".");   //out of jail

为了防止这种可能性,必须关闭所有指向监禁区外目录的文件描述符。(其他一些 UNIX实现提供了 fchroot()系统调用,可用于获得与上述代码片段类似的结果。

一些 BSD 衍生系统提供的 jail()系统调用解决了包括上述问题在内的不少问题,其所创建的监禁区即使针对特权级进程也是安全的

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!