在非特权命名空间沙盒中挂载proc

5
我正在尝试使用Linux命名空间创建沙盒环境。我在https://github.com/swetland/mkbox找到了一个很好的示例,大致符合我的要求,但我希望沙盒内出现可信的/proc。我该怎么做?
我尝试将proc FS绑定安装在"proc"上,但是失败了,错误为EINVAL。当我尝试正常安装"proc"时,它会产生EPERM。
有什么想法吗?

你到底做了什么? ./mkbox sandbox pwd/proc? 也许你试图在没有命名空间的情况下将proc挂载到proc上? - resultsway
1
请查看 https://github.com/hanwen/mkbox/commit/043d6fdf3fe81275c4c184e689faa23d844ee36b 以了解我尝试的具体内容。 - hanwen
2个回答

6
一个本地专家为我找到了解决方法:proc必须使用(未公开的?)MS_REC标志,如下所示:
    ok(mount, "/proc", "proc", NULL, MS_REC|MS_BIND, NULL);

显然,只有在未设置CLONE_PIDNS时,绑定挂载才能发挥作用。


4
我刚遇到了这个问题,是你在StackOverflow上的回答解决了它,也让我免于抓狂。而Swetland实际上是在我家写的mkbox代码。小世界啊。PS 我现在记得需要使用MS_REC(在阅读这篇文章后),原因是/proc内部还挂载有其他文件(例如/proc/sys/fs/binfmt_misc),如果你不递归地挂载它们,就可能会揭示那些本来被意图隐藏的内容。 - Kenton Varda
我也为此苦恼了一段时间。记录一下:在普通命令行Shell中,通过调用 mount --rbind /proc proc 可以达到相同的效果。 - josch

0
我没有仔细查看你的提交,无法确定这是否是你的问题,但如果你有CLONE_NEWUSER | CLONE_NEWNS而没有CLONE_NEWPID,那么会出现EPERM。这是因为为了挂载proc,你需要在与当前PID命名空间对应的用户命名空间中具有CAP_SYS_ADMIN,而不是当前用户命名空间。
Linux 4.4,fs/proc/root.c112-117行
ns = task_active_pid_ns(current);
options = data;

/* Does the mounter have privilege over the pid namespace? */
if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN))
        return ERR_PTR(-EPERM);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接