漏洞介绍
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,提出是上传功能的校验问题,并指出这里会提供两个测试案例

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

我们找到系统的上传功能

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

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

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

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

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,与系统路径拼接

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

flink-1.11.2\flink-runtime\src\main\java\org\apache\flink\runtime\rest\FileUploadHandler.java#L142
上传文件,并重命名保存至另一个路径以做缓存

jdk1.8.0_261\src.zip!\java\io\File.java#L1385-L1398,L1397
缓存文件存在时间很短,只有30s

jdk1.8.0_261\src.zip!\java\io\UnixFileSystem.java#L274
此时系统已按目标路径写入文件

漏洞复现
发送如下数据包,即可上传一个文件到目标服务器的 /tmp/success 位置:
1 | POST /jars/upload HTTP/1.1 |

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

poc使用
QmF0c3UK/CVE-2020-17518 (github.com)
1 | python CVE-2020-17518.py -u http://IP:port |

成功在/tmp下创建文件

参考
Apache Flink CVE-2020-17518、17519 漏洞分析 - FreeBuf网络安全行业门户
https://github.com/vulhub/vulhub/blob/master/flink/CVE-2020-17518/README.zh-cn.md