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进程本身的文件访问权限。

漏洞复现

环境搭建

  1. 获取源码:

    git clone https://github.com/apache/flink.git
    
  2. 检出漏洞版本:

    git checkout 7fed9f0243aaf80d0060f075b95ba46b3207c8a8
    
  3. 编译项目:

    mvn clean package -DskipTests
    

    编译时间约30分钟

  4. 配置调试环境:
    修改配置文件 flink-debug-src/build-target/conf/flink-conf.yaml,添加:

    env.java.opts: -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
    
  5. 启动服务:

    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/的双重编码)

漏洞分析

攻击流程

  1. 攻击者构造包含目录穿越的URL请求
  2. 服务器接收请求并进行第一次URL解码
  3. 路由处理过程中进行第二次URL解码
  4. 解码后的路径被用于文件读取操作
  5. 服务器返回目标文件内容

关键代码分析

  1. 路由处理入口:

    org.apache.flink.runtime.rest.handler.router.Router#route
    
  2. 路径解码:

    org.apache.flink.runtime.rest.handler.router.Router#decodePathTokens
    
    • 使用/分割路径
    • 对每个部分使用QueryStringDecoder.decodeComponent进行URL解码
  3. 路由匹配:

    org.apache.flink.runtime.rest.handler.router.PathPattern#match
    
    • 遍历路径token
    • ../../../../../../../../../../../../etc/passwd放入Map并返回true
  4. 请求处理:

    org.apache.flink.runtime.rest.handler.cluster.AbstractJobManagerFileHandler#respondToRequest
    
    • 从请求中获取路径参数
    • 构造File对象
    • 通过HandlerUtils.transferFile读取并返回文件内容

漏洞根源

漏洞产生于路径处理过程中的双重URL解码机制:

  1. 服务器自动进行第一次URL解码
  2. 应用代码显式进行第二次URL解码
  3. 解码后的路径未进行充分的安全校验

修复方案

官方修复commit: b561010b0ee741543c3953306037f00d7a9f0801

主要修复措施:

  1. 对路径参数进行严格校验
  2. 防止目录穿越攻击

防护建议

  1. 升级到Apache Flink 1.11.3或更高版本
  2. 对JobManager的REST接口实施网络访问控制
  3. 限制JobManager进程的文件系统访问权限

参考链接

  1. Apache Flink官方公告
  2. 漏洞分析文章

附录

测试用例

官方修复commit中包含的测试用例可用于验证修复效果,建议参考:
flink-runtime/src/test/java/org/apache/flink/runtime/rest/handler/cluster/JobManagerCustomLogHandlerTest.java

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