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