近日containerd社区披露了编号为CVE-2020-15257的GHSA-36xw-fx78-c5r4安全漏洞。一个使用Host Networking Namespace的容器,且容器内UID设置为0时,攻击者可以通过containerd-shim API来操作宿主机上其他的containerd-shim进程,从而发生提权攻击。本文主要描述了该漏洞的影响范围,漏洞产生的原因和防范措施。
影响范围
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安全策略的控制台配置能力,具体操作,请参见配置容器安全策略(新版)。
装gatekeeper组件,具体操作,请参见gatekeeper。基于示例OPA策略。
如果因为业务原因必须使用Host Networking配置, 建议您在Pod的securityContext中配置以非Root用户启动,设置allowPrivilegeEscalation参数为false。具体配置样例如下:
hostNetwork: true #特殊原因必须使用主机共享网络。
containers:
- name: foo
securityContext:
runAsUser: 12345
allowPrivilegeEscalation: false