Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅谈云上攻防——CVE-2020-8562漏洞为k8s带来的安全挑战

浅谈云上攻防——CVE-2020-8562漏洞为k8s带来的安全挑战

作者头像
云鼎实验室
发布于 2021-10-26 03:40:18
发布于 2021-10-26 03:40:18
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

前言

2021年4月,Kubernetes社区披露了一个编号为CVE-2020-8562的安全漏洞,授权用户可以通过此漏洞访问 Kubernetes 控制组件上的私有网络。

通过查阅此漏洞披露报告可发现,这个漏洞拥有较低的CVSS v3评分,其分值仅有2.2分,与以往披露的Kubernetes高危漏洞相比,这个拥有较低评分的漏洞极其容易被安全研究人员以及运维人员所忽视。但经过研发测试发现,在实际情况中,这个低风险的漏洞却拥有着不同于其风险等级的威胁:在与云上业务结合后,CVE-2020-8562漏洞将会为云厂商带来不可忽视的安全挑战。

在这篇文章中,云鼎实验室将为大家带来业内首个CVE-2020-8562漏洞分析报告,一同来看一下这个被忽视的低风险漏洞引发的“血案”。

CVE-2020-8555漏洞简述

Kubernetes为了缓解CVE-2020-8555等历史漏洞带来的安全问题,对APIServer Proxy请求进行域名解析以校验请求的IP地址是否处于本地链路 (169.254.0.0/16) 或 localhost (127.0.0.0/8) 范围内,Kubernetes通过此方式禁止由用户触发的对Services,Pods,Nodes,StorageClass对象的内网Proxy访问权限。

但是在完成校验并通过校验之后,Kubernetes立即进行第二次域名解析,此次域名解析后并不再进行IP地址的校验,这将导致上述校验存在绕过问题,如果一个DNS服务器不断返回不同的非缓存解析请求,攻击者可以利用此方式绕过Kubernetes的API Server Proxy IP地址限制,并访问内网ControlPlane管控组件。

详细的漏洞细节可参见如下图Issue所示:

图 1 CVE-2020-8562漏洞细节

Issue地址如下:

https://github.com/kubernetes/kubernetes/issues/101493

在正式开始介绍这个漏洞是如何对Kubernetes集群带来危害之前,我们先来看看这个漏洞中应用到主要攻击技巧:DNS重绑定攻击(DNS Rebinding)。

DNS重绑定攻击

DNS重绑定攻击技术的实现主要依赖于攻击者可将其自建的DNS服务器中DNS TTL配置为设置为0或者极小值。DNS TTL表示DNS记录的生存时间,数值越小, DNS记录在DNS服务器上缓冲的时间越小。

在攻击者将DNS TTL数值设置为一个极小值时,当受害目标第一次访问恶意域名时并发起域名解析请求时,恶意DNS服务器会返回一个ip地址A;当受害目标第二次发起域名解析请求时,却会得到ip地址B的解析结果。具体的原理,我们可以通过一道CTF题目,深入了解一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$dst = @$_GET['KR'];
$res = @parse_url($dst);
$ip = @dns_get_record($res['host'], DNS_A)[0]['ip'];
...
$dev_ip = "54.87.54.87";
if($ip === $dev_ip) {
    $content = file_get_contents($dst);
    echo $content;
}

这道CTF题目需要参赛者访问内网127.0.0.1地址并获取存储于其中的Flag。

从代码中可见,题目将会判断参赛者传入的域名解析后的ip,并仅允许访问54.87.54.87地址的内容。

如何绕过题目中的条件语句,利用到的就是DNS重绑定攻击技术。

从上文代码段可见,程序通过以下代码来执行第一次DNS解析以获取ip:

$ip = @dns_get_record($res['host'], DNS_A)[0]['ip'];

假设此时参赛者传入的域名为www.a.com,将会进行如下的解析:

图 2首次DNS解析流程

此时www.a.com域名解析出来的ip为54.87.54.87。

程序继续往下执行,执行到了如下代码块:

