chroot , pivot_root与switch_root

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

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值