
沙箱配置文件没有泡泡包的特权
许多集装箱执行时间工具,例如SystemD-NSpawn,DockEretc。,专注于为系统管理员和编排工具(例如Kubernettes)提供基础架构来执行容器。
这些工具不适合将其提供给没有特权的用户,因为将这种访问转换为具有完全特权的根外壳是微不足道的。
在Linux内核级别上有一个隔离系统,称为“用户名称空间”用户名空间,试图允许没有特权的用户使用容器的功能。尽管已经取得了重大进展,但在这方面仍然存在一些关注,并且在几个生产分布(例如Centos / Red Hat Enterprise Linux 7,Debian Jessie等)中没有特权的用户无法获得关注。
参见,例如,CVE-2016-3135,这是用户引入的本地根系漏洞。 2016年3月的出版物进行了更多讨论。
BubbleWrap可以看作是用户名空间子集的整体实现。强调子集 - 特别与先前的CVE相关,BubbleWrap不允许对Iptables的控制。
原始的BubbleWrap代码在用户名空间之前存在:继承XDG -App辅助代码,而Linux-user-chroot又受到了干扰。
该工具的维护者认为,即使与该分发中安装的典型软件结合使用,也不允许特权升级。但是,它可以增加登录以进行服务拒绝攻击的用户的容量。
特别是,使用BubbleWrap Pr_set_no_new_privs停用setuid二进制,这是诸如chroots之类的传统方式。
该程序可以由所有不扎根操作的容器工具共享,例如:
Flatpak rpm-ostree无BWRAP-OCI特权,我们也希望在Kubernetes / on缩合簇中使用。拥有没有特权的用户使用容器功能的能力将显着促进交互式和类似的纯化场景的实现。
BubbleWrap通过创建一个新的,完全空的组装名称空间来起作用,该空间位于主机看不见的TMPF中,并将在最后一个过程结束时自动清洁。接下来,您可以使用命令行选项来构建根文件系统和进程环境以及在名称空间中执行的命令。
源代码中有一个较大的演示命令序列,但是这里有一个小版本可以执行新的外壳重复使用文件 /usr。
Bwrap - ro-bind /usr /usr-symlink usr /lib64 /lib64 - proc /proc-dev /dev-share-pid bash这是一个不完整的例子,但可用于说明目的。更常见的是,您不想使用主机文件系统树创建容器,而是要注册Chroot。在那里,TMPF可能已经在目标rootfs中创建了lib64-> usr/lib64符号链接。
BubbleWrap的目的是在沙箱中执行应用程序,在该框中,它限制了对操作系统或用户数据(例如起始目录)的部分访问权限。
BubbleWrap始终创建一个新的汇编名称空间,用户可以准确指定文件系统中应在沙盒中可见的哪些部分。指定的任何目录中的任何一个将以预定的形式安装,只能阅读。
此外,您可以使用这些内核功能:
用户名空间(Clone_newuser):这隐藏了除当前UID和沙盒外的所有内容。它还可以更改沙箱中的UID / GID值应该是什么。
IPC名称空间(Clone_newipc):沙框将获得其自己的所有不同形式的CPI的副本,例如SYSV共享内存和交通信号灯。
PID名称空间(Clone_NewPID):沙盒将不会在沙箱外看到任何过程。此外,BubbleWrap将在其容器中执行PID1 Trivial,以处理在沙盒中收获儿童的要求。这避免了现在称为Docker PID 1问题的问题。
Spaces Dehttp://linux.die.net/man/2/clone网络名称(clone_newnet):沙盒将看不到网络。相反,您将拥有自己的网络名称空间,只有一个倒环设备。
UTS名称空间(clone_newuts):沙框将具有自己的主机名。
SECCOMP过滤器:限制可以在测试区域执行的系统的SECCOMP过滤器可以通过。有关更多信息,请参见Seccomp。
Firejail与Flatpak相似,然后将BubbleWrap分为将Setuid工具与许多特定的台式沙盒功能相结合的感觉。例如,Firejail知道Pulseaudio,而BubbleWrap no。
BubbleWrap的作者认为,审核小型固定程序并保持特征(例如脉冲滤波作为一个没有特权的过程),就像现在的Flatpak一样。
此外,@cgwalter认为尝试在白色列表中包含文件路由是一个坏主意,因为用户必须操纵系统管理员配置系统的无数方式和无数方法。 BubbleWrap方法是仅保留一些特定的Linux功能,例如CAP_SYS_ADMIN,但始终访问文件系统(例如Invocation UID)。这完全关闭了Tocttou攻击和其他攻击。
SandStorm.io需要没有特权的用户名的空间才能配置其沙箱,尽管它也很容易在setuID模式下进行操作。 @cgwalters认为它的代码相当不错,但是在BubbleWrap中统一仍然有意义。但是,@kentonv(来自Sandstorm)认为,尽管这原则上这是有意义的,但变革的成本暂时超过了实际收益。这一决定将来可能会重新评估,但今天并非积极应用。
Runc当前正在无需根的容器支持,而无需在RUNC安装期间(使用无特权而不是setUID的用户名空格),创建和管理容器的任何其他特权。但是,使用RUNC的标准模式类似于SystemD Nspawn,其中设计为被root调用。
BubbleWrap的作者认为,Runc和Systemd-nspawn并非被设计为变得固定,并且远非承认这种方式。但是,对于没有根无根的容器,RunC可以遵守BubbleWrap接收的某些用例(具有完整和标准化的OCI执行时间的其他好处)。
Binctr只是Runc的信封,因此他继承了所有设计补偿。