本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

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
  # ...

這也可以使用 Pod 安全策略在全球範圍內強制執行

---
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 套件或在使用不可變映像時升級您的作業系統映像來完成。以下是各種發行版和平台的已知安全版本列表

某些平台也發布了更具體的說明

Google 容器引擎 (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 找到他們。