$dev_ip = "54.87.54.87";

if($ip === $dev_ip){}

此时ip参数为54.87.54.87,满足条件分支判断,程序执行进入if条件分支。

随后,程序执行到如下语句:

$content = file_get_contents($dst);

注意,此时file_get_contents方法内的参数为参赛者控制的域名dst,而非ip地址。

也就是说,程序执行file_get_contents方法时,需要获取此域名的ip地址解析。由于攻击者将DNS TTL设置的数值极其小,从程序第一次获取ip到执行file_get_contents方法处时,DNS缓存早已失效,CTF服务器此时需要重新发起域名解析请求以获取www.a.com的ip,此时参赛者修改DNS解析结果以完成DNS重绑定攻击,见下图:

图 3重绑定DNS解析

此时获取到的解析ip值为127.0.0.1,参赛者通过此方式绕过限制并访问127.0.0.1资源,实现重绑定攻击。

KuBernetes中DNS重绑定攻击的应用

Kubernetes为了防止用户对Services,Pods,Nodes,StorageClass对象的内网Proxy进行非法访问,采用了域名解析的方式解析并校验Proxy请求的IP地址是否位于本地链路 (169.254.0.0/16) 或 localhost (127.0.0.0/8) 范围内。

Kubernetes通过此方式防止恶意内网资源的Proxy访问行为,但是Kubernetes在校验通过之后,会进行第二次域名解析,获取IP地址访问而不再进行IP地址的校验。

联想到上一章节的DNS重绑定攻击方式:攻击者可以控制DNS解析的IP地址,在第一次校验时返回一个合法值,随后在第二次获取IP地址时,返回一个本地链路或 localhost地址,详见下图:

图 4 Kubernetes中DNS重绑定流程

通过这个技术方式,攻击者可以绕过apiserver proxy的内网限制,构造恶意请求访问集群中的资源。

这种攻击技术将为云服务商带来了极大的安全问题:大多数云服务商提供Kubernetes托管版集群服务,采用此服务的用户Master节点将由云厂商创建并托管,如果攻击者通过方式访问到本地链路 (169.254.0.0/16) 或 localhost (127.0.0.0/8)地址,则有可能访问同为托管模式下其他用户的apiserver。

CVE-2020-8562漏洞原理

首先,使用云厂商提供的Kubernetes托管版集群服务创建一个集群。在此场景下,我们创建的集群的Master节点将与其他采用托管服务的用户一并,由云厂商创建并托管管理,这为后续的利用提供了先决条件。

图 5 Kubernetes托管版集群服务

在集群创建完毕后,通过编写如下yaml来创建一个名为cve-2020-8562的node,见下图:

图 6 使用yaml创建node

通过上图可见,在此yaml中,将只能在集群内进行路由的节点的IP地址InternalIP设置为攻击者可控的www.attacker.com。

创建完毕后,可以通过kubectl get nodes查看到此节点:

图 7 通过kubetctl查看cve-2020-8562节点

从上图红框处可以发现,此时我们创建的cve-2020-8562节点的状态为NotReady,但即使此时cve-2020-8562节点的状态为NotReady,也并不影响后续的利用流程。

使用如下命令启动Kubernetes API 服务器的代理:

kubectl proxy &

图 8 通过kebuectl开启代理

在成功启动Kubernetes API 服务器的代理之后,通过如下命令使用apiserver proxy来访问cve-2020-8562节点的apiserver:

图 9访问cve-2020-8562节点的apiserver

通过上文来看,cve-2020-8562节点处于NotReady,我们可以正常的访问其apiserver吗?

我们来看一下Kubernetes是如何完成接下来的访问:

首先,为了可以访问cve-2020-8562节点,Kubernetes首先需要获取cve-2020-8562节点的InternalIP,我们通过如下指令查看一下cve-2020-8562 的InternalIP:

图 10 查看cve-2020-8562节点详情

通过上图可知,cve-2020-8562节点的InternalIP值与生成此节点yaml中配置项一致,为我们配置的www.attacker.com。

