前几天网传Spring RCE 0day漏洞的文章满天飞,破冰的文章火了没多久就被删了,想必漏洞之大,必须给大家一点时间修一修。自从前几天我发的《高能预警!Spring疑似核弹级RCE 0day漏洞》后,一直保持着对该漏洞的关注。
如今,Spring 社区(3月31日晚)发布了一篇名为《Spring Framework RCE, Early Announcement》的文章,官宣了最近网传的Spring漏洞,证实了网传漏洞确实存在,但是注意,并非最近很多文章提到的CVE,如果你按照着那些文章解决问题的话,那就修错了,请往下看。
这次确定的Spring核心框架中的RCE漏洞,CVE号为CVE-2022-22965[1]
。
这个漏洞是在周二(3月29日)深夜,由AntGroup FG的codePlutos,meizjm3i向VMware报告。周三,Spring官方对该问题进行了调查、分析并确定了解决方案,同时计划在周四进行紧急版本的发布。
由于该漏洞被提早泄漏在网上,所以Spring官方紧急发布了相关修复的版本,因为漏洞实在是太大(比Log4J的远程漏洞还要大),涉及面广,下图是截止到本文发稿时的进展时间线,可以看到官方密集地排查了各个版本的影响情况:
影响范围
利用这个漏洞需要满足以下条件:
-
JDK 9 +
-
使用Apache Tomcat部署
-
使用WAR方式打包
-
依赖spring-webmvc或者spring-webflux
由于JDK版权和版本收费等问题,国内大部分公司都还在坚持用JDK8(其实足够用),如果你是JDK8甚至更低,庆幸了,就慢慢来吧,但是哪天哪个程序员为了对接什么功能(要求JDK9+),升到了JDK9,那就危险了,所以,建议也不要太慢,逐步地升级到最新版本稳妥一点。
至于漏洞细节,网上有很多例子,这里就不提供不分析了。
解决方案
因为这次是Spring官方提供,解决方案就比较完善了,大家可以通过升级方案进行升级:
-
Spring 5.3.x 用户升级到 5.3.18+
-
Spring 5.2.x 用户升级到 5.2.20+
-
Spring Boot 2.6.x 用户升级到 2.6.6+
-
Spring Boot 2.5.x 用户升级到 2.5.12+
相信很多用户都是通过排除class.*、Class.*、*.class.*、*.Class.*这些类型的数据绑定来解决的,Spring官方推文里证实了该方法是有效的,但可能会留下一些其他隐患,特别是当Controller
通过其自己的@InitBinder
方法在本地设置disalloedFields
时,该方法会覆盖全局设置。
以下方法是可行的:
(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
为了以更安全的方式应用解决方案,应用程序可以扩展RequestMappingHandlerAdapter
,以便在所有其他初始化结束后更新WebDataBinder
。官方给出了更好的解决方案,比如下面这样:
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(CarApp.class, args);
}
public WebMvcRegistrations mvcRegistrations() {
return new WebMvcRegistrations() {
public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {
return new ExtendedRequestMappingHandlerAdapter();
}
};
}
private static class ExtendedRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {
protected InitBinderDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> methods) {
return new ServletRequestDataBinderFactory(methods, getWebBindingInitializer()) {
protected ServletRequestDataBinder createBinderInstance( Object target, String name, NativeWebRequest request) throws Exception {
ServletRequestDataBinder binder = super.createBinderInstance(target, name, request);
String[] fields = binder.getDisallowedFields();
List<String> fieldList = new ArrayList<>(fields != null ? Arrays.asList(fields) : Collections.emptyList());
fieldList.addAll(Arrays.asList("class.*", "Class.*", "*.class.*", "*.Class.*"));
binder.setDisallowedFields(fieldList.toArray(new String[] {}));
return binder;
}
};
}
}
}
对于不是 Spring Boot 应用下的 Spring MVC 用户,可以直接从@EnableWebMvc
切换到扩展DelegatingWebMvcConfiguration
,如文档的高级配置部分所述[3],然后重写createRequestMappingHandlerAdapter
方法来实现。
参考资料
-
[1] https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement
-
[2] https://tanzu.vmware.com/security/cve-2022-22965
-
[3] https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-config-advanced-java
关注该事件的小伙伴可以关注我研磨架构公众号,我会持续关注,同步最新最全的动态。
也请点个在看,分享出去让更多人知晓哦~~
原文始发于微信公众号(研磨架构):Spring终于承认RCE核弹漏洞!附上最新官方解决方案
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论