问题描述
chroot
根据manual需要CAP_SYS_CHROOT
。 unshare
命令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
命令在调用任何进程之前仍然具有特权。