12月4日,Kubernetes 产品安全委员会公开了一个新的Kubernetes漏洞——CVE-2020-8554。该漏洞是中危漏洞,影响所有的Kubernetes 版本,而且目前仍然没有修复。
漏洞分析
CVE-2020-8554漏洞是Kubernetes服务中External IPs和 Load Balancer IPs 2个特征中的设计漏洞。Kubernetes服务是一种将运行在pod集上的应用以网络服务的形式暴露。一个服务会暴露给一个或多个IP。一旦部署,集群中的节点就会将到服务IP的流量路由到提供该服务的后端pod。
当集群管理和分配服务IP时,一切正常。但是如果Kubernetes 用户能够为其服务分配任意IP时就会出现问题。在这种情况下,恶意用户可以分配一个其他终端已经使用的IP 地址,拦截所有到该IP的集群流量。控制服务IP的方法一共有2种:
- 分配一个外部IP地址。
- 通过修复status.loadBalancer.ingress.ip 域名分配一个Load Balancer IP。该方法要求有补丁服务/状态权限。
下面是部署到集群后,拦截所有到IP地址8.8.8.8的DNS流量并路由到恶意DNS服务器pod的服务。
图1. 滥用外部IP来拦截到8.8.8.8的DNS流量的服务
为了接收拦截的流量,攻击者必须控制支持恶意服务的终端。在大多数情况下是一个pod,与上面例子中的恶意DNS服务器pod一样。此外,外部终端也可以支持这样的服务,也就是说攻击者可以将拦截的流量路由到集群意外的外部终端。但这要求攻击者创建一个指向外部地址的Kubernetes终端,也就是说需要创建endpoint 权限。
受影响的产品
该漏洞影响所有的Kubernetes 版本,而且目前仍然没有修复。满足以下条件的集群会受到该漏洞的影响:
- 允许非admin Kubernetes用户创建或更新服务,或对服务状态打补丁;
- 允许非特权用户控制pod,包括创建、更新和执行;
- 允许非特权用户创建或更新终端。
此外,多租户集群是最危险的,因为其最有可能实现以上有漏洞的配置。多租户集群一般使用Kubernetes 命名空间来分割租户,限制每个租户对其命名空间的权限。但只要有一个租户可以管理自己命名空间中的服务和pod,就可以利用CVE-2020-8554 漏洞来窃取整个集群的流量。因此,攻击者可以入侵其中一个租户来利用该漏洞来拦截其他租户的流量。
缓解措施
Kubernetes产品安全委员会认为,在不对Kubernetes 用户功能特征做出修改的情况下是不可能修复该漏洞的。因此,建议限制对这些有漏洞的特征的访问来预防漏洞利用。委员会为External IP的使用提供了2个解决方案:定制的Admission Controller 和OPA Gatekeeper 限制。但是对Load Balancer IP 目前还没有解决方案。
总结
CVE-2020-8554是Kubernetes 服务中的一个设计漏洞。如果集群是多租户的,那么非特权用户也可以创建和更新服务。虽然漏洞目前还没有修复,Kubernetes产品安全委员会也给出了有效的缓解措施。
本文翻译自:https://unit42.paloaltonetworks.com/cve-2020-8554/