• Spring官宣网传大漏洞,并提供解决方案


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

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

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

    CVE-2022-22965

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

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

    Spring Framework RCE, Early Announcement - Update

    下面就来一起看看这个被网传了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方法来实现。

    好了,今天的分享就到这里!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

    参考资料

    欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

  • 相关阅读:
    linux下编译安装php
    linux下离线安装gcc g++
    linux下编译安装apache
    pg数据库
    原生js隐藏和显示滚动条
    db2_txt转mysql
    各种常见状态码
    laravel 命令生成器
    php7.4 下使用phpExcel
    Katalon Studio命名规则
  • 原文地址:https://www.cnblogs.com/didispace/p/16084906.html
Copyright © 2020-2023  润新知