「不要只看外表,美,是由內而外散發出來的。」 - 美女與野獸
第18天了要來進行一個新的領域,叫做容器逃逸。前面有說過容器本質上就是將 linux kernel 的資源切割出來做虛擬化形成的環境,但如果在建立虛擬化環境時有些疏漏的地方就會導致可以進行容器逃逸,進而影響到執行容器的作業系統。本次熱身漏洞編號為CVE-2016-5195,相關資訊如下。
漏洞相關資訊
之前提過容器的 kernel 是與宿主機的 kernel 共享的,並使⽤Namespace與Cgroups這兩項技術進行隔離的效果。但一旦容器本身突破 namespace 的限制的話,就能夠達成容器逃逸攻擊,進而去影響宿主機本身。架構如下圖所示 :
容器逃逸的手法大致分為三類,這三類手法難易程度依序越來越難,分別如下 :
第一類的手法通常透過給予容器所有的 Capability,即這個容器的 ROOT 帳號與宿主機的 ROOT 的權限一致時,就可以透過各種花式手法進行容器逃逸,而這部分會是下次主要介紹的逃逸手法。
第二類則是 Docker 相關組件的問題像是 containerd、runc 導致被逃逸。比方說 CVE-2019-5736 runc 問題,在我之前影片 解剖小鯨魚,來談談如何利用 runc 執行自己達成容器逃逸攻擊!!! CVE-2019-5736 有進行相關的解說。
第三類則是因為 Linux kernel 有漏洞導致容器逃逸,但相關原理相對會比較複雜。目前相關的漏洞主要是跟 DirtyCow 有關,有興趣的話可以去研究 Dirty Cow(CVE-2016-5195)。
在下一次的影片我們會針對第一類的手法做比較詳細的解說,但這邊就先用 CVE-2016-5195 來做點熱身運動吧。
步驟如下 :
sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose ;
sudo chmod +x /usr/local/bin/docker-compose
apt-get update;
apt-get install -y build-essential nasm git xxd
mkdir /dirtycow-vdso
cd dirtycow-vdso
git clone https://github.com/scumjr/dirtycow-vdso.git
cd dirtycow-vdso
make
回家作業解答
官網在 tarfile extractall 的函式有說針對不信任的tar檔案需要做事前的檢查,請試著調整解壓縮的 Python 程式避免任意檔案寫入的問題。
這題沒有標準答案,但我的作法是,先針對目標目錄(可以是工作目錄、解壓縮檔案目錄)取得絕對路徑,再把該路徑跟檔名組合,然後再用 Python 取得絕對路徑函式得到結果,最後在比較兩者的數值。如果得到的結果是目標目錄開頭,代表沒有跨越要存放的目錄位置,就允許它進行解壓縮。
import os
import tarfile
def py_files(members):
cwd = os.getcwd()
for tarinfo in members:
print(tarinfo.name)
abspath = os.path.abspath(tarinfo.name)
if abspath.startswith(cwd) :
print("hit",tarinfo.name,"=",abspath)
yield tarinfo
else :
print("You are bad gay.")
tar = tarfile.open("test.tar")
tar.extractall(members=py_files(tar))
tar.close()
參考資料 :