由于InternalIP为域名而非IP地址,Kubernetes需要对其进行域名解析,随后校验获取到的IP地址是否位于本地链路 (169.254.0.0/16) 或 localhost (127.0.0.0/8) 范围内,如果获取到的IP属于此范围,则禁止访问。

在第一次DNS解析时,攻击者自建的DNS服务器将会返回一个合法的IP地址(非本地链路或 localhost范围),例如172.x.x.x,流程见下图:

图 11 第一次DNS解析

通过此方式,可以绕过k8s的本地链路/localhost范围IP校验。

在通过安全校验之后,K8s将会发起第二次域名解析。由于攻击者将DNS TTL设置的数值极其小,此时DNS缓存已失效,k8s需要重新发起域名解析请求以获取www.attacker.com的ip地址,流程见下图:

图 12 DNS重绑定攻击

从上图可见,此时攻击者可以将 www.attacker.com域名的IP解析为一个localhost范围内的IP地址并返回,在此例中,我们返回一个127.x.x.x地址。

此时,k8s apiserver proxy访问情况可以类比于下图情况:

图 13当前访问可抽象成此情况

如果127.x.x.x这个节点的apiserver 存在未授权访问情况,我们就可以通过此方式直接访问其apiserver,见下图:

图 14 攻击者访问托管服务中Master

通过此方式,可以访问其他使用Kubernetes托管集群服务的租户的apiserver。

总结

在安全研究以及运维中,一些低风险的集群漏洞极其容易被安全以及运维人员所忽略,但是这些漏洞在一些特定场景中仍为云上安全带来了极大的安全挑战,正如本文中所举例的CVE-2020-8562安全漏洞,这个仅有2.2评分的Kubernetes安全漏洞,在与实际业务结合后,仍可为业务带来极大的安全风险。因此与云上安全相关的漏洞,无论严重与否,都应得到安全人员以及运维人员的相应重视。

参考链接

https://github.com/kubernetes/kubernetes/issues/101493

https://zhuanlan.zhihu.com/p/89426041

https://cloud.tencent.com/developer/article/1400018

云上攻防往期推荐:

END

更多精彩内容点击下方扫码关注哦~

   云鼎实验室视频号

  一分钟走进趣味科技

     -扫码关注我们-

