近日Kubernetes社区披露了使用LoadBalancer或External IPs进行中间人攻击的漏洞,在一个多租集群中攻击者可以通过创建和更新Service实例状态等字段来劫持集群中来自其他Pod的流量。

目前CVE-2020-8554漏洞评级为中危漏洞,CVSS漏洞评分为3.0

影响范围

当前所有版本的Kubernetes集群均在该漏洞影响范围内,该漏洞源自Kubernetes设计上的安全缺陷,明确的修复计划将在issue 97110中给出。

对于ACK集群用户,如果您的集群运行在多租户场景下,或者集群中运行的应用可能来自非受信的用户所部署,此时您可以通过在apiserver审计日志中搜寻Service的status对象的patch事件来发现可疑事件。具体操作,请参见查看详细日志记录

漏洞描述

在多租集群中,攻击者可以通过下面两种方式完成对指定Service的流量劫持。
  • 创建ClusterIP类型的Service,并设置服务实例spec中的externalIP字段来指定劫持该IP内的流量。
  • 对于LoadBalancer类型的Service,攻击者可以通过设置Service实例中的spec.loadBalancerIP字段并且修改status.loadBalancer.ingress.ip达到流量劫持的目的。

防范措施

目前Kubernetes社区官方还没有提供针对该漏洞的修复方案,由于漏洞修复可能涉及原生模型较大的改动,预计在官方正式修复版本发布前还需一段较长的时间。建议您优先采用以下方案防范攻击:
  • 对于external IPs的使用建议如下:
    • 通过admission webhook的准入校验方式限制external IPs的使用,详情请参见Kubernetes官方给出的externalip-webhook源码和部署说明。
    • 通过OPA Gatekeeper来限制external IPs的使用范围,具体操作,请参见组件介绍。ConstraintTemplate和Constraint的示例模板请参考externalip
  • 对于LoadBalancer类型的IP使用建议如下:
    • 尽可能收敛对Service的status对象的patch权限。
    • 可采用上述external IPs的使用建议,通过admission webhook或OPA Gatekeeper的方式来限制对LoadBalancer IP的使用。