当前位置: 首页 > 科技观察

Spring框架存在0day漏洞!你准备好回滚了吗?

时间:2023-03-17 19:12:56 科技观察

导读昨晚,又一重磅炸弹在技术圈引爆,不,这次不是Log4j,而是Spring:不法分子可以在目标主机上远程执行恶意代码,导致任意文件读取,等危害DOS攻击甚至可能导致业务服务器受到损害。考虑到Spring是全球最流行的轻量级Java开发框架,全球的安全从业者又睡不着觉了。图片来源:网上网友对此事的反应回顾3月29日,Spring框架暴露了RCE0day漏洞。已经确认,由于SerializationUtils#deserialize是基于Java的序列化机制,会导致远程代码执行(RCE),JDK9及以上版本可能会受到影响。相关监控发现该漏洞可能已被远程攻击者利用。广东省网络安全应急中心连夜发布预警通知。考虑到Spring框架的广泛应用,FreeBuf对该漏洞的评级为:危险。在Spring框架的JDK9版本(及以上)中,远程攻击者可以在满足一定条件的基础上,通过框架的参数绑定功能获取AccessLogValve对象和恶意字段值,从而触发管道机制,编写到文件下的任何路径。目前已知触发该漏洞需要满足两个基本条件:使用JDK9及以上版本的SpringMVC框架SpringFramework及其派生框架spring-beans-*.jar文件或存在CachedIntrospectionResults.class漏洞影响范围:JDK9<=SpringCloudFunction执行“java-version”命令查看JDK版本。目前Spring官方并未发布与该漏洞相关的补丁文件,相关漏洞POC也未公开。考虑到3月29日开始小范围蔓延,鉴于SpringMVC的广泛应用,企业仍需警惕远程攻击者,使用广东省网络安全应急中心公布的临时预案加强保护。同时大家要密切关注Spring官方补丁的发布。临时方案一:在WAF等网络防护设备上实施WAF临时策略,根据实际部署业务的流量情况,实施“class.*”、“Class.*”、“*.class.*”、“*.Class.*”等字符串规则进行过滤,部署过滤规则后,测试业务权限,避免额外影响。临时解决方案二:临时缓解措施在应用系统的工程包下创建如下全局类,并保证该类被Spring加载(建议添加到Controller所在包中)。添加类后,需要对项目进行重新编译打包和功能验证测试。并重新发布项目。importorg.springframework.web.bind.annotation.InitBinder;@ControllerAdvice@Order(10000)publicclassa{@InitBinderpublicvoidsetAllowedFields(WebDataBinderdataBinder){String[]abd=newString[]{"class.*","Class.*","*.class.*","*.Class.*"};dataBinder.setDisallowedFields(abd);}}Spring漏洞分解其实如果我们回顾一下Spring框架的发展历程,我们会发现这并不是Spring框架第一次被曝出漏洞。2009年9月Spring3.0RC1发布后,Spring引入了SpEL(SpringExpressionLanguage)。SpEL是一种基于spring的表达式语言,类似于struts的OGNL,可以在运行时动态执行一些操作甚至一些指令,类似于Java的反射功能。类比Struts2框架,你会发现大部分的安全漏洞都离不开OGNL。尤其是远程命令执行漏洞,让Struts2越来越不受欢迎。因此,Spring引入SpEL必然会增加安全隐患。事实也是如此,过去曾有多个SpringCVE与之相关:1.SpringSecurityOAuth2远程命令执行(CVE-2016-4977)漏洞介绍:SpringSecurityOAuth2是一个提供安全认证支持的模块弹簧框架。如果在SpringSecurityOAuth2处理认证请求时使用whitelabel视图,response_type参数值将作为SpringSpEL执行,攻击者可以通过构造response_type值触发远程代码,即在授权时构造恶意SpEL表达式执行漏洞。因此,该漏洞只能在知道账号密码的前提下被利用。2、SpringWebFlowFramework远程代码执行(CVE-2017-4971)漏洞简介:SpringWebFlow是Spring的一个子项目,主要目的是解决用户和服务器之间跨多个请求的有状态交互问题,提供描述业务流程的抽象能力。SpringWebFlow是一个适合开发基于流程的应用程序(如购物逻辑)的框架,它可以将流程的定义与实现流程行为的类和视图分离。在其2.4.x版本中,如果我们在数据绑定时控制字段,将导致SpEL表达式注入漏洞,最终导致任意命令执行。3、SpringDataRest远程命令执行命令(CVE-2017-8046)漏洞简介:当Spring-data-rest服务器处理PATCH请求时,攻击者可以构造恶意PATCH请求发送给spring-date-rest服务器,通过构造JSON数据来执行任意Java代码。4、SpringMessaging远程命令执行突破(CVE-2018-1270)漏洞介绍:springmessaging为spring框架提供消息支持。它的上层协议是STOMP,底层通信是基于SockJS。STOMP消息代理在处理客户端消息时存在SpEL表达式类型注入漏洞,在springmessaging中允许客户端订阅消息并使用selector过滤消息。选择器使用SpEL表达式编写,使用StandardEvaluationContext解析,导致命令执行漏洞。5、SpringDataCommons远程命令执行漏洞(CVE-2018-1273)漏洞简介:SpringData是一个用于简化数据库访问和支持云服务的开源框架。SpringDataCommons是SpringDataframe下所有子项目共享的基础。SpringDataCommons2.0.5及之前版本存在SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式执行任意命令。除了上述漏洞,大多数人对不久前发布的Spring漏洞肯定还有印象:今年3月1日,Spring官方发布了SpringCloudGateway的两个CVE漏洞,分别为CVE-2022-22946(严重性:中)和CVE-2022-22947(代码注入漏洞,严重性:严重)。(1)HTTP2不安全的TrustManager(CVE-2022-22946):SpringCloudGateway如果配置并启用了HTTP2,并且没有设置密钥存储或可信证书,SpringCloudGateway可以通过无效或自定义证书连接到远程服务。(2)远程代码执行漏洞(CVE-2022-22947):当SpringCloudGatewayActuator端点启用并暴露时,使用SpringCloudGateway的应用程序将面临远程代码注入攻击的风险,即攻击者可以远程发出恶意允许在远程服务器上执行任意代码的攻击请求。危机的启示此次Spring框架曝光的0day漏洞堪称一颗比Log4j2漏洞更大的核弹,让很多人措手不及。考虑到受影响的版本是升级到JDK9+的版本,这件事也能给我们一些启示:无论是在开发环境还是生产环境,都没有必要使用最新版本的软件,只需要最稳定的版本即可软件就够了。