
沙箱配置文件沒有泡泡包的特權
許多集裝箱執行時間工具,例如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的信封,因此他繼承了所有設計補償。