本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
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
联系他们。