unshare如何在没有真正root的情况下使用chroot



chroot根据手册需要CAP_SYS_CHROOTunshare命令使用chroot。

命令unshare -UrR newroot/将在不作为root运行的情况下工作,这是有意义的,因为-r标志使我们在名称空间内成为root,从而使我们具有CAP_SYS_CHROOT功能。

unshare -UR newroot/不需要作为root运行时,问题就开始了,而unshare -U chroot newroot/会给我Operation not permitted错误。因此,在第一种情况下,我并不要求在用户名称空间中使用root,而第二种情况也是一样的,只是尝试手动执行。

在检查代码时,使用-R时唯一会发生的事情就是将newroot设置为optarg,所以我不明白为什么在一个示例中它有效,而在另一个例子中它无效。

之所以会发生这种情况,是因为首先调用unshare(2),并将其作为-U的标志之一bceause传递给CLONE_NEWUSER。关于该标志的手册备注:

取消共享用户名称空间,以便将调用进程移到一个新的用户名称空间中,该名称空间不与任何以前存在的进程共享。与clone(2)使用CLONE_NEWUSER标志创建的子进程一样,调用者在新的命名空间中获得了一整套功能。

现在进程在新的命名空间中拥有了一整套功能,它可以调用chroot(2)。请注意,该调用发生在调用具有映射ID的进程之前,因此在这一点上,该进程在新的用户命名空间中仍然具有特权。在execve调用时丢弃这些功能以启动新进程。

这就是chroot命令失败的原因:因为它缺少权限,而unshare命令在调用任何进程之前仍然具有特权。

相关内容

  • 没有找到相关文章

最新更新