当前位置: 首页 > news >正文

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览

  • 漏洞名称:Apache Flink REST API 任意文件读取漏洞
  • CVE编号:CVE-2020-17519
  • CVSS评分:7.5
  • 影响版本:Apache Flink 1.11.0、1.11.1、1.11.2
  • 修复版本:≥ 1.11.3 或 ≥ 1.12.0
  • 漏洞类型:路径遍历(Path Traversal)
  • 根本原因:JobManager 的 REST 接口未对用户输入路径进行规范化校验,导致通过双重URL编码(%252f)绕过安全防护,实现任意文件读取。

技术背景

Apache Flink 架构关键点

  • JobManager:核心管理节点,通过 REST API(默认端口 8081)提供作业控制、日志访问等功能。
  • 漏洞接口/jobmanager/logs/<filename> 用于查看日志文件,但未限制文件名参数的路径穿越风险。

漏洞原理与源码分析

1. 漏洞触发点

类路径org.apache.flink.runtime.rest.handler.cluster.JobManagerCustomLogHandler
方法getFile

@Overrideprotected File getFile(HandlerRequest<EmptyRequestBody, FileMessageParameters> handlerRequest) {if (logDir == null) {return null;}String filename = handlerRequest.getPathParameter(LogFileNamePathParameter.class);return new File(logDir, filename);// 直接拼接用户输入的filename [漏洞点]  
}  }

问题分析

  • logDir 是日志目录(如 /opt/flink/log),但 filename 未做规范化处理。
  • 攻击者注入 ../ 序列可跳转至系统任意路径(如 ../../etc/passwd)。
2. 双重编码绕过机制

攻击载荷示例:

GET /jobmanager/logs/..%252f..%252fetc%252fpasswd HTTP/1.1  

绕过流程

  1. 首次解码(容器层):%252f%2f(保留编码形式)。
  2. 二次解码(Flink路由层):%2f/,生成有效路径 ../../etc/passwd
3. 路由处理缺陷
  • 类路径org.apache.flink.runtime.webmonitor.handlers.Router
  • 问题:路由解析时未校验路径标准化结果,直接传递用户输入至文件系统接口。

漏洞复现与影响

复现步骤

环境搭建
1.使用 Vulhub 环境启动漏洞靶机
 docker-compose up -d 

在这里插入图片描述

2.访问访问 http://target:8081,确认服务正常运行

在这里插入图片描述

攻击步骤
通过以下 URL 可以读取服务器上的 /etc/passwd 文件内容:
http://your-ip:8081/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd

在这里插入图片描述

实际影响

攻击类型利用场景危害示例
敏感信息泄露读取 /etc/passwd~/.ssh/id_rsa系统用户枚举、SSH密钥窃取
配置文件窃取读取数据库凭证(application.properties数据库未授权访问
云环境横向渗透读取 Kubernetes 服务账户令牌集群权限提升

修复方案

1. 官方补丁(≥1.11.3)

修复代码

// 路径规范化 + 边界校验  
Path requestedFile = rootPath.resolve(filename).normalize();  
if (!requestedFile.startsWith(rootPath)) {  throw new NotFoundException("File not found");  
}  

修复效果

  • normalize() 消除路径中的 ../ 序列。
  • startsWith() 确保最终路径限制在 logDir 内。

2. 临时缓解措施

  • 网络层隔离:限制 8081 端口的访问来源(防火墙/NACL)。
  • 反向代理过滤(Nginx示例):
    location ~ /logs/ {  if ($request_uri ~ "\.\.|%252f") { return 403; }  
    }  
    
  • 启用认证:配置 Flink Kerberos 或 API 密钥认证。

总结与启示

  • 根本原因输入信任失衡 + 路径规范化缺失
  • 同类漏洞对比
    漏洞绕过方式修复核心
    CVE-2020-17519双重URL编码先规范化后校验边界
    CVE-2020-17518文件名路径穿越剥离路径(getName()
  • 防御铁律
    1. 永不信任用户输入:路径拼接前强制规范化。
    2. 最小权限原则:服务进程以低权限账户运行。
    3. 深度防御:结合代码修复 + 网络层过滤 + 文件监控。

参考链接

  1. CVE-2020-17519 NVD 漏洞详情
  2. 漏洞复现与 PoC 脚本
  3. 官方修复提交记录
http://www.xdnf.cn/news/896635.html

相关文章:

  • 【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
  • vue3:十五、管理员管理-页面搭建
  • Vue:Form正则校验
  • 数据库系统学习
  • 高效Excel合并拆分软件
  • Excel 发现此工作表中有一处或多处公式引用错误。请检查公式中的单元格引用、区域名称、已定义名称以及到其他工作簿的链接是否均正确无误。弹窗
  • Excel 模拟分析之单变量求解简单应用
  • 沙市区举办资本市场赋能培训会 点赋科技分享智能消费新实践
  • 【Go语言基础【5】】Go module概述:项目与依赖管理
  • go语言学习 第6章:错误处理
  • pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
  • 正交多项式
  • 8K样本在DeepSeek-R1-7B模型上的复现效果
  • Java并发编程实战 Day 8:Java内存模型深度解析
  • c++第七天--特殊运算符的重载练习
  • Selenium自动下载浏览器驱动
  • 「Java教案」选择结构
  • Java并发编程实战 Day 10:原子操作类详解
  • AI变革思考2:当小众需求遇上人工智能,催生长尾应用的春天
  • Java编程课(一)
  • Java 异步编程难题及拆解技术
  • 电子电路基础1(杂乱)
  • Matlab | matlab常用命令总结
  • 通信刚需,AI联手ethernet/ip转profinet网关打通工业技术难关
  • 智慧供水运维管理系统
  • 【安全等保】华为安全等保二、三级方案精讲【附全文阅读】
  • 极限复习c++
  • 图像分类进阶:从基础到专业 (superior哥AI系列第10期)
  • python版若依框架开发:项目结构解析
  • opencv-4.8.1到 sln