Spring已确认Spring框架中的RCE。团队刚刚发布了声明以及该问题的缓解指南。现在,此漏洞可被追踪为CVE-2022-22965。
一些关于Spring4Shell漏洞的信息已分享在Spring4Shell:详细信息与利用帖中。此外,Praetorian的安全团队已确认,在JDK9+上Spring Core存在远程代码执行漏洞,原因是绕过了CVE-2010-1622。
最初,该漏洞于3月30日被披露,KnownSec 404团队负责人Heige首次暗示了这一漏洞。他发推文警告“Spring core RCE (JDK >=9”并附带了PoC图片。

在我们报道此漏洞的同时,Heige从Twitter上消失了。原因不明,但可能另有隐情。
2021年底,互联网因Apache Log4j2中曝出的零日远程代码执行漏洞(也称为Log4Shell)而沸腾。该漏洞由阿里云安全团队发现。
今天,研究人员发现了另一个可能导致严重破坏的漏洞。该漏洞现被追踪为CVE-2022-22965,我们可称之为Spring4Shell。该漏洞存在于JDK版本大于等于9.0的Spring Core中。
Spring框架及其衍生框架spring-beans-*.jar文件或CachedIntrospectionResults.class
以下所有细节现已确认。我对任何造成的损害不承担责任。
作为世界上最流行的Java轻量级开源框架之一,Spring允许开发人员专注于业务逻辑,并简化了Java企业应用程序的开发周期。
利用需要启用DataBinder的端点(例如,自动解码请求体数据的POST请求),并且严重依赖于应用程序的Servlet容器。例如,当Spring部署到Apache Tomcat时,WebAppClassLoader可被访问,允许攻击者调用getter和setter,最终将恶意的JSP文件写入磁盘。但是,如果Spring使用嵌入式Tomcat Servlet容器部署,则类加载器是LaunchedURLClassLoader,其访问权限有限。
然而,在JDK9及以上版本的Spring框架中,远程攻击者可以在满足一定条件的基础上,通过框架的参数绑定函数获取AccessLogValve对象和恶意字段值。
在组织系统的运行服务器上,执行"java -version"命令检查运行中的JDK版本。如果版本号小于等于8,则不受该漏洞影响。
完成以上两步排查后,若同时满足以下两个条件,则可判定受此漏洞影响:
现在Spring团队已修复该漏洞并发布了依赖于Spring Framework 5.3.18的最新版本Spring Boot 2.6.6和2.5.12
在WAF等网络防护设备上,根据实际部署业务的流量情况,对"class."、"Class."、".class."、".Class."等字符串实施规则过滤。过滤规则后,测试业务运行,避免额外影响。
该漏洞的临时修复应同时执行以下两个步骤:
在应用程序中全局搜索@InitBinder注解,查看方法体内是否调用了dataBinder.setDisallowedFields方法。如果发现引入了此代码片段,则在原黑名单中添加{"class.","Class.",".class.",".Class."}。(注意:如果该代码片段多处使用,则需要在所有地方追加。)
在应用系统的项目包下创建以下全局类,并确保此类被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);
}
}

从Spring项目的Git仓库来看,Spring开发者似乎正在修复该远程代码执行漏洞,但我们仍需等待官方确认。