查看原文
其他

Spring官宣网传大漏洞,附解决方案!网传方案有隐患,建议加固!

DD 程序猿DD 2022-05-14

Spring沦陷了!这样的标题这几天是不是看腻了?然而,仔细看看都是拿着之前的几个毫不相干的CVE来大吹特吹。所以,昨天发了一篇关于最近网传的Spring大漏洞的文章,聊了聊这些让人迷惑的营销文、以及提醒大家不要去下载一些利用漏洞提供补丁的钓鱼内容。而对于这个网传的漏洞,依然保持关注状态,因为确实可能存在,只是没有官宣。

就在不久前(3月31日晚),Spring社区发布了一篇名为《Spring Framework RCE, Early Announcement》的文章,官宣了最近网传的Spring漏洞。证实了网传漏洞确实存在,并且并非最近很多文章说提到的3月28、29日公布的CVE,如果你是照着那些文章解决问题的话,请根据这次官宣内容重新来过吧。

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

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

由于该漏洞被泄漏在网络上,所以Spring官方紧急发布了相关修复的版本,因为是Spring核心框架中的漏洞,所以涉及面较广。所以在这篇博文中也是在不断的持续更新进展,下面截止到本文发稿的进展时间线:

下面就来一起看看这个被网传了2天的神秘漏洞的官宣内容和解决方案。

影响范围

该漏洞的利用需要满足下面的条件:

  • JDK 9 +
  • 使用Apache Tomcat部署
  • 使用WAR方式打包
  • 依赖spring-webmvc或spring-webflux

虽然可能国内大部分用户还在用JDK 8、或者采用内置Tomcat的方式运行,但由于该漏洞的特性比较普遍,不排除其他利用方式的存在。所以,DD还是建议在有条件的情况下,尽快升到最新版本来避免可能存在的风险发生。

解决方案

因为这次不是网传,而是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+

对于该漏洞的复现及更多细节,因为篇幅有限,这里就不具体介绍了,感兴趣的小伙伴可以关注公众号程序猿DD,回复“CVE-2022-22965”,获取更深入的解析文档。

然后,这里需要特别再提一下,之前已经收到消息并有所行动的小伙伴,没猜错的话应该都是用下面的解决方案来处理的吧?

@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);
    }

}

这个方法DD在微信群里(点击加群)也看到蛮多次了。这次Spring官方推文里,证实了该方法是有效的,但可能会留下一些其他隐患,特别是当Controller通过其自己的@InitBinder方法在本地设置disalloedFields时,该方法会覆盖全局设置。

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

@SpringBootApplication
public 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

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取

版权申明:本文系公众号「程序猿DD」原创。可规范转载:完全复制全文不做删减、文首标明来源公众号与作者、文末放置来源公众号的卡片或二维码,并于本文发布24小时后发布;非规范转载、抄袭、洗稿一律投诉侵权。

推荐阅读

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书、创过业、国企4年互联网6年。10年前毕业加入宇宙行,工资不高、也不算太忙,业余坚持研究技术和做自己想做的东西。4年后离开国企,加入永辉互联网板块的创业团队,从开发、到架构、到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

点击阅读原文,送你免费Spring Boot教程

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存