freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2020-8554:Kubernetes的中间人漏洞
2020-12-23 11:30:42

漏洞概述

2020年12月4日,Kubernetes产品安全委员会披露了一个新的Kubernetes漏洞,即CVE-2020-8554。这是一个中危漏洞,所有的Kubernetes版本都会受到该漏洞的影响。该漏洞允许Kubernetes服务将集群流量拦截至任意IP地址,任何可以管理服务的用户可以利用此漏洞对群集中的Pod和节点执行中间人(MITM)攻击。

攻击者可以利用MITM攻击伪装成内部或外部节点,然后从网络流量中获取凭证,在将目标用户的数据发送到其预期目标之前篡改目标用户的数据,或完全阻止其与特定IP地址通信。不过,如果使用了TLS址类的加密协议的话,攻击者就没那么轻松了。

多用户集群受该漏洞的影响较大,因为它们最有可能拥有可以管理服务的非管理员用户。

Kubernetes产品安全委员会确定,修补CVE-2020-8554将导致Kubernetes的多个功能发生变化,因此短期内没有解决该漏洞的方案。相反,委员会提供了几种限制方案,可以缓解该漏洞的影响。

漏洞分析

CVE-2020-8554源于Kubernetes服务的两个特性中的设计缺陷:外部IP和负载平衡器IP。Kubernetes服务是将运行在一组Pod上的应用程序公开为网络服务的抽象方法。一个服务会暴露在一个或多个IP地址上,一旦部署完成,集群中的节点将把发往服务IP的流量路由到组成服务的一个后备Pod中。

在集群管理和分配服务IP时,一切都正常。但是当Kubernetes用户能够为其服务分配任意IP时,问题就出现了。在这种情况下,恶意用户可以分配已被其他节点(内部或外部)使用的IP,并截获这些IP的所有群集流量。我们有两种方法可以控制服务的IP:

分配一个外部IP;

通过loadBalancer.ingress.ip字段来分配一个负载均衡器IP,这个方法要求patch service/status权限。

下面的服务在部署至集群时,将会把所有的集群DNS流量拦截至8.8.8.8这个IP地址(Google的DNS服务器),然后路由到evil-dns-server Pod中:

为了接收到拦截的流量,攻击者必须控制支持其恶意服务的节点。在大多数情况下,我们会选择一个Pod,不过服务也可以由外部节点(而不是集群Pod)托管,这意味着攻击者还可以将截获的流量路由到集群外部的一个外部节点。这要求攻击者创建指向外部地址的Kubernetes节点,这需要create endpoint权限。

CVE-2020-8554入侵标识符IoC

如果你发现了以下几种情况之一的话,说明你可能受到攻击了:

服务不应该暴露给外部IP或负载均衡器IP;

一个服务的外部IP或负载均衡器IP匹配集群中的一个外部IP地址,比如说一个Pod IP或其他服务的集群IP;

一个服务的外部IP或负载均衡器IP指向一个已知的外部域名,比如说8.8.8,我们可以执行nslookup <externalIP>来判断一个IP是否指向一个已知域名;

一个服务的负载均衡器IP为0.0.1,表明节点主机流量已被劫持;

如需识别集群中的服务是否暴露给了外部IP地址,可以运行下列命令:

kubectl get services –all-namespaces -o=jsonpath='{“NAMESPACE\tNAME\tEXTERNAL IPS\n”}{range .items[?(.spec.externalIPs)]}{.metadata.namespace}{“\t”}{.metadata.name}{“\t”}{.spec.externalIPs}{“\n”}{end}’ | column -t -s “$(printf ‘\t’)”

如需识别集群中的服务是否暴露给了负载均衡器IP地址,可以运行下列命令:

kubectl get services –all-namespaces -o=jsonpath='{“NAMESPACE\tNAME\tLOAD BALANCER IPs\n”}{range .items[?(.status.loadBalancer.ingress[*].ip)]}{.metadata.namespace}{“\t”}{.metadata.name}{“\t[“}{range .status.loadBalancer.ingress[*]}{“\””}{.ip}{“\”,”}{end}{“]\n”}{end}’ | sed ‘s/\(.*\),/\1/’ |column -t -s “$(printf ‘\t’)”

Prisma Cloud Compute缓解方案

Prisma Cloud Compute针对Rego规则内置的Admission支持,可以用于实现Kubernetes产品安全委员会提出的缓解方案。

限制外部IP访问

客户可以使用以下方法设置许可规则,以阻止服务访问外部IP,客户害可以通过设置白名单来选择允许的IP地址。

按照Prisma Cloud Compute的【文档】在你的集群中启用Admission Control。

下载【Mitigation for Kubernetes CVE-2020-8554 – External IPs】规则模板,我们可以使用下列命令下载规则:

wget https://raw.githubusercontent.com/twistlock/k8s-cve-2020-8554-mitigations/main/PrismaExternalIPs.json

进入到‘Defend/Access/Admission’并点击‘Import’,然后选择已下载好的规则模板,并点击‘Add’按钮:

要将某些IP作为外部IP使用,请按照下图所示更新规则,以下规则白名单IP为54.74.83:

规则设置好之后,任何尝试将服务暴露给已禁止的外部IP的行为都将失败,并且还会触发警报。

总结

CVE-2020-8554是一个独特的漏洞,源于Kubernetes服务的设计缺陷。如果您的集群是多用户集群,或者允许未经授权的用户创建和更新服务,那么您将有可能受到该漏洞的影响。如果集群中的应用程序没有通过TLS强制加密通信,那么您将面临更大的风险。即使该漏洞未被修复,Kubernetes产品安全委员会提出的缓解措施也可以有效地防止此类攻击。

# 漏洞分析 # 漏洞利用 # Kubernetes
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
漏洞复现专栏
  • 0 文章数
  • 0 关注者
文章目录