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'

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

资料来源:https://cloud.baidu.com/doc/CCE/s/Fkgaj9791

Katen Doe

Fiime分享

专业分享,共建知识殿堂

猜你喜欢

wave

按 ECS 键退出搜索