在kube-proxy
中发现了一个安全漏洞,它允许相邻的主机(运行在同一局域网或第2层域的主机)访问绑定在127.0.0.1的节点上的TCP和UDP服务。例如,如果集群管理员运行监听了127.0.0.1:1234
的TCP服务,由于这个bug,该服务将有可能被与该节点在同一局域网中的其他主机,或与该服务运行在同一节点上的容器所访问。如果端口1234上的服务不需要额外的认证(因为假设只有其他localhost进程可以),那么很容易受到利用此bug进行攻击。
Kubernetes API Server的默认不安全端口,侦听的是127.0.0.1:8080
,它允许未经身份验证的请求。许多Kubernetes安装程序明确地禁用了API服务器的不安全端口,但在没有禁用该端口的集群中,攻击者能够访问同一局域网上的另一个系统或控制在master上运行的容器来操作Kubernetes API,并在集群上执行任意API请求。该端口已被废弃,并将在 Kubernetes v1.20
中删除。
该漏洞评级中
(CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N),编号CVE-2020-8558
.
注意,在未禁用Kubernetes API Server不安全端口的集群中,此漏洞评分[高]
。
如何判断你的集群是否有风险?
如果出现以下情况,会很受到攻击:
你运行的是一个有漏洞的版本(见文)
你的集群节点运行在一个环境中,在这个环境中,未受信的主机与节点共享同一个2层域(即同一个LAN)。
你的集群允许不受信任的pods用
CAP_NET_RAW
运行容器(Kubernetes默认是允许这个功能)。你的节点(或主机网络Pod)运行的服务不需要身份验证(仅仅只限制了本地访问)。可以在节点上运行以下命令列出可能受影响的服务:
lsof +c 15 -P -n -i4TCP@127.0.0.1 -sTCP:LISTEN
lsof +c 15 -P -n -i4UDP@127.0.0.1
在master节点上,像下面的
lsof
表示,Kubernetes API Server正在使用不安全的端口进行监听。COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME kube-apiserver 123 root 7u IPv4 26799 0t0 TCP 127.0.0.1:8080 (LISTEN)
受影响的版本
- kube-proxy v1.18.0-1.18.3
- kube-proxy v1.17.0-1.17.6
- kube-proxy <1.16.10
如何临时解决这个漏洞?
在升级之前,可以通过在节点上手动添加一个iptables规则
来临时解决这个漏洞。此规则将拒绝不来自于节点的127.0.0.1的流量。
iptables -I INPUT --dst 127.0.0.0/8 ! --src 127.0.0.0/8 \
-m conntrack ! --ctstate RELATED,ESTABLISHED,DNAT -j DROP
另外,如果你的集群还没有禁用API服务器的不安全端口,我们强烈建议你禁用它。在你的kubernetes API Server
命令行中添加:--insecure-port=0
。
检测
线路上的IPv4目标在127.0.0.0/8
范围内并且节点的第2层目标MAC地址上的数据包可能表明攻击者正在针对此漏洞。
已修复的版本
- kube-proxy v1.19.0+ (not yet released)
- kube-proxy v1.18.4+
- kube-proxy v1.17.7+
- kube-proxy v1.16.11+
要升级,请参考:https://kubernetes.io/docs/tasks/administer-cluster/cluster-management/#upgrading-a-cluster
更多的细节可参考:https://github.com/kubernetes/kubernetes/issues/92315