一、破绽简介

2020年12月8日,Kubernetes平安通告中披露了一个中间人挟制破绽CVE-2020-8554。若是攻击者在Kubernetes集群中具有建立和更新Service和Pod工具权限,那么通过设置LoadBalancer或ExternalIP,攻击者能够挟制集群内其他Pod或者节点接见该ExternalIP的流量,并将其转发到攻击者建立的恶意Pod中,造成中间人攻击。

该破绽影响Kubernetes所有版本,是设计上的缺陷,现在没有针对该破绽的补丁更新。

二、Kubernetes基本架构

Kubernetes是一套容器集群治理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功效。由Google公司在2014年启动,最初源于Google内部的Borg。Kubernetes 拥有自动缩放、健康检查、服务发现、负载平衡、转动更新、存储编排等等特征,为治理种种基础架构中相关分布式组件和服务提供了异常高效的解决方案。整体架构如下图所示:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第1张

 Kubernetes架构中涉及到的一些观点:

1) Master:卖力整个集群的治理控制,用于监控、编排、调剂集群中的各个事情节点。开发维护职员通过接见API Server,实现对kubernetes集群中种种资源的增添、删除、修改、查询等操作。Master节点通常会占有一个自力的服务器,基于高可用缘故原由,也可能占有多台。

2) Node:是Kubernetes集群中的各个事情节点,可以是物理机也可以是虚拟机,由Master治理,提供运行容器所需的种种环境,对容器举行现实的控制。一个Kubernetes集群中可以有多个Node节点,可以不断地将新Node节点加入到Kubernetes集群中。

3) Pod:Kubernetes治理的基本工具是pod,而不是容器。一个pod由一个或者多个关系密切的容器组成,它们共享环境、存储、 *** 空间,有着相同的生命周期,一起作为一个整体编排到Node节点上。

4) Service:Kubernetes中pod是有生命周期的,可以被建立,也可以被销毁。每个Pod都有一个动态分配的IP地址,在一个Pod被销毁后,生命就永远竣事,基于相同设置建立出来的新的Pod,它的IP地址是不一样的。为领会决IP地址不牢固,为了能让前端应用找到对应的后端Pod,Kubernetes界说了一种名为Service的抽象。Pod可以赋予一个标签,通过标签选择器对Pod举行逻辑分组,并界说了分组接见计谋。前端应用不需要体贴后端Pod是否转变,只需要接见Service即可。一个service可以包罗一个或多个pod。

三、Kubernetes service

3.1 Kubernetes中差别种类的IP地址

1) Node的IP地址:节点物理网卡的IP地址,是一个真实存在的物理 *** 。所有属于这个 *** 的服务器都能通过这个 *** 直接通讯,即便有些服务器没有加入Kubernetes集群中。这也说明,在Kubernetes集群之外的节点接见Kubernetes集群之内的某个节点或者TCP/IP服务时,都必须通过Node IP通讯。

2) Pod的IP地址:Docker 运行时凭据docker0网桥的IP地址段举行分配,通常是一个虚拟的二层 *** 。Kubernetes中差别Pod中的容器就是通过这个虚拟的二层 *** 举行通讯,真实的TCP/IP流量则是通过Node IP所在的物理网卡通报出去。

3) Service的IP地址:也即Cluster IP,是一种虚拟的IP,由Kubernetes治理,从Cluster IP地址池中分配,仅仅作用于Kubernetes Service这个工具。它无法被Ping通,由于没有一个“实体 *** 工具”来响应,只能连系Service Port组成一个详细的通讯端口,在集群内部接见。Cluster IP属于Kubernetes集群内部的地址,不具备TCP/IP通讯的基础,无法在集群外部直接使用这个地址。

以下图为例:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第2张

192.168.100.0/24网段中,有5台服务器:

Master 192.168.100.100

Node① 192.168.100.101

Node② 192.168.100.102

Node③ 192.168.100.103

ServerN 192.168.100.104

其中192.168.100.100、192.168.100.101、192.168.100.102、192.168.100.103组成了一个Kubernetes集群,然则ServerN 192.168.100.104没有加入到集群中。即便云云,ServerN也可以和Kubernetes集群中的192.168.100.100、192.168.100.101、192.168.100.102、192.168.100.103相互通讯,由于它们属于同一个网段。

在集群外部的ServerN 192.168.100.104,无法接见集群内部的service 10.96.0.1、也无法接见pod② 10.244.1.7、pod③ 10.244.2.4

3.2  iptables

service的IP地址是一种虚拟的IP,系统中没有 *** 设备绑定这个IP地址,Kubernetes行使了iptables来做针对service的路由和负载平衡。

