runc容器逃逸漏洞安全通告
發布時間 2019-02-13漏洞編號和級別
CVE編號:CVE-2019-5736,危險級別:嚴重, CVSS分值:官方未評定
影響范圍
受影響版本:
runC 全版本
LXC 以及 Apache Mesos
漏洞概述
runc是一個根據OCI(Open Container Initiative)標準創建并運行容器的CLI tool。目前docker引擎內部也是基于runc構建的。2019年2月11日,研究人員通過oss-security郵件列表披露了runc容器逃逸漏洞的詳情,漏洞可能影響廣大云服務廠商,危害嚴重。
該漏洞允許惡意容器以最少的用戶交互覆蓋宿主機上的runC文件,從而在宿主機上以 root 權限執行惡意代碼。當滿足以下條件時,攻擊者有可能以root權限執行任意代碼:
1. 使用攻擊者控制的鏡像創建新容器,或者攻擊者具有某一docker容器的root權限
2. 攻擊者可以使用docker exec方式進入上述容器
默認的AppArmor策略不能阻止該漏洞。同樣在Fedora上,默認的SELinux策略也不能阻止該漏洞。(因為容器進程是以container_runtime_t運行的)。但是可以通過正確使用命名空間的方式阻止此漏洞(不讓宿主機的root映射到容器的命名空間中)。
上述內容只出現在 Fedora 的“moby-engine”軟件包中。其他的docker軟件包以及 podman不會受到此漏洞的影響。因為他們的容器進程是以container_t運行的。
漏洞細節
攻擊者可以將容器中的目標文件替換成指向runc的自己的文件來欺騙runc執行自己。比如目標文件是/bin/bash,將它替換成指定解釋器路徑為#!/proc/self/exe的可執行腳本,在容器中執行/bin/bash時將執行/proc/self/exe,它指向host上的runc文件。然后攻擊者可以繼續寫入/proc/self/exe試圖覆蓋host上的runc文件。但是一般來說不會成功,因為內核不允許在執行runc時覆蓋它。為了解決這個問題,攻擊者可以使用O_PATH標志打開/proc/self/exe的文件描述符,然后通過/proc/self/fd/<nr>使用O_WRONLY標志重新打開文件,并嘗試在一個循環中從一個單獨的進程寫入該文件。當runc退出時覆蓋會成功,在此之后,runc可以用來攻擊其它容器或host。
漏洞利用
漏洞POC已公開:https://github.com/q3k/cve-2019-5736-poc。
修復建議
更新 runC、LXC 至官方發布的最新補丁。
參考鏈接
https://www.openwall.com/lists/oss-security/2019/02/11/2