漏洞CVE-2019-5736修复公告
runc容器逃逸漏洞修复方案(CVE-2019-5736)
本文档介绍 runc 容器逃逸漏洞(CVE-2019-5736)的三种修复方式,包括新建 Kubernetes 集群、节点替换和单独升级 runc,并补充通过 securityContext 与 PodSecurityPolicy 限制容器权限的安全建议。
前提条件
- 已具备百度智能云账号,并拥有 CCE 集群、节点和工作负载的查看与变更权限。
- 如采用新建 Kubernetes 集群或节点替换方案,请提前准备 VPC、
API Server子网、容器子网和LB Service子网等网络资源。 - 如采用单独升级
runc方案,请确认可登录目标 Linux 节点,并可在业务低峰期实施系统级变更。 - 如需应用
securityContext或PodSecurityPolicy配置,请确保已有可写 Kubernetes 集群,并具备相应策略配置权限。
解决方法
新建 Kubernetes 集群修复漏洞
导航路径:容器引擎 CCE->集群管理->集群列表
注意: 新建集群会产生资源费用,请先确认计费方式、网络规划和所需权限。
步骤 1:创建集群并进入节点组配置
在 【容器引擎 CCE】 的 【集群管理】 页面点击 【创建集群】 进入 【创建集群(容器引擎 CCE)】 向导,保持 托管集群 与 自定义参数创建集群 模式。在 集群配置 区域填写集群名称,并按实际网络环境选择相关网络参数。当前控制台未显示原文中的历史版本入口时,直接选择控制台当前支持的 Kubernetes 版本即可。完成配置后,点击 【下一步】 进入节点组配置页面。
在 集群配置 中重点确认以下参数:
| 参数 | 必填 | 说明 |
|---|---|---|
| 集群名称 | 是 | 填写便于业务识别的集群名称。 |
| Kubernetes 版本 | 是 | 选择控制台当前提供的受支持版本。 |
| API Server 子网 | 是 | 选择可用于集群控制面的可用子网。 |
| 容器子网 | 是 | 至少选择 1 个可用于容器网络的子网。 |
| LB Service 子网 | 是 | 选择用于负载均衡服务的子网。 |



节点替换修复漏洞
导航路径:容器引擎 CCE->集群管理->集群列表
注意: 节点替换会触发容器漂移,请在业务低峰期操作,并提前评估业务流量风险。
当账号下已有可替换的存量集群时,可采用以下方式修复漏洞:
- 在目标集群中扩容新节点。
- 待工作负载稳定漂移到新节点后,缩容旧节点。
扩容前请先确认新节点使用的运行时版本或补丁状态已经包含该漏洞修复。
单独升级 runc 修复漏洞
注意: 单独升级
runc属于节点级系统变更,请先在可安全变更的节点验证,再逐步推广到生产环境。
适用于 Docker 18 之前的版本。对于 1.11 的 GPU 集群,建议优先采用前两种方式。从 Docker 18 开始,docker-runc 更名为 runc,以下方案针对 Docker 18 之前的版本。
-
定位 docker-runc 位置,并备份。
Plain Text1$ which docker-runc # 正常为 /usr/bin/docker-runc 2$ mv /usr/bin/docker-runc /usr/bin/docker-runc.orig.$(date -Iseconds) -
执行以下执行,下载修复的 runc:
Plain Text1$ curl -o /usr/bin/docker-runc https://baidu-container.cdn.bcebos.com/packages/runc/runc-v1.0.0-rc2 2$ chmod +x /usr/bin/docker-runc -
检查 runc 是否正常执行
Plain Text1$ docker-runc -v 2runc version 1.0.0-rc2 3commit: b1adfd870be901735b1509e9560eec508bdfca1f 4spec: 1.0.0-rc2-dev -
检查 docker 是否正常运行(因版本和负载差异,显示会有区别):
Plain Text1$ docker version 2Client: 3 Version: 17.03.2-ce 4 API version: 1.27 5 Go version: go1.7.5 6 Git commit: f5ec1e2 7 Built: Tue Jun 27 01:35:00 2017 8 OS/Arch: linux/amd64 9Server: 10 Version: 17.03.2-ce 11 API version: 1.27 (minimum version 1.12) 12 Go version: go1.7.5 13 Git commit: f5ec1e2 14 Built: Tue Jun 27 01:35:00 2017 15 OS/Arch: linux/amd64 16 Experimental: false
检查容器运行状态:
1$ docker ps
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
352d0c793caf9 hub-readonly.baidubce.com/public/pause:2.0 "/pause" 3 hours ago Up 3 hours k8s_POD_node-exporter-klfks_kube-system_c8560cf5-3014-11e9-88b7-fa163e8b0a7e_0
49b6d830d4ba3 hub-readonly.baidubce.com/public/pause:2.0 "/pause" 3 hours ago Up 3 hours k8s_POD_csi-bosplugin-g9ctz_kube-system_c855cf61-3014-11e9-88b7-fa163e8b0a7e_0
安全建议
由于该漏洞需要利用容器内的 UID 0 用户进行攻击,也可以通过修改容器内的默认用户为非 root 用户,或通过 Kubernetes 的安全限制来达到屏蔽漏洞的目的。
-
通过securityContext 限制 UID 为非 0
Plain Text1apiVersion: v1 2kind: Pod 3metadata: 4 name: run-as-uid-1000 5spec: 6 securityContext: 7 runAsUser: 1000 -
利用 PodSecurityPolicy 限制容器的权限
Plain Text1apiVersion: policy/v1beta1 2kind: PodSecurityPolicy 3metadata: 4 name: non-root 5spec: 6 privileged: false 7 allowPrivilegeEscalation: false 8 runAsUser: 9 # Require the container to run without root privileges. 10 rule: 'MustRunAsNonRoot'
此外,也要确保所有容器镜像都经过审查且可信。这可以通过自行构建所有镜像,或者先审查镜像内容再固定到镜像版本哈希的方式实现。
评价此篇文章