通常所说的iptables,现实上是由netfilter(内核模式)和iptables(用户模式)两部分组成。netfilter是linux内核2.4中引入的一个子系统,在linux *** 协议栈中增添了一组回调函数挂载点,通过这些挂接点挂接的钩子函数,可以在Linux *** 栈处置数据包的过程中,依据指定的处置规则集,对数据包举行过滤、修改、抛弃等操作;iptables是在用户模式下运行的历程,卖力插入、修改和删除数据包过滤表中的规则。二者互相配合来实现整个Linux *** 协议栈中天真的数据包处置机制。

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第3张

如上图所示,netfilter在 *** 协议栈内加了5个挂载点,对应iptables的5条内置链,凭据现实情况的差别,数据报文经由的链可能差别:

1. PREROUTING:做源地址转换;

2. INPUT:处置输入内陆历程的数据包;

3. FORWARD:处置转发到其他机械、network namespace 的数据包;

4. OUTPUT:处置内陆历程的输出数据包;

5. POSTROUTING:做目的地址转换。

在每条链上,都放置了一连串的规则,每个经由这条链的数据报文,都要将这"链上的所有规则匹配一遍,若是有相符条件的规则,则执行规则对应的动作:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第4张

链上的规则有些很相似,例如一些规则用于过滤IP或者端口,一些规则用于修改报文,这时,可以把具有相同功效的规则放在一起,组成一个聚集,叫做“表”。差别功效的规则,放置在差别的表中举行治理。在iptables中,按优先级从高到低,有如下5种表:

1. raw表:用于去除iptables对数据包的毗邻追踪机制;

2. mangle表:修改数据包的IP 头信息;

3. nat表:修改数据包的源地址或者目的地址;;

4. filter表:控制到达某条链上的数据包是继续放行、直接抛弃、拒绝;

5. security表:用于在数据包上应用SELinux,不常用。

并不是每一条链都能挂上所有的表,以PREROUTING为例,它只能挂raw、mangle、nat三个表:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第5张

其他链能挂的表可以加入本节内容第一张图。

3.3 Kubernetes中service的对外公布方式

从上文形貌中我们可以知道:Service的Cluster IP属于Kubernetes集群内部的地址,无法在集群外部接见。但在现实营业系统中,一定有服务需要提供给Kubernetes集群外部的应用或者用户使用,为领会决这个问题,有如下几种对外公布的方式:

3.3.1 odePort

在service的界说中,指定一个端口号,然后Kubernetes会在集群里的每个Node上都开启一个对应的监听端口,集群外部应用或者用户只要接见随便一个Node的IP地址:端口号,就可以接见这个service。 这个端口号是在主机的 *** 空间中分配出来的(而不是Kubernetes建立的种种虚拟 *** 空间中),这样才气被集群外部主机接见。

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第6张

如上图所示,在Kubernetes集群内部的Node上,可以直接通过IP地址10.96.0.1接见service。该service启用NodePort公布之后,在Node①节点上开启了12345端口,在Kubernetes集群外部的ServerN 192.168.100.104现在可以通过192.168.100.101:12345来接见该service了。

3.3.2 LoadBalancer

NodePort可以让服务被集群外部的主机接见,更进一步,若是想让service能在互联网上被接见,可以接纳LoadBalancer的公布方式。

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第7张

LoadBalancer自力于Kubernetes集群之外,连通了外部 *** 和内部 *** ,可以接纳硬件或软件的方式实现,例如Nginx。它的公网IP由Kubernetes集群所在的云服务商提供,Kubernetes集群内部service在建立时,需要在status.loadBalancer中指定这个IP地址。

外部用户接见LoadBalancer的公网IP地址,然后再由LoadBalancer凭据指定规则,转发到内部 *** 的Kubernetes集群中的各个节点上,再通过Node的IP地址:端口号,接见到详细的service。通过这种方式,内部 *** 之外的用户就可以接见到集群内部的service了。

3.3.3   ExternalIP

若是有一个IP地址,通过它能够路由到Kubernetes集群中一个或者多个Node上,那么service就可以借助这个IP地址公布出去。

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第8张

在设置service时,通过externalIPs属性指定详细的IP地址,集群外部用户只要接见这个IP地址:端口,流量再路由进集群一个或者多个Node上,即可接见到集群内部的service了。固然,治理员需要在这个IP地址上做响应的路由设置。

NodePort、LoadBalancer是两种差别类型的service,通过spec.type属性指定。External IP只是一种属性,可以在随便类型的service中通过spec.externalIPs指定。可以说NodePort是基础,外部流量无论是通过LoadBalancer照样ExternalIP方式,进入到集群之后,都得继续依赖NodePort来转发给详细的service。

