CVE-2019-5736 PoC公佈
上週,SUSE Linux GmbH高階軟體工程師Aleksa Sarai公佈了影響Docker, containerd, Podman, CRI-O等預設執行時容器runc的嚴重漏洞CVE-2019-5736。
漏洞會對IT執行環境帶來威脅,漏洞利用會觸發容器逃逸、影響整個容器主機的安全,最終導致執行在該主機上的其他容器被入侵。漏洞影響AWS, Google Cloud等主流雲平臺。更多關於CVE-2019-5736資訊參見runC容器逃逸漏洞分析(CVE-2019-5736)http://www.4hou.com/vulnerable/16165.html
日前,該容器逃逸漏洞的PoC利用程式碼已在GitHub上公佈。
這是CVE-2019-5736漏洞利用的Go語言實現。漏洞利用是通過覆寫和執行主機系統runc二進位制檔案完成的。
工作原理
本PoC共有漏洞利用的兩個用例。
第一個是一個trap。攻擊者需要獲取容器中的命令執行,並監聽一個惡意二進位制檔案。如果有攻擊者或受害者使用docker exec進入容器,就會觸發漏洞利用,惡意程式碼就可以以root許可權執行。
第二個建立了一個惡意Docker映象。如果該惡意映象執行就會觸發漏洞利用。
漏洞的利用需要在容器內獲取root(uid 0)許可權。
詳細解釋
如果目標二進位制檔案是/bin/bash,就會被指定路徑為#!/proc/self/exe (/proc/self/exec是kernel為每個程序建立的符號連結,指向該程序執行的熱禁止檔案) 的程序取代。當容器中執行/bin/bash時,執行runc二進位制檔案的/proc/self/exe就會被執行。
研究人員用執行啟動Docker exec程序的二進位制檔案的#!/proc/self/exe來覆寫了容器中的 /bin/sh。
這樣攻擊者就可以進一步寫入目標/proc/self/exe並嘗試執行runc二進位制檔案。但一般來說這樣並不能成功,因為當runC執行時kernel是不允許它被覆寫的。因此攻擊者打開了一個使用O_PATH flag的/proc/self/exe的檔案描述器,然後通過/proc/self/fd/以O_WRONLY的形式重新開啟二進位制檔案,並嘗試從一個單獨程序的寫迴圈來寫入。
註釋:上面的部分內容並不是完全準確的。比如在獲取runcinit的檔案描述器時並不一定需要使用O_PATH flag。而且也不需要在另一個程序中建立寫迴圈。獲取/proc/PID/exe的file handle也可以獲取runcinit的檔案描述器。然後使用handle來獲取/proc/self/fd/FILEDESCRIPTOR的file handle。下面是研究人員使用的file handle:
最後當runc執行時就可以PoC就可以成功轉型。然後runc二進位制檔案就被入侵了,可以被用於攻擊其他容器或主機本身。
如果可以寫入該file handle,那麼就可以覆寫主機上的runc二進位制檔案。就可以以root許可權執行任意命令了。
惡意Docker映象示例
研究人員認為惡意Docker映象是一個非常危險的場景。只要執行惡意容器映象就可以以root許可權執行程式碼。詳細解釋參見https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html。