关注云鼎实验室,获取更多安全情报

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云鼎实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈云上攻防--SSRF漏洞带来的新威胁
前言 在《浅谈云上攻防——元数据服务带来的安全挑战》一文中,生动形象的为我们讲述了元数据服务所面临的一系列安全问题,而其中的问题之一就是通过SSRF去攻击元数据服务;文中列举了2019年美国第一资本投资国际集团(Capital One Financial Corp.,下“Capital One公司”)信息泄漏的案例;我们内部也监测到过类似的事件:测试人员通过SSRF漏洞攻击元数据服务,并将获取到的AK信息存储到日志服务中,然后在日志服务中获取到了AK信息,最终通过获取到的AK信息控制了超过200台服务器。
云鼎实验室
2021/10/09
2.1K0
浅谈云上攻防——Etcd风险剖析
Etcd简介 Etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库, 用于服务发现、共享配置以及一致性保障等。目前已广泛应用在kubernetes、ROOK、CoreDNS、M3以及openstack等领域。 Etcd内部采用raft协议作为一致性算法,基于Go语言实现。从组成上来看,Etcd主要由四个部分组成:HTTP Server、Store、Raft以及WAL。我们可以通过Etcd架构图来更好的了解Etcd,Etcd架构图可见下图
云鼎实验室
2022/04/27
2.8K0
浅谈云上攻防——Etcd风险剖析
CVE-2020-8554:Kubernetes的中间人漏洞
漏洞概述 2020年12月4日,Kubernetes产品安全委员会披露了一个新的Kubernetes漏洞,即CVE-2020-8554。这是一个中危漏洞,所有的Kubernetes版本都会受到该漏洞的影响。该漏洞允许Kubernetes服务将集群流量拦截至任意IP地址,任何可以管理服务的用户可以利用此漏洞对群集中的Pod和节点执行中间人(MITM)攻击。 攻击者可以利用MITM攻击伪装成内部或外部节点,然后从网络流量中获取凭证,在将目标用户的数据发送到其预期目标之前篡改目标用户的数据,或完全阻止其与特定IP
FB客服
2023/04/26
5200
CVE-2020-8554:Kubernetes的中间人漏洞
云上攻防-云原生篇&K8s安全&Config泄漏&Etcd存储&Dashboard鉴权&Proxy暴露
如上图所示:etcd服务是运行在master节点上的,master节点上查看该服务默认通过证书认证,主要存放节点的数据,如一些token和证书。
没事就要多学习
2024/07/18
2080
云上攻防-云原生篇&K8s安全&Config泄漏&Etcd存储&Dashboard鉴权&Proxy暴露
移花接木:看CVE-2020-8559如何逆袭获取集群权限
CVE-2020-8559是一个针对Kubernetes的权限提升漏洞,攻击者可以截取某些发送至节点kubelet的升级请求,通过请求中原有的访问凭据转发请求至其他目标节点,从而造成节点的权限提升,CVSS3.x评分为6.8[1]。版本在v1.6-v1.15之间以及v1.16.13、v1.17.9和v1.18.6之前的版本均受影响。该漏洞由Tim Allclair提交[2]。
绿盟科技研究通讯
2021/11/10
1.3K0
K8s生产环境排错之:那些暗黑操作
凌晨2点收到告警,某个生产环境Pod疯狂重启但毫无日志输出。官方文档的kubectl describe三板斧毫无作用,直到偶然发现...
Jimaks
2025/04/22
1170
K8S 证书详解(认证)
在 Kube-apiserver 中提供了很多认证方式,其中最常用的就是 TLS 认证,当然也有 BootstrapToken,BasicAuth 认证等,只要有一个认证通过,那么 Kube-apiserver 即认为认证通过。下面就主要讲解 TLS 认证。
云原生Space
2023/06/11
4.7K0
K8S 证书详解(认证)
Kubernetes系列之理解K8s Service的几种模式
我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要互相调用,肯定不能用ip的,因为地址不是固定的, 如何能保障pod之前访问的可靠性,由此就衍生出Service的概念。
程序员同行者
2019/03/29
2.4K0
Kubernetes系列之理解K8s Service的几种模式
SSRF安全指北
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成,由服务端发起请求的一个安全漏洞。SSRF是笔者比较喜欢的一个漏洞,因为它见证了攻防两端的对抗过程。本篇文章详细介绍了SSRF的原理,在不同语言中的危害及利用方式,常见的绕过手段,新的攻击手法以及修复方案。
腾讯安全应急响应中心
2021/01/26
1.7K0
SSRF安全指北
《云原生安全: 攻防实践与体系构建》解读:动手实践篇
在《〈云原生安全: 攻防实践与体系构建〉解读:攻防对抗篇》中,我们为大家介绍了《云原生安全:攻防实践与体系构建》书中精彩的攻防对抗技术与案例。事实上,无论是对于一线负责攻防的同学,还是对于相关安全研究的同学来说,实践是掌握这些技能、理解这些威胁及设计合理防御机制的关键。纸上得来终觉浅,绝知此事要躬行。本篇,我们就为大家梳理一下本书中可以供各位同学动手实践的部分。我们也建议大家,在有需求、有条件的情况下,能够跟随本书,敲下一行行命令,感受其中的奥妙。
绿盟科技研究通讯
2021/11/10
2.5K0
k8s故障检测与自愈(一)
DNS故障:6个DNS Pod中的2个出现无法解析外部DNS名称的情况。后果是大量线上业务因域名解析。
没有故事的陈师傅
2021/04/26
3.4K0
k8s故障检测与自愈(一)
红队视角出发的k8s敏感信息收集——服务发现与 DNS 探测
在 Kubernetes 集群中,CoreDNS 和 ETCD 是服务发现的核心组件,攻击者可通过它们快速获取集群内部的服务拓扑信息。
zhouzhou的奇妙编程
2025/02/06
1650
k8s 服务注册与发现(三)CoreDNS
作为一个加入 CNCF(Cloud Native Computing Foundation) 的服务 CoreDNS 的实现可以说的非常的简单。
看、未来
2022/09/27
2.2K0
k8s 服务注册与发现(三)CoreDNS
k8s实践(12)--K8s service服务详解
Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结束。 通过 ReplicationController 能够动态地创建和销毁 Pod(例如,需要进行扩缩容,或者执行)。 每个 滚动升级 Pod 都会获取它自己的 IP 地址,即使这些 IP 地址不总是稳定可依赖的。 这会导致一个问题:在 Kubernetes 集群中,如果一组 Pod(称为 backend)为其它 Pod (称为 frontend)提供服务,那么那些 frontend 该如何发现,并连接到这组 Pod 中的哪些 backend 呢?
黄规速
2022/04/14
9.3K0
k8s实践(12)--K8s service服务详解
浅谈云上攻防系列——云IAM原理&风险以及最佳实践
云上身份和访问管理功能简介 身份和访问管理是什么?关于这个问题,Gartner Information Technology Glossary中给出了关于IAM的定义:“Identity and access management (IAM) is the discipline that enables the right individuals to access the right resources at the right times for the right reasons”。与之类似,云上身份
云鼎实验室
2022/08/29
2.9K0
浅谈云上攻防系列——云IAM原理&风险以及最佳实践
k8s必学必会知识梳理
对外暴露了Kubernetes API。它是的 Kubernetes 核心控制层。它被设计为水平扩展,即通过部署更多实例来横向扩展。API Server 负责和 etcd 交互(其他组件不会直接操作 etcd,只有 API Server 这么做),是整个 kubernetes 集群的数据中心,所有的交互都是以 API Server 为核心的。API Server 提供了以下的功能:
我的小碗汤
2019/07/30
2K0
k8s实践(3)--k8s集群安装详解
目前有三种安装方式 第一种是yum安装 使用yum安装,好处是简单,缺点就是要获取最新版需要跟你学yum源,而且所有软件的依赖又不能自己指定,尤其是系统版本比较,使用yum源安装的kubernetes的版本也会受到限制。
黄规速
2022/04/14
9.4K1
k8s实践(3)--k8s集群安装详解
Kubernetes(K8s)基础知识(docker容器技术)
  一个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,K8s有亿:亿级日服务人次。
