Spring终于承认RCE核弹漏洞!附上最新官方解决方案

admin 2022年4月1日23:29:43评论87 views字数 3050阅读10分10秒阅读模式

前几天网传Spring RCE 0day漏洞的文章满天飞,破冰的文章火了没多久就被删了,想必漏洞之大,必须给大家一点时间修一修。自从前几天我发的《高能预警!Spring疑似核弹级RCE 0day漏洞后,一直保持着对该漏洞的关注。

如今,Spring 社区(3月31日晚)发布了一篇名为《Spring Framework RCE, Early Announcement》的文章,官宣了最近网传的Spring漏洞,证实了网传漏洞确实存在,但是注意,并非最近很多文章提到的CVE,如果你按照着那些文章解决问题的话,那就修错了,请往下看。

这次确定的Spring核心框架中的RCE漏洞,CVE号为CVE-2022-22965[1]

Spring终于承认RCE核弹漏洞!附上最新官方解决方案

这个漏洞是在周二(3月29日)深夜,由AntGroup FG的codePlutos,meizjm3i向VMware报告。周三,Spring官方对该问题进行了调查、分析并确定了解决方案,同时计划在周四进行紧急版本的发布

由于该漏洞被提早泄漏在网上,所以Spring官方紧急发布了相关修复的版本,因为漏洞实在是太大(比Log4J的远程漏洞还要大),涉及面广,下图是截止到本文发稿时的进展时间线,可以看到官方密集地排查了各个版本的影响情况:

Spring终于承认RCE核弹漏洞!附上最新官方解决方案


响范围

Spring终于承认RCE核弹漏洞!附上最新官方解决方案

利用这个漏洞需要满足以下条件:

  • 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时,该方法会覆盖全局设置。

以下方法是可行的:

@ControllerAdvice@Order(Ordered.LOWEST_PRECEDENCE)public class BinderControllerAdvice {    @InitBinder    public void setAllowedFields(WebDataBinder dataBinder) {         String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};         dataBinder.setDisallowedFields(denylist);    }}


为了以更安全的方式应用解决方案,应用程序可以扩展RequestMappingHandlerAdapter,以便在所有其他初始化结束后更新WebDataBinder。官方给出了更好的解决方案,比如下面这样:

@SpringBootApplicationpublic class MyApp {
public static void main(String[] args) { SpringApplication.run(CarApp.class, args); }
@Bean public WebMvcRegistrations mvcRegistrations() { return new WebMvcRegistrations() { @Override public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() { return new ExtendedRequestMappingHandlerAdapter(); } }; }
  private static class ExtendedRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter { @Override protected InitBinderDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> methods) {
      return new ServletRequestDataBinderFactory(methods, getWebBindingInitializer()) { @Override 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核弹漏洞!附上最新官方解决方案

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月1日23:29:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Spring终于承认RCE核弹漏洞!附上最新官方解决方案http://cn-sec.com/archives/863265.html

发表评论

匿名网友 填写信息