近日containerd社区披露了编号为CVE-2020-15257的GHSA-36xw-fx78-c5r4安全漏洞。一个使用Host Networking Namespace的容器,且容器内UID设置为0时,攻击者可以通过containerd-shim API来操作宿主机上其他的containerd-shim进程,从而发生提权攻击。本文主要描述了该漏洞的影响范围,漏洞产生的原因和防范措施。

目前CVE-2020-15257漏洞评级为中危漏洞,CVSS漏洞评分为5.2

影响范围

containerd社区在1.3.9和1.4.3版本修复了该漏洞,当前ACK所有版本的k8s集群均在该漏洞影响范围内。您可以使用以下kubectl命令查看集群内有哪些Pod共享了主机网络。
kubectl get pods -A -o json |
  jq -c '.items[] | select(.spec.hostNetwork==true) |[.metadata.namespace, .metadata.name]'

漏洞描述

containerd和containerd-shim之间采用abstract socket通信,当容器共享了宿主机的网络namespace且容器内部UID设置为0时,攻击者就可以以Root用户访问宿主机上的containerd-shim进程,进而逃逸出容器并使用containerd-shim的相关接口发起下一步的提权攻击。
说明
  • containerd作为支撑Kubernetes集群运行时,负责管理底层的runC容器,通常包含一个守护进程并通过本地的Unix套接字暴露gRPC服务接口用于容器生命周期的各种管理操作。
  • containerd-shim作为containerd的一个组件,用于隔离containerd守护进程和容器进程,并且通过containerd-shim调用runC接口直接和容器交互。

防范措施

为了尽可能降低您受到提权攻击的概率,您需要尽可能地让业务应用运行在独立的五个核心Net、Mount、IPC、PID或UTS Namespace内,与宿主机共享的namespace越多,被攻击的概率就越高。您也尽可能不要在Pod配置中使用Host Networking配置,可以通过以下方式限制Host Networking的使用:
  • 开启PSP特性,通过PSP策略中的hostNetwork配置可以限制指定namespace的Pod无法使用共享主机网络。ACK容器服务提供了PSP安全策略的控制台配置能力,具体操作,请参见使用PSP安全策略
  • 装gatekeeper组件,具体操作,请参见组件介绍。基于示例OPA策略
如果因为业务原因必须使用Host Networking配置, 建议您在Pod的securityContext中配置以非Root用户启动,设置allowPrivilegeEscalation参数为false。具体配置样例如下:
hostNetwork: true   #特殊原因必须使用主机共享网络。
containers:
- name: foo
  securityContext:
    runAsUser: 12345
    allowPrivilegeEscalation: false