docker容器逃逸指的是攻擊者通過劫持容器化業務邏輯或直接控制等方式,已經獲得容器內某種權限下的命令執行能力的過程和結果;因為docker使用的是隔離技術,因此容器內的進程無法看到外面的進程,但外面的進程可以看到里面,所以如果一個容器可以訪問到外面的資源,甚至是獲得了宿主主機的權限,這就叫做“Docker逃逸”。
本教程操作環境:linux7.3系統、docker19.03版、Dell G3電腦。
什么是docker容器逃逸
「容器逃逸」指這樣的一種過程和結果:首先,攻擊者通過劫持容器化業務邏輯,或直接控制(CaaS等合法獲得容器控制權的場景)等方式,已經獲得了容器內某種權限下的命令執行能力;
攻擊者利用這種命令執行能力,借助一些手段進一步獲得該容器所在直接宿主機(經常見到“物理機運行虛擬機,虛擬機再運行容器”的場景,該場景下的直接宿主機指容器外層的虛擬機)上某種權限下的命令執行能力。
因為Docker所使用的是隔離技術,就導致了容器內的進程無法看到外面的進程,但外面的進程可以看到里面,所以如果一個容器可以訪問到外面的資源,甚至是獲得了宿主主機的權限,這就叫做“Docker逃逸”。
目前產生Docker逃逸的原因總共有三種:
-
由內核漏洞引起。
-
由Docker軟件設計引起。
-
由特權模式與配置不當引起。
接下來依次對這三種逃逸方法做簡單說明。
1、由于內核漏洞引起的逃逸
因為Docker是直接共享的宿主主機內核,所以當宿主主機的內核存在安全漏洞時會一并影響Docker的安全,導致可能會造成Docker逃逸。具體流程如下:
-
?使用內核漏洞進入內核上下文
-
?獲取當前進程的task Struct
-
?回溯task list 獲取pid = 1的task struct,復制其相關數據
-
?切換當前Namespace
-
?打開root shell,完成逃逸
2、由于Doker軟件設計引起的逃逸
比較典型的例子是Docker的標準化容器執行引擎—-runc。Runc曾在2019年2月被爆出來過一個Docker逃逸漏洞CVE-2019-5736。其漏洞原理是,Docker、Containerd或其他基于runc的容易在運行時存在安全漏洞,攻擊者可以通過特定的容器鏡像或者exec操作獲取到宿主機runc執行文件時的文件句柄并修改掉runc的二進制文件,從而獲取到宿主機的root執行權限,造成Docker逃逸。
3、由于特權模式+目錄掛載引起的逃逸
這一種逃逸方法較其他兩種來說用的更多。特權模式在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視頻教程》