sunsky
2020/08/20
6600
Kubernetes(K8s)基础知识(docker容器技术)
逃逸风云再起:从CVE-2017-1002101到CVE-2021-25741
近日,研究人员向Kubernetes安全团队报告了一个可导致容器逃逸的安全漏洞[1],获得编号CVE-2021-25741,目前的CVSS3.x评分为8.8[2],属于高危漏洞。该漏洞引起社区的广泛讨论[3]。有人指出,CVE-2021-25741漏洞是由2017年的CVE-2017-1002101漏洞的补丁不充分导致,事实也的确如此。
绿盟科技研究通讯
2021/10/15
1.7K2
浅谈云上攻防——Kubelet访问控制机制与提权方法研究
背景 本文翻译整理自rhino安全实验室:近些年针对kubernetes的攻击呈现愈演愈烈之势,一旦攻击者在kubernetes集群中站稳脚跟就会尝试渗透集群涉及的所有容器,尤其是针对访问控制和隔离做的不够好的集群受到的损害也会越大。例如由unit 42研究人员检测到的TeamTNT组织的恶意软件Siloscape就是利用了泄露的AWS凭证或错误配置从而获得了kubelet初始访问权限后批量部署挖矿木马或窃取关键信息如用户名和密码,组织机密和内部文件,甚至控制集群中托管的整个数据库从而发起勒索攻击。根据微
云鼎实验室
2021/08/19
1.6K0
相关推荐
浅谈云上攻防--SSRF漏洞带来的新威胁
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验