四、破绽剖析

4.1 破绽缘故原由

上文所述LoadBalancer、ExternalIP,两者的一个共同点是:需要指定一个IP地址,流量从这个IP地址流入到Kubernetes集群中。在Kubernetes的设计者看来,这个IP地址是在Kubernetes集群外面的,它不在Kubernetes集群的治理局限内,而是应该依赖集群的治理员、租户来保证IP地址的正当、有效性,以是没有对这个IP地址做任何判断。由此引发了本文所述的CVE-2020-8554 kubernetes中间人挟制破绽。

4.2  搭建剖析环境

在领会Kubernetes基本架构、iptables规则后,现在可以来剖析CVE-2020-8554 kubernetes中间人挟制破绽底层缘故原由了。

搭建了4台主机,均接纳CentOS 7,Kubernetes 1.20.0:

k8 *** aster   192.168.100.100

k8snode1    192.168.100.101

k8snode2    192.168.100.102

k8snode3    192.168.100.103

接纳python:3.7镜像建立一个pod,标签设为test: testpodlabel,namespace默认是default:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第9张

建立一个类型为NodePort的service:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第10张

查看pod的建立效果:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第11张

从效果中可以看到,Kubernetes在k8snode1节点上建立了一个pod,这个pod的IP地址是10.244.1.17

继续查看service的建立效果:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第12张

这里有两个service,一个是kubernetes,这个是系统默认建立的;另外一个是我们建立的testservice,它的Cluster IP是10.102.24.38,接见端口是80,映射在主机上的端口是30001。

在k8snode3上接见一下以上pod、service、k8snode1三个IP地址:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第13张

可以看到这三种IP地址接见获得的内容都是一样的,这也说明,kubernetes集群中建立的pod、service,在Kubernetes集群的每个节点上都能顺遂接见到。

此时,若是接见一下k8snode1节点的80端口:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第14张

默认情况下没有web服务在k8snode1节点上监听80端口,以是此时curl接见效果是拒绝毗邻。

4.3  Kubernetes中service的iptables规则

Kubernetes扩充了iptables默认的5条链,自界说了KUBE-SERVICES,KUBE-NODEPORTS,KUBE-POSTROUTING,KUBE-MARK-MASQ和KUBE-MARK-DROP等五个链。接见service的虚拟IP,主要是通过 KUBE-SERVICES链来实现。在k8snode1节点上运行iptables -L -v -n -t nat,可以查看系统中nat表的所有规则,规则有点多,一步步剖析。

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第15张

,

欧博官网_ALLbet6.com

欢迎进入欧博官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe *** 、Allbet电脑客户端、Allbet手机版下载等业务。

,

从中可以看到,KUBE-SERVICES链附加在系统默认的PREROUTING和OUTPUT链上,所有到达系统的流量、历程即将发出的流量,都将经由KUBE-SERVICES链:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第16张

/*和*/之间,是Kubernetes在添加规则时加上的注释,从这些注释内里,我们可以找到建立的default/testservice有两行规则:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第17张

KUBE-MARK-MASQ所在的这条规则暂时不用管,来看下面的KUBE-SVC-ZVPUSHI6OBHNIBWB所在的这条规则,它示意:

若是知足条件:数据包协议是TCP,接见的是80端口,目的IP地址是10.102.24.38,泉源IP地址随便是什么,那么就跳到KUBE-SVC-ZVPUSHI6OBHNIBWB链上去。

继续剖析KUBE-SVC-ZVPUSHI6OBHNIBWB这条链:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第18张

泉源、目的IP地址都是0.0.0.0,prot示意的协议也是all,这意味着只要数据包进入到这条链中,立马无条件跳到KUBE-SEP-URHUM5XIMG7YZIEJ链中去,继续跟踪剖析:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第19张

看第二条规则,这里对TCP协议做了DNAT(目的地址转换),原来的接见service时的目的地址是10.102.24.38,现在转换到了10.244.1.17去了。而10.244.1.17这个IP地址,就是我们建立的pod的IP地址。

从以上剖析中可以看到,当接见service的cluster IP地址时,经由iptables一系列链和规则的匹配、处置,最终做了DNAT,跳转到service对应的pod的IP地址去了。

以上规则是在k8snode1上的,不外从上一节在k8snode3上接见pod、service、k8snode1三个IP地址的效果来看,这也意味着,在Kubernetes集群的master、node所有节点上,都存在着同样的iptables规则,以便在Kubernetes集群的每个节点上都能顺遂接见到service。事实上也是云云,可以在每个master、node所有节点上都运行一遍iptables -L -v -n -t nat,一步步查找default/testservice的最终跳转。

