漏洞修复公告

runc容器逃逸漏洞修复方案(CVE-2019-5736)

解决方法

可以采用以下三种方法中选择合适的方式修复安全漏洞:

  1. 新建 Kubernetes 集群,kubernetes 1.11.5 的 docker 版本已更新至 18.09.2,该版本已修复漏洞。

  2. 节点替换,在集群中扩容入新的节点,容器漂移稳定后将旧节点缩容处理。扩容节点的 docker-runc 均已修复漏洞。该方案会造成容器漂移和业务流量风险。1.8 存量集群添加节点时,新节点的 docker 版本不变,runc 已打上漏洞补丁,1.11.1 及以上存量集群的新扩容节点,docker 已整体更新为 18.09.2 版本。

  3. 单独升级 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'

此外,也要确保所有的容器镜像都经过审查和且可信的。这可以通过自己构建所有镜像,或者通过审查镜像的内容然后固定到镜像的版本哈希来实现。