無(wú)根容器淺析
隨著云計(jì)算的發(fā)展,容器變得越來(lái)越流行,同時(shí)也產(chǎn)生了實(shí)現(xiàn)容器的新方案,其中之一就是無(wú)根容器。無(wú)根容器是不需要root即可創(chuàng)建得容器,盡管無(wú)根容器在安全方面具有優(yōu)勢(shì),但它們?nèi)栽跍y(cè)試開(kāi)發(fā)中。本文介紹了無(wú)根容器的內(nèi)部結(jié)構(gòu),并分析了無(wú)根容器網(wǎng)絡(luò)組件中的漏洞。
無(wú)根容器
無(wú)根容器與常規(guī)容器相同,區(qū)別在于它們不需要root即可形成。無(wú)根容器仍處于早期階段,無(wú)根容器出現(xiàn)的原因有很多。
- 添加新的安全層。 如果容器運(yùn)行時(shí)受到攻擊,攻擊者將無(wú)法獲得主機(jī)的root特權(quán)。
- 允許多個(gè)非特權(quán)用戶在同一臺(tái)計(jì)算機(jī)上運(yùn)行容器。
- 允許隔離嵌套容器。
Linux內(nèi)核的一項(xiàng)新開(kāi)發(fā)使此方案成為可能,允許無(wú)特權(quán)的用戶創(chuàng)建新的用戶空間。 當(dāng)用戶創(chuàng)建并輸入新的用戶空間時(shí),他將成為該空間的root用戶,并獲得生成容器所需的大多數(shù)特權(quán)。
網(wǎng)絡(luò)連接
為了允許容器聯(lián)網(wǎng),通常創(chuàng)建虛擬以太網(wǎng)設(shè)備(VETH)負(fù)責(zé)聯(lián)網(wǎng)。 但只有root才有權(quán)創(chuàng)建此類設(shè)備,主要的解決方案是Slirp和LXC-user-nic。
(1) Slirp
Slirp最初被設(shè)計(jì)為面向非特權(quán)用戶的Internet連接。 隨著時(shí)間的流逝,它成為虛擬機(jī)和仿真器(包括著名的QEMU)的網(wǎng)絡(luò)堆棧,可對(duì)其修改調(diào)整以啟用無(wú)根容器中網(wǎng)絡(luò)連接。它把容器用戶和網(wǎng)絡(luò)名稱空間分開(kāi)并創(chuàng)默認(rèn)路由設(shè)備。 然后,它將設(shè)備的文件傳遞給默認(rèn)網(wǎng)絡(luò)名稱空間的父級(jí),使其可以與容器和Internet進(jìn)行通信。
(2) LXC-User-Nic
另一種方法是運(yùn)行setuid創(chuàng)建VETH設(shè)備。 盡管它可以啟用容器內(nèi)的聯(lián)網(wǎng)功能,但是它會(huì)要求容器文件以root權(quán)限運(yùn)行。
存儲(chǔ)管理
容器的復(fù)雜元素之一是存儲(chǔ)管理。 默認(rèn)情況下,容器使用Overlay2(或Overlay)創(chuàng)建文件系統(tǒng),但是無(wú)根容器不能做到這一點(diǎn),大多數(shù)Linux不允許在用戶名稱空間中安裝overlay文件系統(tǒng)。解決方案是使用其他驅(qū)動(dòng)程序,例如VFS存儲(chǔ)驅(qū)動(dòng)程序。雖然有效但效率低。更好的解決方案是創(chuàng)建新的存儲(chǔ)驅(qū)動(dòng)程序,適應(yīng)無(wú)根容器的需求。
兼容狀態(tài)
以下容器引擎支持以下組件無(wú)根容器:
安全分析
從安全角度來(lái)看,無(wú)根容器中的漏洞還是配置錯(cuò)誤都會(huì)導(dǎo)致容器中軟件受到破壞,應(yīng)該始終以有限特權(quán)運(yùn)行軟件,當(dāng)漏洞產(chǎn)生時(shí),影響將降至最低。LXE-user-nic具有多個(gè)漏洞,攻擊者可利用漏洞提權(quán),例如CVE-2017-5985和CVE-2018-6556。Slirp近年來(lái)也披露了多個(gè)漏洞。
Slirp – CVE-2020-1983:
在對(duì)該軟件進(jìn)行模糊測(cè)試時(shí),發(fā)現(xiàn)了一個(gè)可能導(dǎo)致Slirp崩潰的漏洞。該漏洞分配編號(hào)為CVE-2020-1983。
這個(gè)問(wèn)題與Slirp如何管理IP碎片有關(guān)。 IP數(shù)據(jù)包的最大大小為65,535字節(jié),錯(cuò)誤是Slirp無(wú)法驗(yàn)證分段IP數(shù)據(jù)包的大小,當(dāng)它對(duì)大于65,535的數(shù)據(jù)包進(jìn)行分段時(shí)就會(huì)會(huì)崩潰。
libslirp中的其他漏洞可在容器上執(zhí)行代碼,甚至可從容器逃逸到主機(jī)以及其他容器。2020年發(fā)現(xiàn)了兩個(gè)此類漏洞:CVE-2020-8608和CVE-2020-7039,受影響的Slirp版本是4.0.0至4.2.0。
總結(jié)
無(wú)根容器提供了一種新的容器解決方案,該方法增加了安全層。 它會(huì)成為云容器中的下一個(gè)演變方向。雖然無(wú)根容器仍然存在許多局限性,其功能仍處于試驗(yàn)開(kāi)發(fā)中,隨著時(shí)間和技術(shù)的發(fā)展,無(wú)根容器可以完全發(fā)揮作用并代替?zhèn)鹘y(tǒng)容器。