[漏洞通告] CVE-2022-22965 Spring框架远程代码执行漏洞
发布时间:
2022-04-02 14:43
漏洞描述
Spring是J2EE应用程序框架,是轻量级IoC和AOP的容器框架,主要针对JavaBean的生命周期进行管理,可以单独使用,也可以和其他框架等配合使用。
近日,小佑科技获取到Spring 远程代码执行漏洞相关情报,攻击者可以利用此漏洞实现远程代码执行。

风险等级
Spring框架广泛地应用在中间件、Web应用中。漏洞危害性高,涉及用业务系统广泛,因此对此漏洞风险评级为:高危。
影响范围
受影响版本:
Spring Framework 5.3.x < 5.3.18
Spring Framework 5.2.x < 5.2.20
安全版本:
Spring Framework =5.3.18
Spring Framework =5.2.20
目前漏洞利用需要具备几个条件:
-
Java运行环境在JDK9及以上版本
-
应用需使用Spring框架以及衍生框架,存在spring-beans-*.jar或存在CachedIntrospectionResults.class
-
使用了Spring参数绑定
-
部署在Tomcat 容器中,且日志记录功能开启(默认开启)
“镜界”盘查受影响资产
部署了新版本“镜界”产品的用户可以一键扫描发现安全风险,如下:

未升级到新版本“镜界”产品的用户可以在平台中盘查和确认资产,确认您的资产是否受到影响,具体步骤如下:
1. 可以在业务安全-镜像安全中对镜像进行「深度扫描」

2. 对所有镜像进行深度扫描完成后在资产中心-全部资产-软件包中进行搜索”bean”、”spring_bean”、”spring bean”等相关可能涉及Spring 漏洞的软件包资产,找出spring bean关联的镜像资产。

3. 进入镜像安全-设置-镜像安全策略中设置文件规则和其他规则。
文件规则设置:因jdk部署和安装形式各异,为了减少搜索发现的遗漏,规则可设置宽泛一点,比如设置jdk检测,文件名正则设置为”.*jdk.*”

其他规则设置:
主要是环境变量的设置,可设置搜索以下环境变量JAVA_VERSION
、JAVA_HOME、CLASSPATH、PATH,为了减少搜索发现的遗漏,可以设置宽泛的搜索正则,如”.*jdk.*”

4. 通过节点镜像详情里的“关联信息”,发现实际运行中的容器,从而进一步明确是否受此漏洞影响。

5. 结合第2步和第4步的结果,找出存在相应条件的镜像或资产,既满足JDK9及以上版本,又满足spring-bean*.jar的存在,继而可以筛选出可能受影响的资产,再做下一步的处理。
自查受影响的资产
1. JDK版本检查
在业务运行的服务器上,可以执行java -version 命令来查看当前运行的JDK版本,如果版大约等于9,则受此漏洞影响。
2. Spring使用情况检查
-
如果业务系统以war/jar形式存在,请修改后缀为.zip;
-
对命名后的文件进行解压并搜索目录内是否包含spring-beans-*.jar 文件,如存在则说明使用了Spring框架;
-
如果spring-beans-*.jar不存在,则在目录下搜索CachedIntrospectionResults.class是否存在,如存在则说明使用了Spring 框架。
3. 综合判断
完成以上两个步骤后,同时满足以下条件可确定受此漏洞影响:
-
JDK版本大于等于9;
-
使用了Spring 以及衍生框架;
-
使用了Tomcat 部署业务;
-
项目中的Controller 进行了参数绑定。
修复建议
目前,Spring官方已发布漏洞修复版本,建议所有受影响的客户及时升级到修复的版本。同时也可以采取以下措施:
1. WAF防护
在WAF等网络防护设备上,根据实际部署业务的流量情况,实现对
“class.module.*”等字符串的规则过滤,并在部署过滤规则后,对业务允许情况进行测试,避免产生额外影响。
2. 临时缓解措施
在应用系统的项目包下新建以下全局类,并保证这个类被Spring 加载到(推荐在Controller 所在的包中添加).完成类添加后,需对项目进行重新编译打包和功能验证测试。并重新发布项目。
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
@ControllerAdvice
@Order(10000)
public class GlobalControllerAdvice{
@InitBinder
public void setAllowedFields(webdataBinder dataBinder){
String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};
dataBinder.setDisallowedFields(abd);
}
}
参考资料
https://github.com/spring-projects/spring-framework
https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement





