本文发布已超过一年。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否已不正确。
Runc 和 CVE-2019-5736
今天上午,runc 中发现的容器逃逸漏洞已公布。我们希望为 Kubernetes 用户提供一些指导,以确保所有人都安全可靠。
什么是 runc?
简而言之,runc 是一个底层工具,负责执行启动 Linux 容器的繁重工作。Docker、Containerd 和 CRI-O 等其他工具位于 runc 之上,用于处理数据格式化和序列化等事务,但 runc 是所有这些系统的核心。
Kubernetes 反过来位于这些工具之上,因此虽然 Kubernetes 本身没有任何漏洞,但大多数 Kubernetes 安装都在底层使用 runc。
什么是漏洞?
虽然详细信息仍在保密中,以便留出时间进行修补,但大致版本是,当在容器内部以 root (UID 0) 用户身份运行进程时,该进程可以利用 runc 中的一个 bug 来获取运行容器的主机的 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 - Stable:
1967.5.0
/ Beta: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
联系他们。