漏洞概览
- 漏洞名称: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
@Override
protected 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
绕过流程:
- 首次解码(容器层):
%252f
→%2f
(保留编码形式)。 - 二次解码(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()
) - 防御铁律:
- 永不信任用户输入:路径拼接前强制规范化。
- 最小权限原则:服务进程以低权限账户运行。
- 深度防御:结合代码修复 + 网络层过滤 + 文件监控。
参考链接