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相关的问题,记录解决思路与方案 问题重现 最近在…...
终极图像分类指南:从海豚到多类别的机器学习实战
终极图像分类指南:从海豚到多类别的机器学习实战 【免费下载链接】have-fun-with-machine-learning An absolute beginners guide to Machine Learning and Image Classification with Neural Networks 项目地址: https://gitcode.com/gh_mirrors/ha/have-fun-wit…...
ROS2中nav_msgs/Path消息的实战解析:从数据结构到Rviz可视化
1. 理解nav_msgs/Path消息的核心结构 在ROS2的导航系统中,nav_msgs/Path消息扮演着路径规划与可视化的重要角色。这个消息类型本质上是一条由多个位姿点组成的轨迹,常用于描述机器人需要跟随的全局路径或局部路径。我第一次接触这个数据结构时࿰…...
别再只用协同过滤了!聊聊Spark电商推荐系统中的‘冷启动’与实时推荐那些事儿
突破传统推荐瓶颈:Spark电商系统中的冷启动与实时推荐实战解析 1. 电商推荐系统的演进与挑战 在数字化消费时代,推荐系统已成为电商平台的核心竞争力。从早期的简单规则推荐到如今的深度学习模型,推荐技术经历了三次重要迭代: 第一…...
新手福音:用快马平台AI生成你的第一个待办事项应用
作为一个刚接触编程的新手,想要自己动手做一个待办事项应用听起来可能有点吓人。但最近我发现了一个特别适合新手的工具——InsCode(快马)平台,它让我这个零基础的小白也能轻松实现自己的想法。 从想法到实现的过程 刚开始我连HTML、CSS和JavaScript的…...
Wan2.2-I2V-A14B在Qt桌面程序中的应用:开发本地化视频创作工具
Wan2.2-I2V-A14B在Qt桌面程序中的应用:开发本地化视频创作工具 1. 引言:让AI视频生成触手可及 想象一下,一个普通用户无需学习复杂的命令行,只需拖拽图片、滑动几个调节条,就能轻松将静态图片变成生动的视频。这正是…...
从“存查”到“懂用”:基于 SKC 的企业知识闭环实战
文章目录一、引言: 从“存查”到“懂用”的破局之路二、核心理念:从“知识仓库”到“能力转化引擎”三、实操指南:三步构建知识闭环四、场景演示:新员工入职的“加速跑”五、结语:激活知识价值,打造企业成长…...
OpCore Simplify:一键生成黑苹果EFI配置的智能解决方案
OpCore Simplify:一键生成黑苹果EFI配置的智能解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配置过程中的繁琐步骤…...
Kimi-VL-A3B-Thinking算力适配:单卡A10即可运行长思考MoE多模态模型
Kimi-VL-A3B-Thinking算力适配:单卡A10即可运行长思考MoE多模态模型 1. 引言:当多模态模型遇上“小算力”的惊喜 如果你对多模态大模型感兴趣,但又担心自己的硬件“带不动”,那么今天这篇文章就是为你准备的。我们常常看到一些强…...
使用 Dify 快速搭建 Ostrakon-VL 智能应用:无需编码的视觉工作流
使用 Dify 快速搭建 Ostrakon-VL 智能应用:无需编码的视觉工作流 1. 引言:当视觉理解遇上无代码开发 想象一下,你是一家电商公司的运营人员,每天需要处理上千张商品图片——识别商品类别、提取关键属性、整理成表格。传统方式要…...
2026年4月OpenClaw怎么安装?阿里云高效方法:搭建及大模型API、Skill集成流程
2026年4月OpenClaw怎么安装?阿里云高效方法:搭建及大模型API、Skill集成流程。OpenClaw作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉,让AI在企业群聊、个人工作流中自…...
