Spring Cloud Gateway代码执行漏洞

CVE-2022-22947 Spring Cloud Gateway

  • Spring Cloud Gateway
  • Spring Boot Actuator
  • Gateway和Actuator集成
  • Actuator操作Gateway接口列表
  • 漏洞复现
  • payload分析
  • 漏洞发生条件
  • 漏洞修复

远程代码执行(Remote Code Execute)漏洞\命令注入(SpEL Code Injection)漏洞

  • SpEL表达式语言
    能够在运行时动态赋值,且可使用Java类和方法。T(类的全路径)即可使用Java类

Spring Cloud Gateway

spring boot的网关组件,为微服务架构提供一种简单有效的统一的 API 路由管理方式

API网关是一个服务器,是系统的唯一入口。所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。

  • Filter(过滤器): 是GatewayFilter的一个实例,过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容
  • Predicate(断言):路由转发的判断条件,使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数
  • Route(路由):网关配置的基本组成模块。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问
  • 处理流程
    客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。Handler通过指定的过滤器链将请求发送到服务并执行业务逻辑,然后返回。过滤器可能会在发送代理请求之前或之后执行业务逻辑。

Spring Boot Actuator

spring boot的监控组件,提供安全端点,用于监视和管理Spring Boot应用程序

Spring Boot Actuator端点

端点 用法
/env 查看应用程序中使用的环境变量列表
/info 查看有关Spring Boot应用程序的信息
/beans 查看Spring bean及其类型,范围和依赖关系
/health 查看应用程序运行状况
/trace 查看Rest端点的跟踪列表
/metrics 查看应用程序指标

Gateway和Actuator集成

/gateway执行器端允许监视Spring Cloud Gateway应用程序并与之交互。要进行远程访问,必须在应用程序属性中通过HTTP或JMX启用和公开端

management.endpoint.gateway.enabled=true
management.endpoints.web.exposure.include=gateway

Actuator操作Gateway接口列表

http://host:port/actuator/gateway/id

id 描述
globalfilters GET方法,返回全局Filter列表
routefilters GET方法,每个路由的filter
routes GET方法,路由列表
routes/{路由} GET方法,指定路由的信息
routes/{路由} POST方法,创建路由
refresh POST方法,刷新路由缓存
routes/{路由} DELETE方法,删除路由

漏洞复现

启动Spring Cloud Gateway本地服务
Spring Cloud Gateway代码执行漏洞_第1张图片
服务端口配置为9000
Spring Cloud Gateway代码执行漏洞_第2张图片
访问成功,服务已启动
Spring Cloud Gateway代码执行漏洞_第3张图片
使用bp创建路由并添加恶意过滤器规则
Spring Cloud Gateway代码执行漏洞_第4张图片
响应成功创建
Spring Cloud Gateway代码执行漏洞_第5张图片
刷新路由缓存使其生效
Spring Cloud Gateway代码执行漏洞_第6张图片
浏览器查看刚才创建的路由信息,Result的值成功执行了whoami命令
Spring Cloud Gateway代码执行漏洞_第7张图片
删除路由后刷新路由清除缓存
Spring Cloud Gateway代码执行漏洞_第8张图片

也可使用Python自动化脚本执行任意命令
Spring Cloud Gateway代码执行漏洞_第9张图片

payload分析

#{new String(
T(org.springframework.util.StreamUtils).copyToByteArray(
T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"})
.getInputStream()))}
  • new String[]{“whoami”}
    创建字符串,内容为要执行的命令
  • T(java.lang.Runtime).getRuntime().exec()
    Java中执行操作系统命令
  • .getInputStream()
    获得执行结果
  • T(org.springframework.util.StreamUtils).copyToByteArray()
    spring工具类的方法将执行结果转换为字节数组
  • new String()
    将结果转换为字符串
  • #{
    SpEL表达式的必要格式,利用SpEL表达式特性执行恶意代码

漏洞发生条件

  • Spring Cloud Gateway < 3.1.1
  • Spring Cloud Gateway < 3.0.7
  • Spring Cloud Gateway集成了Actuator

漏洞修复

  1. 更新升级Spring Cloud Gateway到安全版本
  2. 在不考虑影响业务的情况下禁用Actuator端点
    management.endpoint.gateway.enable: false

你可能感兴趣的:(CVE,java,spring,cloud,安全)