美國時間2019年2月11日晚,runc通過oss-security郵件列表披露了runc容器逃逸漏洞CVE-2019-5736的詳情。runc是Docker、CRI-O、Containerd、Kubernetes等底層的容器運行時,此次安全漏洞無可避免地會影響大多數Docker與Kubernetes用戶,也因此為整個業界高度關注。
漏洞披露后,Docker在第一時間發布了兩個版本18.06.2和18.09.2,這兩個版本都可以修復runc漏洞。Rancher Labs極速響應,Rancher Kubernetes管理平臺和RancherOS操作系統均在不到一天時間內緊急更新,是業界第一個緊急發布新版本支持Docker補丁版本的平臺,并持嚴謹態度在oss-security郵件列表披露漏洞后的五小時內連夜郵件通知所有Rancher用戶此次漏洞的詳情及應對之策。
更值得一提的是,盡管Docker發布了修復版本,但因為不是所有用戶都能輕易將生產環境中的Docker版本升至最新,Rancher幫忙將修復程序反向移植到所有版本的Docker并提供給用戶。且目前Docker官方提供的修復版本并不支持3.x內核(只兼容4.x內核),而runc的開發者特意向Rancher提交了支持3.x內核的PR,目前PR已合并,Rancher提供的方案現已可以支持3.x內核。
runc安全漏洞事件背景
runc是一個根據OCI(Open Container Initiative)標準創建并運行容器的CLI tool,目前Docker引擎內部也是基于runc構建的。2019年2月11日,研究人員通過oss-security郵件列表披露了runc容器逃逸漏洞的詳情,根據OpenWall的規定EXP會在7天后也就是2019年2月18日公開。
此漏洞允許以root身份運行的容器以特權用戶身份在主機上執行任意代碼。這意味著容器可能會破壞Docker主機(覆蓋Runc CLI),而所需要的只是能夠使用root來運行容器。攻擊者可以使用受感染的Docker鏡像或對未受感染的正在運行的容器運行exec命令。
Rancher在12號當天已通過公眾號文章詳細分析了漏洞詳情和用戶的應對之策。相信目前大部分用戶已經對漏洞已經有了初步的了解,甚至在Github上已經有人提交了EXP代碼。Rancher在第一時間完成了補丁修復,并向企業用戶推送的修復方案。同時在我們也收到了大量來自社區用戶在后臺的提問,為了疏解種種謎團,這篇后續文章,我們將選取大家重點關注的一些熱點疑問進行進一步的解答。
熱點問題
非特權容器也能發起攻擊嗎?
答案是肯定的,Rancher安全團隊在第一時間做了一些測試,即使運行容器時不使用privileged參數,一樣可以發起攻擊。因為這個漏洞核心要素在于,容器內的用戶是否對runc有訪問權限, 容器內默認是root用戶,只是這個root是受限制的root,但是它是具有對runc的訪問權限,所以一定可以發起攻擊。
主機上不用root用戶啟動容器可以避免攻擊嗎?
答案是無法避免,如上一個問題分析,它和容器內的用戶有關,至于在主機上以什么用戶啟動無關。Rancher安全團隊在Ubuntu系統上做了測試,即使使用ubuntu用戶啟動容器, 依然可以完成對runc的替換。
更新官方Docker的注意事項
Docker也在第一時間發布了兩個版本18.06.2和18.09.2,這兩個版本都可以修復runc漏洞,但是你需要注意的是他們都只兼容4.x內核,如果你的系統依然使用的3.x內核, 請謹慎使用,因為它基本不會起作用,甚至可能導致額外的問題。
Ubuntu 14.04 customers using a 3.13 kernel will need to upgrade to a supported Ubuntu 4.x kernel
參考兩個版本的RN:
- https://docs.docker.com/engin...
- https://docs.docker.com/engin...
Kubernetes用戶怎么辦?
使用K8s的用戶都很清楚,K8s并不能兼容太高的Docker版本,所以更新官方Docker版本是很難的一件事,為此K8s官方特意發表了一篇Blog:https://kubernetes.io/blog/20... 。 主要思想就是,不要在容器中使用root,它推薦的方案是使用PodSecurityPolicy。當然很多用戶修改PodSecurityPolicy后可能會引發各種問題,所以它也推薦用戶更新Docker。 同時它也提到,不能更新Docker的用戶,可以使用Rancher提供的方案,Rancher為每個版本都移植了補丁:
If you are unable to upgrade Docker, the Rancher team has provided backports of the fix for many older versions at github.com/rancher/runc-cve.
如何使用Rancher提供的補丁?
如上一個問題提到的,用戶可以直接訪問https://github.com/rancher/ru... 來獲取方案,值得一提的是Rancher為3.x和4.x內核用戶都提供了補丁版本。
To install, find the runc for you docker version, for example Docker 17.06.2 for amd64 will be runc-v17.06.2-amd64.
For Linux 3.x kernels use the binaries that end with no-memfd_create. Then replace the docker-runc on your host with the patched one.
如何正確使用EXP?
首先不建議大家廣泛傳播EXP,因為它每暴露一次,就為整體環境增加了一絲風險,我們可以研究學習但是不要惡意傳播。 我們在后臺看到有些人問到,他們使用了某些EXP代碼,攻擊沒有成功,想知道是不是自己的系統是安全的,不用考慮升級。 Rancher安全團隊也查看了一些外部公開的EXP,有些EXP是不完整的,它可能只能在某些環境上起作用。 比如利用libseccomp的EXP,就無法在靜態編譯的runc上起作用,我們使用了一些公開的EXP就無法在RancherOS上完成攻擊。 雖然不同版本的Docker都使用runc,但是不同的操作系統使用runc的方式不同,有的使用static runc,有的使用dynamic runc。 所以不能以某些公開的EXP的執行結果為標準,來判斷自己系統是否存在漏洞。
守護用戶的K8S之路
Rancher Kubernetes平臺擁有著超過一億次下載量,我們深知安全問題對于用戶而言的重要性,更遑論那些通過Rancher平臺在生產環境中運行Docker及Kubernetes的數千萬用戶。
2018年年底Kubernetes被爆出的首個嚴重安全漏洞CVE-2018-1002105,就是由Rancher Labs聯合創始人及首席架構師Darren Shepherd發現的。
2019年1月Kubernetes被爆出儀表盤和外部IP代理安全漏洞時,Rancher Labs也是第一時間向用戶響應,確保了所有Rancher 2.x和1.6.x的用戶都完全不被漏洞影響。
負責、可靠、快速響應、以用戶為中心,是Rancher始終不變的初心;在每一次業界出現問題時,嚴謹踏實為用戶提供相應的應對之策,也是Rancher一如既往的行事之道。未來,Rancher也將一如既往支持與守護在用戶的K8S之路左右,確保大家安全、穩妥、無虞地繼續前進??