Apache Dubbo CVE-2021-36162 挖掘过程
01 漏洞背景
发现该漏洞的起因是在分析 CVE-2021-30181 的脚本注入补丁的时候,意外发现了几个已被修复的 yaml
反序列化漏洞,还以为是未公开的Nday,查询后发现其实对应的是 CVE-2021-30180 漏洞的修复代码。通过查看补丁可以知道,Router
模块中所有yaml.load的调用中都使用了SafeConstructor白名单过滤,无法正常利用。
“关于本文中出现的 SnakeYaml 反序列化相关知识,可以参考公众号之前发送的推文——《Java
SnakeYaml反序列化分析》”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FScAdFj-1690358271307)(https://image.3001.net/images/20220415/1649992906_6258e4caa0ed5214712f1.png!small?1649992909028)]
在代码中搜索yaml.load的调用,发现还有另外一个模块存在调用,并且没有使用SafeConstructor等修复措施,漏洞代码位置如下所示:public class MigrationRule {private static final String DUBBO_SERVICEDISCOVERY_MIGRATION_KEY = “dubbo.application.service-discovery.migration”;public static final String DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP = “MIGRATION”;public static final String RULE_KEY = ApplicationModel.getName() + “.migration”;private static DynamicConfiguration configuration = null;private String key;private MigrationStep step;…public static MigrationRule parse(String rawRule) {if (null == configuration) {return getMigrationRule((String)null);} else if (!StringUtils.isBlank(rawRule) && !“INIT”.equals(rawRule)) {Constructor constructor = new Constructor(MigrationRule.class);Yaml yaml = new Yaml(constructor);return (MigrationRule)yaml.load(rawRule);} else {String step = (String)configuration.getInternalProperty(“dubbo.application.service-discovery.migration”);return getMigrationRule(step);}}…}
因此CVE-2021-30180的 PoC 也是可以在这里进行利用的,具体的反序列化利用链 Github 安全实验室已公布,感兴趣的同学可以自行参照其改造
CVE-2021-36162 漏洞的利用链。
##02 漏洞触发
有了 yaml 反序列化利用链,接下来就是看看如何触发这个漏洞。参照之前的漏洞触发方式,需要通过在 ZooKeeper(下文简写为 ZK)
上增加节点存入恶意数据来完成触发,因此有两个问题需要解决:
1. 在 ZK 哪个节点中添加恶意 yaml 数据 ?
2. 如何让消费者读取并解析这个 yaml 数据 ?
问题一
通过搜索 Migation 功能可以找到下面的文档,Dubbo 利用该功能来控制消费者执行不同的选址策略,根据内容可以大致确定可以通过全局的配置中心 ZK
来控制恶意的数据。
正常的运行消费者和服务端并进行抓包,可以发现其中包含与 migration 相关的 ZK Path,尝试在其中创建相关节点,并在下列路径中插入任意数据:
问题二
完成任意数据的插入以后,再次运行消费者可以发现有如下 解析异常的报错信息 ,证明插入的数据已经生效,成功进入到了漏洞代码当中。
尝试将构造好的 PoC 插入到上述的路径当中,这里会发现由于 PoC 中有很多的空格、特殊符号之类的字符存在,直接通过 ZKCli.sh 插入 PoC
会出现各种问题,导致漏洞无法正常触发,因此需要通过 Java 调用第三方包的方式来向 ZK 中添加数据,具体代码如下所示:
• 使用下列代码插入恶意 Yaml 数据// 在看到 github 官方插入代码前自行实现的插入逻辑public class RegisterYaml {public static void main(String[] args) throws Exception {String path = “/dubbo/config/MIGRATION/consumer-of-helloworld-app.migration”;String poc = “…”;RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);CuratorFramework client = CuratorFrameworkFactory.newClient(“127.0.0.1:2181”, retryPolicy);client.start();Stat stat = client.checkExists().forPath(path);if (stat != null) {client.delete().forPath(path);}client.create().forPath(path, poc.getBytes());}}
准备好漏洞触发所需的 SPI 配置文件,以及待执行的 Class 字节码文件即可,具体的文件目录结构如下所示:├── META-INF│ └── services│ └── javax.script.ScriptEngineFactory└── cc└── m01n└── SnakeYaml└── AwesomeScriptEngineFactory.class
在 META-INF 同级目录下使用 Python 启动 HTTP Server。
• python3 -m http.server 8000
先启动服务端代码,再运行消费者代码,即可触发漏洞:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6uUpwYcf-1690358271309)(https://image.3001.net/images/20220415/1649993058_6258e562e93d68aeeff06.png!small?1649993060762)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXiC7wLf-1690358271309)(https://image.3001.net/images/20220415/1649993066_6258e56a40b553f9e1629.png!small?1649993068623)]
##03 漏洞分析
在MigrationRuleListener 类中打下断点,其中会调用 this.configuration.getConfig 从 ZK 中获取 yaml
数据到rawRule属性中,可以看到取出来的就是我们写入的恶意 yaml 数据。
继续跟进发现MigrationRuleListener实例是通过自定义的 SPI ExtensionLoader#createExtension 创建完成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdwBAnWl-1690358271310)(https://image.3001.net/images/20220415/1649993089_6258e58188c3902dfb023.png!small?1649993091407)]
后面会对MigrationRuleListener实例调用onRefer方法,触发到后续的 yaml 数据解析操作。
进去断点跟进可以看到,rawRule中的 yaml 数据会被传入到 yaml.load 方法中,导致反序列化漏洞。
##04 漏洞修复
该漏洞在 2.7.13 版本完成了修复,修复思路 CVE-2021-30180
方式一致,采用了SafeConstructor进行修复,具体修复补丁如下所示:
https://github.com/apache/dubbo/commit/bfa4b3bb6660d404c0715f54f8743dda45b46909
b3bb6660d404c0715f54f8743dda45b46909
[外链图片转存中…(img-NbK0tKMS-1690358271310)]
网络安全工程师企业级学习路线
这时候你当然需要一份系统性的学习路线
如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。
一些我收集的网络安全自学入门书籍
一些我白嫖到的不错的视频教程:
上述资料【点下方卡片】就可以领取了,无偿分享
相关文章:

Apache Dubbo CVE-2021-36162 挖掘过程
01 漏洞背景 发现该漏洞的起因是在分析 CVE-2021-30181 的脚本注入补丁的时候,意外发现了几个已被修复的 yaml 反序列化漏洞,还以为是未公开的Nday,查询后发现其实对应的是 CVE-2021-30180 漏洞的修复代码。通过查看补丁可以知道,…...
开源框架面试题目整理
目录 SpringIOC SpringAOP Spring的生命周期 Spring Bean作用域 Spring Bean作用域并发安全 Spring循环依赖...

Mr. Cappuccino的第52杯咖啡——Mybatis环境搭建与使用
Mybatis环境搭建与使用 Mybatis介绍Mybatis环境搭建与使用基于XML方式-原生方式开发创建数据库表项目准备项目结构项目代码实体类中添加有参构造方法产生的问题 基于XML方式-mapper代理开发项目准备项目结构项目代码SQL映射文件中namespace未设置为接口全限定名产生的问题 基于…...

了解Unity编辑器之组件篇Tilemap(五)
Tilemap:用于创建和编辑2D网格地图的工具。Tilemap的主要作用是简化2D游戏中地图的创建、编辑和渲染过程。以下是一些Tilemap的主要用途: 2D地图绘制:Tilemap提供了一个可视化的编辑器界面,可以快速绘制2D地图,例如迷…...
Linux字符设备操作函数
Linux字符设备操作函数是指对字符设备进行打开、关闭、读取、写入、控制等基本操作的函数,它们通过字符设备结构体中的 file_operations 结构体来定义。常用的字符设备操作函数包括: 1、open: 当一个进程试图打开设备文件时,调用这个函数。开…...

吉林大学计算机软件考研经验贴
文章目录 简介政治英语数学专业课 简介 本人23考研,一战上岸吉林大学软件工程专硕,政治72分,英一71分,数二144分,专业课967综合146分,总分433分,上图: 如果学弟学妹需要专业课资料…...
2023-07-26力扣每日一题-区间翻转线段树
链接: 2569. 更新数组后处理求和查询 题意: 给两个等长数组nums1和nums2,三个操作: 操作1:将nums1的[l,r]翻转(0变1,1变0) 操作2:将nums2[any]变成nums2[any]nums1[any]*p&…...
Java设计模式之 -- 桥接模式
什么是桥接模式 桥接模式是一种结构型设计模式,也被称为“Handle/Body”。这种设计模式主要用于将抽象部分与它的实现部分分离,使它们可以独立地变化。这种方式有助于减少系统中的耦合性,增加了扩展性。 主要解决什么问题 桥接模式主要解决…...
【node.js】02-path模块
目录 1. path.join() 2. path.basename() 3. path.extname() 1. path.join() 使用 path.join() 方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下: path.join([...paths]) 例子: const path require(path)co…...

攻防世界-Reverse-re1
题目描述:菜鸡开始学习逆向工程,首先是最简单的题目 下载附件,执行程序,如下界面 1. 思路分析 没啥说的,既然题目都说是一道简单的逆向题,那么直接使用ida逆向即可,看逆向出的结果是否能写入到…...
AES加密的基本常识和封装类
AES加密的基本常识和封装类 AES(Advanced Encryption Standard)是一种对称密钥加密算法,被广泛用于保护敏感数据的安全性。它是一种块加密算法,意味着它将明文数据分成固定大小的块,并使用相同的密钥对每个块进行独立…...

elasticsearch使用记录
参考文章:https://elasticsearch-py.readthedocs.io/en/v8.8.2/ 参考文章:https://cuiqingcai.com/6214.html 参考文章:https://www.cnblogs.com/cupleo/p/13953890.html elasticsearch版本:8.8.2(软件包发行版) python版本&#…...
UNI-APP_横屏切换竖屏出现样式混乱问题
app从竖屏页面1进入竖屏页面2,再进入横屏,再返回,再返回从新回到竖屏页面1,再次进入竖屏页面2,发现竖屏页面2的所有图片字体都被放大了。再返回竖屏1,再进入竖屏2,一切又恢复正常。 解决跳转横…...

数据可视化(3)
1.饼状图 #饼状图 #pie(x,labels,colors,labeldistance,autopct,startangle,radius,center,textprops) #x,每一块饼状图的比例 #labels:每一块饼形图外侧显示的文字说明 #labeldistance:标记的绘制位置,相对于半径的比例…...
AI面试官:MD5、DES、RSA、AES加密
AI面试官:MD5、DES、RSA、AES加密 文章目录 AI面试官:MD5、DES、RSA、AES加密1. 什么是MD5加密?它在实际应用中有哪些场景?2. DES加密是什么?它在现实中的应用场景有哪些?3. 问题:RSA加密是什么…...
Shell脚本学习-$$特殊变量
$$特殊变量: 获取脚本执行的进程号(PID)。 [rootvm1 scripts]# cat test_pid.sh echo $$ > /tmp/a.pid sleep 300代码说明: 1)获取$$值,也就是当前脚本进程的PID值,重定向到/tmp/a.pid文件…...
vscode中python插件过新导致无法正常debug问题解决安装vscode以前版本python插件教程
您需要从.vsix文件安装它。您可以在此处找到它们。 下载所需.vsix版本的文件。您可能需要单击assets才能看到它们。 然后打开 VSCode,转到extensions-> 单击三个点 ->install from vsix并选择您的文件。 重启以后,就可以正常debug了!...

chrome macos编译
下载工具包 git clone https://chromium.googlesource.com/chromium/tools/depot_tools/gitpwd export PATH"$PATH:/Users/lichengjun/Downloads/chrome_build/depot_tools" mkdir chromium cd chromium 如果想快的话直接: fetch --nohooks --no-history chromium (…...

Linux环境下Elasticsearch相关软件安装
Linux环境下Elasticsearch相关软件安装 本文将介绍在linux(Centos7)环境下安装Elasticsearch相关的软件。 1、安装Elasticsearch 1.1 Elasticsearch下载 首先去Elasticsearch官网下载相应版本的安装包,下载之后传输到linux服务器上。 官网地址:http…...

【趟坑记录】d3.zoom()的正确使用姿势 @d3.v7
【趟坑记录】d3.zoom()的正确使用姿势 d3.v7 文章目录 【趟坑记录】d3.zoom()的正确使用姿势 d3.v7问题重现原因分析解决方案放缩平移写法特殊修改transform函数的写法 总结 在开发一个D3应用的时候遇到了一个 zoom相关的问题,记录解决思路与方案 问题重现 最近在…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...