4.4  ExternalIP

以上建立的pod、service都是在default namespace下,现在建立一个新的名为cve-2020-8554的namespace:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第20张

在cve-2020-8554 namespace下,建立一个挟制用的pod:

 电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第21张

再建立一个service,指定externalIPs为k8snode1的IP地址192.168.100.101:

 电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第22张

查看一下建立效果:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第23张 

cve-2020-8554-pod的IP地址为10.244.2.10,cve-2020-8554-service的cluster IP地址为10.109.130.73。继续在k8snode3上接见一下这几个IP地址:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第24张

效果是相符预期的。现在再接见一下192.168.100.101:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第25张

这个效果就不一样了。在上文的“4.2. 搭建剖析环境”中,由于没有web服务在k8snode1节点上监听80端口,以是curl接见效果是拒绝毗邻,但现在却可以顺遂接见。这意味着192.168.100.101:80被挟制了!

在添加了externalIPs后,每个节点的KUBE-SERVICES中新添加了如下的iptables规则:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第26张

KUBE-MARK-MASQ继续不管,剖析下面的两条规则的匹配条件:

规则1:目的IP地址是192.168.100.101,接见端口是80,数据包不是从网桥上来的,泉源IP地址不是内陆 *** 设备绑定的IP地址

规则2:目的IP地址是192.168.100.101,接见端口是80,目的IP地址是内陆 *** 设备绑定的IP地址

在k8snode3上接见192.168.100.101:80,数据包是从内陆网卡上发出的,泉源IP地址固然是内陆的,以是不匹配规则1;目的地址是192.168.100.101,它不是内陆的IP地址,以是不匹配规则2。于是数据包经由网卡发出给了192.168.100.101

数据包到达k8snode1(192.168.100.101)时,端口是80,是从k8snode3(192.168.100.103)来的,不是内陆的,于是匹配中了规则1,于是跳转到了KUBE-SVC-SC7RWRXUJPVQFBIC链中:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第27张

根据上文“4.3.Kubernetes中service的iptables规则”中的剖析,最终会做DNAT,接见到cve-2020-8554-pod的IP 地址10.244.2.10。也就是说,在Kubernetes集群中接见192.168.100.101:80,都将被挟制到10.244.2.10:80。

若是指定externalIPs为Kubernetes集群外部的IP地址,例如百度的IP地址14.215.177.38,在KUBE-SERVICES链的上述两条规则中,只是改变了destination,从192.168.100.101酿成14.215.177.38,其他的匹配条件稳固。在k8snode3上接见14.215.177.38:80,数据包是从内陆网卡上发出的,泉源IP地址固然是内陆的,以是不匹配规则1;目的地址是192.168.100.101,它不是内陆的IP地址,以是不匹配规则2。于是数据包经由网卡发出给了14.215.177.38。以是这时并不会挟制14.215.177.38的接见,仍然接见到了真正的内容。

4.5  LoadBalancer

建立一个LoadBalancer类型的service,loadBalancerIP指定为想要挟制的IP地址:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第28张

查看建立效果:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第29张

可以看到EXTERNAL-IP显示的是pending,说明这个service还没有完全建立乐成,必须要手动修改service的状态:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第30张

之后查看建立效果:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第31张

现在EXTERNAL-IP显示的是需要挟制的IP地址了,继续在k8snode1(192.168.100.101)上剖析iptables规则。KUBE-SERVICES中新添加了如下的iptables规则:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第32张

这条规则异常简朴,没有其他的匹配条件,只要接见14.215.177.38而且端口是80,将跳转到KUBE-FW-SFLNKK2MY3Y4V7NO链。根据上文的剖析,一步步追踪这条链:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第33张

进一步无条件地跳转到KUBE-SVC-SFLNKK2MY3Y4V7NO这条链:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第34张

再无条件地跳转到KUBE-SEP-VZTFGMFKC7VACONL这条链:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第35张

这里最终做了DNAT,转换到接见cve-2020-8554-pod的IP地址10.244.2.10上去了。

这些规则会在Kubernetes集群每个节点上天生并执行,以是这里实现了对整个Kubernetes集群接见14.215.177.38的挟制:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第36张

4.6  IPVS模式

随着Kubernetes集群规模的增进,资源的可扩展性变得越来越主要,特别是对于那些运行大型事情负载的企业,其服务的可扩展性尤其主要。iptables是为防火墙而设计的,底层路由表的实现是链表,对路由规则的增添、删除、修改、查询等操作都涉及遍历一次链表。在集群规模扩大时,随着服务的增多,pod的增多,将使得内核异常频仍地处置iptables规则的刷新,将带来严重的性能问题。为解决iptables的性能问题,Kubernetes引入了IPVS模式,在1.11版本中到达稳固。

