Flink目录穿越漏洞浅析(CVE-2020-17519)
字数 1171 2025-08-18 17:33:30
Apache Flink 目录穿越漏洞分析报告 (CVE-2020-17519)
漏洞概述
漏洞名称: Apache Flink 目录穿越漏洞
CVE编号: CVE-2020-17519
影响版本: Apache Flink 1.11.0 - 1.11.2
漏洞类型: 任意文件读取
危害等级: 高危
漏洞描述: 该漏洞允许攻击者通过JobManager进程的REST接口读取本地文件系统上的任何文件,访问范围受限于JobManager进程本身的文件访问权限。
漏洞复现
环境搭建
-
获取源码:
git clone https://github.com/apache/flink.git -
检出漏洞版本:
git checkout 7fed9f0243aaf80d0060f075b95ba46b3207c8a8 -
编译项目:
mvn clean package -DskipTests编译时间约30分钟
-
配置调试环境:
修改配置文件flink-debug-src/build-target/conf/flink-conf.yaml,添加:env.java.opts: -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006 -
启动服务:
flink-debug-src/build-target/bin/start-cluster.sh
POC验证
访问以下URL可读取系统文件:
http://localhost:8081/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd
注意: 路径使用了双重URL编码(%252f是/的双重编码)
漏洞分析
攻击流程
- 攻击者构造包含目录穿越的URL请求
- 服务器接收请求并进行第一次URL解码
- 路由处理过程中进行第二次URL解码
- 解码后的路径被用于文件读取操作
- 服务器返回目标文件内容
关键代码分析
-
路由处理入口:
org.apache.flink.runtime.rest.handler.router.Router#route -
路径解码:
org.apache.flink.runtime.rest.handler.router.Router#decodePathTokens- 使用
/分割路径 - 对每个部分使用
QueryStringDecoder.decodeComponent进行URL解码
- 使用
-
路由匹配:
org.apache.flink.runtime.rest.handler.router.PathPattern#match- 遍历路径token
- 将
../../../../../../../../../../../../etc/passwd放入Map并返回true
-
请求处理:
org.apache.flink.runtime.rest.handler.cluster.AbstractJobManagerFileHandler#respondToRequest- 从请求中获取路径参数
- 构造File对象
- 通过
HandlerUtils.transferFile读取并返回文件内容
漏洞根源
漏洞产生于路径处理过程中的双重URL解码机制:
- 服务器自动进行第一次URL解码
- 应用代码显式进行第二次URL解码
- 解码后的路径未进行充分的安全校验
修复方案
官方修复commit: b561010b0ee741543c3953306037f00d7a9f0801
主要修复措施:
- 对路径参数进行严格校验
- 防止目录穿越攻击
防护建议
- 升级到Apache Flink 1.11.3或更高版本
- 对JobManager的REST接口实施网络访问控制
- 限制JobManager进程的文件系统访问权限
参考链接
附录
测试用例
官方修复commit中包含的测试用例可用于验证修复效果,建议参考:
flink-runtime/src/test/java/org/apache/flink/runtime/rest/handler/cluster/JobManagerCustomLogHandlerTest.java