导读
昨晚,另一枚重磅炸弹在技术界引爆,不,这次不是Log4j,而是Spring:犯罪分子可以远程执行恶意代码,导致任何文件读取,DOS攻击等危害,甚至导致业务服务器被攻陷。
考虑到Spring它是世界上最受欢迎的轻量级Java开发框架,全球安全从业者,睡不好觉。
图源:网友在网上对此事的反映
事件回顾
3月29日,Spring框架曝出RCE 0day漏洞。已证实是因为 SerializationUtils#deserialize 基于Java序列化机制可导致远程代码执行(RCE),使用JDK9以上版本可能会受到影响。
广东网络安全应急安全应急响应中心连夜发布预警通知,发现漏洞可能已被远程攻击者利用。Spring框架的广泛应用,FreeBuf对漏洞级为:危险。
在Spring框架的JDK9在版本(以上版本)中,远程攻击者可以通过框架参数绑定功能获得,以满足特定条件AccessLogValve对象,如恶意字段值,触发pipeline将文件写入任何路径。
已知触发漏洞需要满足两个基本条件:
- 使用JDK9以上版本Spring MVC框架
- Spring 框架和衍生框架spring-beans-*.jar 文件或存在CachedIntrospectionResults.class
漏洞影响范围:
JDK9 <= Spring Cloud Function
执行“java-version可以查看命令JDK版本
目前Spring官此漏洞相关的补丁文件尚未正式发布。POC也没有公开。考虑到自3月29日起已在小范围内传播,鉴于Spring MVC的广泛应用,各企业仍需警惕远程攻击者,并采用广东省网络安全应急响应中心公布临时方案加强防护。同时要密切关注。Spring发布官方补丁。
临时方案1:WAF临时策略
在WAF在网络防护设备上,根据业务流量的实际部署,实现class.*”,“Class.*”,“*.class.*”,“*.Class.*过滤等字符串的规则,部署过滤规则后,测试业务允许性,避免额外影响。
临时方案2:临时缓解措施2:临时缓解措施
在应用系统的项目包下新建以下全局类,并保证这个类被Spring加载到(推荐在Controller在包中添加).类别添加完成后,需要对项目进行重新编译、包装和功能验证测试。并重新发布项目。
(10000)
public class a{
public void setAllowedFields(WebDataBinder dataBinder) {
String[] abd = new String[]{"class.*","Class.*","*.class.*","*.Class.*"};
dataBinder.setDisallowedFields(abd);
}
}
细数Spring漏洞
事实上,如果我们回顾一下Spring框架的发展过程会发现这不是Spring该框架首次被曝光。
2009年9月Spring 3.0 RC1发布后,Spring就引入了SpEL (Spring Expression Language)。
SpEL是基于spring表达式语言类似于struts的OGNL,一些运算甚至一些指令可以在运行过程中动态执行,类似于Java反射功能。
类比Struts2框架会发现大部分安全漏洞和OGNL脱不了干系。尤其是远程命令执行漏洞,这导致Struts2越来越不受欢迎。
因此,Spring引入SpEL必然会增加安全风险。事实也是如此。过去有很多Spring CVE都与之相关:
1.Spring Security OAuth2 执行远程命令(CVE-2016-4977)
漏洞简介:Spring Security OAuth2是为Spring提供安全认证支持的框架模块。Spring Security OAuth2如果在处理认证请求时使用认证请求whitelabel views,response_type参数值将被视为Spring SpEL为了执行,攻击者可以在被授权的情况下构建它response_type即通过构造恶意SpEL表达式可以触发远程代码执行漏洞。因此,在使用该漏洞之前,需要了解帐户密码。
2.Spring Web Flow框架远程代码执行(CVE-2017-4971)
漏洞简介:Spring Web Flow是Spring子项目的主要目的是解决用户与服务器之间的状态交互问题,提供描述业务流程的抽象能力。
Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以分离流程的定义和实现流程行为的类别和视图。2.4.x如果我们中,如果我们控制数据绑定field,将导致一个SpEL表达式注入漏洞,最终导致任何命令执行。
3.Spring Data Rest远程命令执行命令(CVE-2017-8046)
漏洞简介:Spring-data-rest处理服务器PATCH攻击者时,攻击者可以构成恶意PATCH并发送请求spring-date-rest通过构造服务器JSON任意执行数据Java代码。
4.Spring Messaging远程命令执行突破(CVE-2018-1270)
漏洞简介:spring messaging为spring框架提供消息支持,上层协议是STOMP,基于底层通信SockJS,STOMP处理客户端消息时,消息代理存在SpEL表达式注入漏洞,在spring messaging其中,允许客户订阅并使用消息selector过滤消息。selector用SpEL并使用表达式编写StandardEvaluationContext分析,导致命令执行漏洞。
5.Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
漏洞简介:Spring Data 是一个开源框架,用于简化数据库访问,支持云服务,Spring Data Commons 是 Spring Data 所有子项目共享的基本框架。Spring Data Commons 在 2.0.5 及以前版本中有一个 SpEL 表达式注入漏洞,攻击者可注入恶意 SpEL 表达式执行任何命令。
除上述漏洞外,不久前还有上述漏洞Spring大多数人一定对发布的漏洞印象深刻:
今年3月1日,Spring官方发布了Spring Cloud Gateway的两个CVE漏洞,分别是CVE-2022-22946(严重性:Medium)与CVE-2022-22947(代码注入漏洞,严重性:Critical)。
(1)HTTP2不安全的TrustManager(CVE-2022-22946):Spring Cloud Gateway 如果配置并启用HTTP2,未设置密钥存储或信任证书Spring Cloud Gateway远程服务可以连接到无效或自定义的证书。
(2)远程代码执行漏洞(CVE-2022-22947):当Spring Cloud Gateway Actuator 端点被启用和暴露时,使用Spring Cloud Gateway远程代码注入攻击的风险是,攻击者可以远程发出恶意攻击请求,允许在远程服务器上执行任何代码。
危机的启示
这次Spring框架曝出的0day漏洞可以算是比较Log4j2漏洞大的核弹让很多人措手不及。
考虑到升级到受影响的影响JDK9 版本,这个事件也可以给我们一些启示:无论是在开发还是生产环境中,都没有必要使用最新版本的软件,只需要使用最稳定版本的软件。