用这个启动一个shell:
bwrap --unshare-pid --unshare-user --dev-bind / / bash
在主机上的另一个 shell 中,我们可以使用 lsns 看到这一点:
4026532550 user 2 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026532552 mnt 2 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026532562 pid 2 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
命名空间报告中的 lsns
4026531834 time 3 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026531835 cgroup 3 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026531838 uts 3 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026531839 ipc 3 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026531992 net 3 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026532550 user 3 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026532552 mnt 3 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
4026532562 pid 3 1799976 user bwrap --unshare-pid --unshare-user --dev-bind / / bash
主要问题:
如何在与第一个相同的命名空间中启动第二个 shell?
奖金问题:
据我了解,在大多数情况下,bubblewrap 创建了一个中间命名空间(只有用户命名空间?)
是否可以在bubblewrap 创建的中间命名空间中启动一个shell?
它会因为所有权限都已被中间命名空间中的气泡包装删除而无用吗?
这个想法是进一步的挂载/卸载可以在中间命名空间的最终命名空间中完成,或者其他一些特权的东西
欢迎任何解决方案,最好使用bubblewrap,否则最好使用nsenter 以及用于PoC 的原始setns 系统调用
请注意,bwrap 不是 setuid,我以非特权用户身份启动 bwrap,内核中启用了所有类型的命名空间,并且它们作为非特权用户正常工作 afaik
根据这个问题https://github.com/containers/bubblewrap/issues/253,bubblewrap 只能创建新的挂载命名空间,所以这个问题目前可能无法仅使用bubblewrap 来解决
Bubblewrap 在创建初始命名空间、简单且足够的配置方面做得很好,如果它创建的命名空间无法以任何方式正确重新输入,我可能会修补 bubblewrap 以便允许它或完全放弃它并编写一个基于bubblewrap如何做大多数事情的自己的setns包装器
Flatpak 使用bubblewrap 并允许输入命名空间,检查bubblewrap 是否创建中间命名空间,我试图理解https://github.com/flatpak/flatpak/blob/4735e3ea90d9cfa7237aa1de7818ba396a45f084/app/flatpak-builtins-enter.c处的代码但我无法让它手动工作