研究人员在Kubernetes的kube-proxy中发现了一个安全漏洞——CVE-2020-8558。
kube-proxy是Kubernetes上每个节点上运行的网络代理。其任务是管理pod和服务的链接。Kubernetes服务会暴露单个clusterIP,也可能含有多个pod来进行负载均衡。每个服务可能含有3个pod,每个pod都有自己的IP地址,但只暴露一个clusterIP。访问该服务的pod会发送包到单个clusterIP,然后重定向到服务背后的pod。kube-proxy会为每个节点设置路由表,所以请求目标服务会被正确地路由到其中一个pod。
在kube-proxy中,集群中的每个节点都启用了route_localnet
。节点的本地网络中的每个节点都可以访问节点的内部服务。每个无需认证就可以运行内部服务的节点都可能受到影响。除了节点的本地网络的邻居主机,节点上运行的pod就可以访问内部服务。
也就是说,pod只能访问节点的内部服务。为发起攻击,pod必须拥有处理CAP_NET_RAW
的能力。然而Kubernetes默认会授权这种能力。
研究人员分析发现,Kubenetes API服务器可以通过insecure-port
来处理localhost的非认证请求。不安全端口的存在允许其他运行在master上的控制面板组件与api 服务器进行会话。基于角色的访问控制和其他授权机制并未在该端口上强制实现。Kuber netes安装会经常在master节点运行api 服务器,意味着运行了启用了route_localnet
的kube-proxy。
如果 Kubernetes 不禁用insecure-port,master节点的host所在的本地网络就可以利用CVE-2020-8558来与api服务器通信,并获取集群的完全控制权限。
最初发布的补丁在kubelet的route_localnet
上做了修改,route_localnet
是引发节点丢弃到127.0.0.1
的包的节点。截止目前,route_localnet
在kube-proxy 中仍然是启用的。
在那些应用了补丁的情况下,仍然存在本地网络攻击者可以发送包到节点的内部UDP服务的情况。但攻击者只存在于受害者节点禁用了逆向路径过滤的情况,但这种情况下攻击者无法得到响应。
如果同时满足以下条件,那么该集群可能会受到CVE-2020-8558 漏洞的影响:
集群运行着有漏洞的版本,即版本号低于v1.18.4、v1.17.7、v1.16.11;
节点上运行着kube-proxy;
节点运行着无需进一步认证的localhost-only
服务;
此外,如果满足以下条件,那么攻击者通过api服务器insecure-port
可以完全接管服务器:
集群没有通过–insecure-port=0
禁用api服务器;
节点上的api服务器还运行着kube-proxy;
节点可以被本地网络中的恶意节点或节点上运行的含有CAP_NET_RAW
的恶意pod攻击。
CVE-2020-8558漏洞可能会引发很严重的后果,研究人员建议用户尽快更新补丁。CVE-2020-8558漏洞给我们一个启示:安全最佳实践确实可以减少攻击面。此外,还应禁用api服务器insecure-port。
https://unit42.paloaltonetworks.com/cve-2020-8558/
本文作者:ang010ela
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/136873.html