Spring 漏洞(CVE-2022-22965) 官方说明,附修复方案

诗与远方
2022-04-01 / 0 评论 / 949 阅读

漏洞简述

3月31日,spring 官方通报了 Spring 相关框架存在远程代码执行漏洞,并在 5.3.18 和 5.2.20.RELEASE 中修复了该漏洞。
漏洞评级: 严重
影响组件:org.springframework:spring-beans
影响版本:< 5.3.18 和 < 5.2.20.RELEASE 的Spring框架均存在该漏洞,建议用户尽快进行排查处置。

概述

我想宣布在 CVE 发布之前泄露的 Spring 框架中的一个 RCE 漏洞。该问题首先由 AntGroup FG 的 codeplutos, meizjm3i 于周二晚间,接近格林威治标准时间午夜时分向 VMware 报告。周三,我们进行了调查、分析、确定修复、测试,同时瞄准周四的紧急发布。与此同时,同样在周三,详细信息已在网上全面泄露,这就是我们在发布和 CVE 报告之前提供此更新的原因。

漏洞

该漏洞影响在 JDK 9+ 上运行的 Spring MVC 和 Spring WebFlux 应用程序。具体的利用需要应用程序作为 WAR 部署在 Tomcat 上运行。如果应用程序被部署为 Spring Boot 可执行 jar,即默认值,则它不易受到漏洞利用。但是,该漏洞的性质更为普遍,可能还有其他方法可以利用它。

我受到影响了吗?

这些是报告中特定场景的要求:

  • JDK 9 或更高版本
  • Apache Tomcat 作为 Servlet 容器
  • 打包为传统的 WAR(与 Spring Boot 可执行 jar 相比)
  • spring-webmvc或spring-webflux依赖
  • Spring Framework 版本 5.3.0 到 5.3.17、5.2.0 到 5.2.19 以及更早的版本

但是,该漏洞的性质更为普遍,可能还有其他尚未报告的利用方法。

状态

  • 包含修复的 Spring Framework 5.3.18 和 5.2.20 已发布
  • 依赖 Spring Framework 5.3.18 的 Spring Boot 2.6.6 和 2.5.12 已经发布。
  • CVE-2022-22965已发布

###建议的解决方法
注意:如果您能够升级到 Spring Framework 5.3.185.2.20,则不需要此部分。

泄露的报告建议disallowedFields 通过WebDataBinder以下方式设置@ControllerAdvice

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

}

这通常有效,但作为集中应用的解决方法修复,可能会留下一些漏洞,特别是如果控制器disallowedFields通过其自己的方法在本地@InitBinder设置,这会覆盖全局设置。

为了以更安全的方式应用解决方法,应用程序可以扩展以在所有其他初始化之后RequestMappingHandlerAdapter更新最后。WebDataBinder为此,Spring Boot 应用程序可以声明一个WebMvcRegistrationsbean (Spring MVC) 或一个WebFluxRegistrationsbean (Spring WebFlux)。

例如在 Spring MVC 中(在 WebFlux 中类似):

package car.app;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.annotation.InitBinderDataBinderFactory;
import org.springframework.web.method.support.InvocableHandlerMethod;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.ServletRequestDataBinderFactory;


@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 createRequestMappingHandlerAdapter

误解
围绕 deprecate 的承诺存在猜测SerializationUtils。此类在框架内只有一种用途,并且不暴露于外部输入。弃用与此漏洞无关。

在报告此漏洞之前发布的 Spring Cloud Function 的 CVE 存在混淆。这也是无关的。

附官方说明:https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

上一篇 下一篇
评论
说点什么吧?
OωO 取消
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)
  •  ̄﹃ ̄
  • (/ω\)
  • →_→
  • (ノ°ο°)ノ
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ
  • ╮(╯▽╰)╭
  • (。•ˇ‸ˇ•。)
  • >﹏<
  • ( ๑´•ω•)
  • "(´っω・`。)
  • "(ㆆᴗㆆ)

微信

支付宝