在玩弄user_namespaces(7)中的示例时,我遇到了一种奇怪的行为。
应用程序的作用
应用程序user-ns-ex
使用 CLONE_NEWUSER 调用 clone(2),从而在新的用户命名空间中创建一个新进程。父进程将映射 ( 0 1000 1
) 写入 /proc//uid_map 文件并(通过管道)告诉子进程它可以继续。然后子进程 execs bash
。
我在这里复制了源代码。
问题
如果我将其设置为无功能或全部设置,应用程序将打开 /proc//uid_map 进行写入。
当我仅设置 set_capuid、set_capgid 和可选 cap_sys_admin 时,对 open(2) 的调用失败:
设置上限:
arksnote linux-namespaces # setcap 'cap_setuid,cap_setgid,cap_sys_admin=epi' ./user-ns-ex
arksnote linux-namespaces # getcap ./user-ns-ex
./user-ns-ex = cap_setgid,cap_setuid,cap_sys_admin+eip
尝试运行:
kamyshev@arksnote ~/workspace/personal/linux-kernel/linux-namespaces $ ./user-ns-ex -v -U -M '0 1000 1' bash
./user-ns-ex: PID of child created by clone() is 19666
ERROR: open /proc/19666/uid_map: Permission denied
About to exec bash
现在一个成功的案例:
没有能力:
arksnote linux-namespaces # setcap '=' ./user-ns-ex
arksnote linux-namespaces # getcap ./user-ns-ex
./user-ns-ex =
运行正常:
kamyshev@arksnote ~/workspace/personal/linux-kernel/linux-namespaces $ ./user-ns-ex -v -U -M '0 1000 1' bash
./user-ns-ex: PID of child created by clone() is 19557
About to exec bash
arksnote linux-namespaces # exit
我一直试图在手册页中找到原因并尝试使用不同的功能,但到目前为止还没有运气。最让我困惑的是,应用程序以更少的功能运行而没有更多的功能。
有人可以帮助我并澄清问题吗?