本文发布已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

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。以下是针对各种发行版和平台的已知安全版本列表。

一些平台也发布了更具体的说明

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 联系他们。