IPVS仍然会依赖iptables规则,在开启IPVS模式后,以“4.4. ExternalIP”中所述设置,重新建立一个service,指定externalIPs为14.215.177.38,在k8snode1(192.168.100.101)上查看iptables规则,KUBE-SERVICES链仍然存在,如下所示:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第37张

和之前形貌的已经不一样了,KUBE-SERVICES链中不再有单独的service的跳转规则,和externalIP相关的,是如下两条规则:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第38张

规则1:目的IP地址和端口匹配KUBE-EXTERNAL-IP聚集,数据包不是从网桥上来的,泉源IP地址不是内陆 *** 设备绑定的IP地址

规则2:目的IP地址和端口匹配KUBE-EXTERNAL-IP聚集,目的IP地址是内陆 *** 设备绑定的IP地址

可以看到,之前的规则是匹配指定的一条IP地址,现在IPVS模式下是匹配一个聚集,需要处置的IP地址放到这个聚集中。这样可以大大地削减iptables规则,优化性能。

通过ipset下令,可以查看KUBE-EXTERNAL-IP聚集内容:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第39张

当在k8snode1(192.168.100.101)中接见14.215.177.38:80时,是匹配中KUBE-EXTERNAL-IP聚集的,数据包是从内陆网卡上发出的,泉源IP地址固然是内陆的,以是不匹配规则1。

对于规则2的匹配,这里就涉及到IPVS一个有意思的点了。启用IPVS后,系统中建立了建立了dummy0、kube-ipvs0两块虚拟网卡:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第40张

再看一下Kubernetes集群中建立的所有service:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第41张

对比可以看到,所有service的cluster IP地址都绑定到了kube-ipvs0这块网卡上,我们做挟制用的cve-2020-8554-service的External IP 14.215.177.38也在这块网卡上。

因此在匹配规则2时,虽然接见的真实的目的IP地址14.215.177.38在遥远的百度服务器上,但由于kube-ipvs0绑定了这个IP地址,以是它现在酿成了一个内陆的IP地址了,造成的效果是,接见14.215.177.38:80时匹配中了规则2,接下理由以下IPVS规则:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第42张

接见14.215.177.38:80转换到接见cve-2020-8554-pod的IP地址10.244.2.10上去了。

这里实现了对整个Kubernetes集群接见14.215.177.38的挟制:

电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析 资讯 第43张

对比可以看到,在IPVS模式下,挟制情形更为严重。

4.7  破绽小结

1. iptables模式下,接纳ExternalIP无法挟制集群外部IP,但LoadBalancer可以;

2. ipvs模式下,两者都可以挟制集群外部IP;

3. 从上文剖析中可以看到,在Linux内核中执行种种规则的匹配、链的跳转,是没有Kubernetes中namespace观点的,以是这种挟制是跨namespace的,一个恶意用户的挟制,能影响集群中其他所有的用户。

4. iptables规则遍布Kubernetes集群所有的master、node节点,以是挟制效果也遍布所有的master、node节点。

5. 事实上,不仅可以挟制TCP流量,甚至可以挟制UDP流量,因此可以行使该破绽实现对集群内部DNS的挟制,由此发生更严重的行使效果。

五、防御建议

1. 正如前文所述, LoadBalancer、ExternalIP这两者情况下指定的IP地址,Kubernetes自己无法确保它的正当性,而是应该依赖集群的治理员来划分正当局限,因此Kubernetes官方引入了一个新项目:https://github.com/kubernetes-sigs/externalip-webhook,用于提供给治理员,限制正当的ExternalIP局限。在正当局限外的IP地址,克制service的建立。

2. LoadBalancer需要patch service的status,设置LoadBalancer的外部IP地址。集群治理员可以克制租户的patch权限,即可解决LoadBalancer这个问题。

3. 建议连续关注官方对该破绽的处置讨论:https://github.com/kubernetes/kubernetes/issues/97110

六、参考链接

[Security Advisory] CVE-2020-8554: Man in the middle using LoadBalancer or ExternalIPs

https://groups.google.com/g/kubernetes-security-announce/c/iZWsF9nbKE8

Allbet声明:该文看法仅代表作者自己,与www.allbetgame.us无关。转载请注明:电银付app使用教程(dianyinzhifu.com):CVE-2020-8554 kubernetes中间人挟制破绽剖析
发布评论

分享到:

尼泊尔东部疆域年内将增设9个武警边防哨所
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。