Ubuntu - 非 root 用户可以在 chroot jail 中运行进程吗?

Haw*_*eye 22 ubuntu root chroot

非 root 用户是否可以在 Ubuntu 上运行 chroot 进程?

peh*_*hrs 16

在 Linux 上,chroot(2)系统调用只能由具有特权的进程进行。进程需要的能力是 CAP_SYS_CHROOT。

您不能以用户身份 chroot 的原因很简单。假设您有一个 setuid 程序,例如 sudo,它会检查 /etc/sudoers 是否允许您执行某些操作。现在用你自己的 /etc/sudoers 把它放在一个 chroot chroot 中。突然间,您的权限立即提升。

可以将程序设计为 chroot 自身并将其作为 setuid 进程运行,但这通常被认为是糟糕的设计。chroot 的额外安全性不会引发 setuid 的安全问题。

  • 随着 [namespaces](https://lwn.net/Articles/531114/) 在 linux 中的新可能性,也许可以创建(取消共享)一个新的“用户”命名空间,其中将有一个“嵌入式”root 用户,然后执行`chroot`。 (6认同)
  • @imz--IvanZakharyaschev 你是绝对正确的,我希望你不介意我冒昧地把它写成一个容易测试的答案。 (2认同)

hvd*_*hvd 11

@imz--IvanZakharyaschev 对 pehrs 的回答发表评论说,引入命名空间是可能的,但这尚未经过测试并作为答案发布。是的,这确实使非 root 用户可以使用 chroot。

给定一个静态链接dash,一个静态链接busybox,以及一个bash以非 root 身份运行的正在运行的shell:

$ mkdir root
$ cp /path/to/dash root
$ cp /path/to/busybox root
$ unshare -r bash -c 'chroot root /dash -c "/busybox ls -al /"'
total 2700
drwxr-xr-x    2 0        0             4096 Dec  2 19:16 .
drwxr-xr-x    2 0        0             4096 Dec  2 19:16 ..
drwxr-xr-x    1 0        0          1905240 Dec  2 19:15 busybox
drwxr-xr-x    1 0        0           847704 Dec  2 19:15 dash
Run Code Online (Sandbox Code Playgroud)

在该命名空间的根用户ID被映射到该命名空间的非根用户ID以外,反之亦然,这就是为什么由当前用户所拥有的用户ID作为资0正则系统显示的文件ls -al root,而不unshare,确实将它们显示为当前用户拥有。


注意:众所周知,能够使用 的进程chroot能够突破chroot. 由于unshare -r会将chroot权限授予普通用户,因此如果在chroot环境中允许这样做,则会存在安全风险。事实上,这是不允许的,并且失败了:

取消共享:取消共享失败:不允许操作

unshare(2)文档匹配:

EPERM(自 Linux 3.9 起)

CLONE_NEWUSER是在flags中指定的,并且调用者在chroot 环境中(即调用者的根目录与其所在的挂载命名空间的根目录不匹配)。