本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Runc 和 CVE-2019-5736
今天早上,runc 中一個容器逃逸漏洞被公佈。我們希望為 Kubernetes 使用者提供一些指導,以確保所有人的安全。
runc 是什麼?
簡單來說,runc 是執行 Linux 容器建立等繁重工作的底層工具。Docker、Containerd 和 CRI-O 等其他工具構建在 runc 之上,用於處理資料格式化和序列化等問題,但 runc 是所有這些系統的核心。
Kubernetes 又構建在這些工具之上,因此雖然 Kubernetes 本身沒有任何部分易受攻擊,但大多數 Kubernetes 安裝都在底層使用 runc。
漏洞是什麼?
雖然完整的詳細資訊仍在禁運中,以便給人們時間進行修補,但大致版本是,當在容器內以 root (UID 0) 身份執行程序時,該程序可以利用 runc 中的一個錯誤,在執行容器的主機上獲得 root 許可權。這使他們可以無限制地訪問伺服器以及該伺服器上的任何其他容器。
如果容器內的程序是受信任的(您知道它不是惡意的)或者不是以 UID 0 執行的,則此漏洞不適用。如果應用了適當的策略,SELinux 也可以防止此漏洞。RedHat Enterprise Linux 和 CentOS 的軟體包都包含適當的 SELinux 許可權,因此如果啟用了 SELinux,則認為它們不受影響。
最常見的風險來源是攻擊者控制的容器映象,例如來自公共倉庫的未經審查的映象。
我該怎麼做?
與所有安全問題一樣,兩個主要選項是緩解漏洞或將您的 runc 版本升級到包含修復的版本。
由於利用此漏洞需要在容器內以 UID 0 執行,因此直接的緩解措施是確保您的所有容器都以非 0 使用者身份執行。這可以在容器映象中設定,也可以透過您的 pod 規範設定
---
apiVersion: v1
kind: Pod
metadata:
name: run-as-uid-1000
spec:
securityContext:
runAsUser: 1000
# ...
這也可以透過 PodSecurityPolicy 進行全域性強制執行
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: non-root
spec:
privileged: false
allowPrivilegeEscalation: false
runAsUser:
# Require the container to run without root privileges.
rule: 'MustRunAsNonRoot'
鑑於在容器內以 UID 0 執行的總體風險,強烈建議設定此類策略。
另一個潛在的緩解措施是確保您的所有容器映象都經過審查和信任。這可以透過自己構建所有映象,或者審查映象內容然後固定到映象版本雜湊(image: external/someimage@sha256:7832659873hacdef
)來實現。
升級 runc 通常可以透過升級您的發行版的 runc
軟體包或在使用不可變映象時升級您的作業系統映象來完成。這是一些發行版和平臺的已知安全版本列表
- Ubuntu -
runc 1.0.0~rc4+dfsg1-6ubuntu0.18.10.1
- Debian -
runc 1.0.0~rc6+dfsg1-2
- RedHat Enterprise Linux -
docker 1.13.1-91.git07f3374.el7
(如果停用了 SELinux) - Amazon Linux -
docker 18.06.1ce-7.25.amzn1.x86_64
- CoreOS - 穩定版:
1967.5.0
/ 測試版:2023.2.0
/ Alpha 版:2051.0.0
- Kops Debian - 進行中(有關 Kops Debian 修補前的處理方法,請參閱公告)
- Docker -
18.09.2
一些平臺也釋出了更具體的說明
Google Container Engine (GKE)
Google 已釋出安全公告,其中包含更詳細的資訊,但簡而言之,如果您使用的是預設 GKE 節點映象,則您是安全的。如果您使用的是 Ubuntu 節點映象,則需要緩解或升級到包含修復版 runc 的映象。
Amazon Elastic Container Service for Kubernetes (EKS)
Amazon 也釋出了安全公告,其中包含更詳細的資訊。所有 EKS 使用者都應緩解此問題或升級到新的節點映象。
Azure Kubernetes Service (AKS)
Microsoft 已釋出安全公告,其中包含緩解此問題的詳細資訊。Microsoft 建議所有 AKS 使用者升級其叢集以緩解此問題。
Kops
Kops 已釋出公告,其中包含緩解此問題的詳細資訊。
Docker
我們沒有具體確認 Docker for Mac 和 Docker for Windows 易受攻擊,但這似乎很有可能。Docker 已在版本 18.09.2 中釋出了修復程式,建議您升級到此版本。這也適用於使用 Docker 作為底層工具的其他部署系統。
如果您無法升級 Docker,Rancher 團隊已在github.com/rancher/runc-cve 提供了許多舊版本的修復程式回溯。
獲取更多資訊
如果您對此漏洞如何影響 Kubernetes 有任何進一步的疑問,請加入我們:discuss.kubernetes.io。
如果您想聯絡 runc 團隊,您可以透過 Google Groups 或 Freenode IRC 上的 #opencontainers
聯絡他們。