漏洞CVE-2019-5736修复公告
更新时间:2024-05-22
runc容器逃逸漏洞修复方案(CVE-2019-5736)
解决方法
可以采用以下三种方法中选择合适的方式修复安全漏洞:
- 新建 Kubernetes 集群,kubernetes 1.11.5 的 docker 版本已更新至 18.09.2,该版本已修复漏洞。
- 节点替换,在集群中扩容入新的节点,容器漂移稳定后将旧节点缩容处理。扩容节点的 docker-runc 均已修复漏洞。该方案会造成容器漂移和业务流量风险。1.8 存量集群添加节点时,新节点的 docker 版本不变,runc 已打上漏洞补丁,1.11.1 及以上存量集群的新扩容节点,docker 已整体更新为 18.09.2 版本。
- 单独升级 runc(1.11的 GPU 集群建议采用上面两种方案),从 docker-18 开始,docker-runc 更名为 runc,以下方案针对 docker-18 之前的版本。
-
定位 docker-runc 位置,并备份。
$ which docker-runc # 正常为 /usr/bin/docker-runc $ mv /usr/bin/docker-runc /usr/bin/docker-runc.orig.$(date -Iseconds)
-
执行以下执行,下载修复的 runc:
$ curl -o /usr/bin/docker-runc https://baidu-container.cdn.bcebos.com/packages/runc/runc-v1.0.0-rc2 $ chmod +x /usr/bin/docker-runc
-
检查 runc 是否正常执行
$ docker-runc -v runc version 1.0.0-rc2 commit: b1adfd870be901735b1509e9560eec508bdfca1f spec: 1.0.0-rc2-dev
-
检查 docker 是否正常运行(因版本和负载差异,显示会有区别):
$ docker version Client: Version: 17.03.2-ce API version: 1.27 Go version: go1.7.5 Git commit: f5ec1e2 Built: Tue Jun 27 01:35:00 2017 OS/Arch: linux/amd64 Server: Version: 17.03.2-ce API version: 1.27 (minimum version 1.12) Go version: go1.7.5 Git commit: f5ec1e2 Built: Tue Jun 27 01:35:00 2017 OS/Arch: linux/amd64 Experimental: false
检查容器运行状态:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52d0c793caf9 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
9b6d830d4ba3 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
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'
此外,也要确保所有的容器镜像都经过审查和且可信的。这可以通过自己构建所有镜像,或者通过审查镜像的内容然后固定到镜像的版本哈希来实现。