如何取消共享才能使用不带真实根目录的chroot?

问题描述

chroot根据manual需要CAP_SYS_CHROOTunshare命令uses chroot

命令unshare -UrR newroot/将在不作为root运行的情况下起作用,这是有道理的,因为-r标志使我们root进入了命名空间,从而使我们{{1 }}功能

CAP_SYS_CHROOT不需要以unshare -UR newroot/的身份运行时,问题就开始了,而root会给我带来unshare -U chroot newroot/错误。因此,在第一种情况下,我并不是要在用户名称空间中使用Operation not permitted,第二种是相同的,只是尝试手动进行。

检查code时,使用root时唯一发生的事情就是将-R设置为newroot,所以我不明白为什么在一个示例中这可行,另一方面则没有。

解决方法

之所以会这样,是因为首先调用unshare(2),并将其作为CLONE_NEWUSER的标志之一传递给-U。有关该标志的手册说明:

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

现在该进程在新的名称空间中具有完整的功能集,它可以调用chroot(2)。请注意,该调用发生在具有映射ID的进程被调用之前,因此在这一点上,该进程仍在新的用户命名空间中具有特权。在execve调用开始后,这些功能将被丢弃。

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