尊敬的腾讯云用户,您好!
腾讯云安全运营中心监测到, Spring Framework 框架被曝出远程代码执行漏洞,漏洞编号CVE-2022-22965,该漏洞可导致远程写入、执行任意代码等危害。目前已监测到该漏洞存在在野利用,漏洞细节已经被公开传播。
为避免您的业务受影响,腾讯云安全建议您及时开展安全自查,如在受影响范围,请您及时进行更新修复,避免被外部攻击者入侵。
漏洞详情
Spring框架(Framework)是一个开源的轻量级J2EE应用程序开发框架,提供了IOC、AOP及MVC等功能,解决了程序人员在开发中遇到的常见问题,提高了应用程序开发便捷度和软件系统构建效率。
由于Spring框架历史漏洞修复代码存在缺陷,在 JDK 9 及以上版本环境下,远程攻击者可借助Tomcat中间件构造数据包修改日志文件,从而可在任意路径下写入Webshell等恶意文件,最终可导致执行任意代码控制服务器等危害。
据官方说明,目前已被泄漏的漏洞利用主要影响在 JDK 9+ 上运行的 Spring MVC 和 Spring WebFlux 应用程序。漏洞的成功利用需要应用程序作为 WAR 部署在 Tomcat 上运行。(如果应用程序按默认方式部署为 Spring Boot 可执行 jar,则不受到影响,但是不排除其他利用方法)
目前已知触发该漏洞需要满足以下条件:
1.使用 JDK9 及以上版本
2.Apache Tomcat 作为 Servlet 容器
3.打包为 WAR
4.使用 spring-webmvc 或 spring-webflux 的依赖
风险等级
高风险
漏洞风险
攻击者利用该漏洞可导致任意写入文件并远程执行任意代码,漏洞利用难度较低
影响版本
Spring Framework 5.3.X < 5.3.18
Spring Framework 5.2.X < 5.2.20
并且使用了JDK版本 >= 9
排查办法
同时满足以下条件,则受该漏洞影响:
一、检查使用的JDK 版本号:
在业务系统的运行服务器上,执行“java -version”命令查看运行的 JDK 版本(比如显示 java version "17.0.2" 这样的字段,jdk 版本即为 17;java version "1.8.0_91",jdk 版本为 8),如果JDK版本号 < 9,则不受漏洞影响。JDK版本号 >= 9,则在影响范围内.
二、判断是否使用 Spring 相关框架,如未使用则不受影响:
业务系统项目无论以 war 包形式部署运行或以 jar 包的形式独立运行,判断方法类似,可按照如下步骤进行判断:
1) 解压 war/jar 包:将 war/jar 文件的后缀修改成.zip,解压 zip 文件
2) 在解压缩目录下搜索是否存在 spring-beans-*.jar 格式的 jar 文件(如 spring-beans-5.3.11.jar),如存在则说明业务系统使用了 spring 框架进行开发。
3) 如果 spring-beans-*.jar 文件不存在,则在解压缩目录下搜索 CachedIntrospectionResuLts.class 文件是否存在,如存在则说明业务系统使用了 Spring 框架开发。
安全版本
Spring Framework = 5.3.18
Spring Framework = 5.2.20
及基于Spring Framework 5.3.18 的 Spring Boot 2.6.6 、Spring Boot 2.5.12
修复建议
由于漏洞可能存在其他利用方式,可能会扩大影响程度,优先建议升级 Spring Framework 到安全版本
临时方案1:使用 WAF 等防护设备进行拦截或检查
1、腾讯云WAF:
腾讯云WAF当前已捕获到攻击PoC,规则已支持攻击拦截(国内站规则id为106247662,国际站id为106246731),详情配置操作如下:
1) 打开WAF控制台 ,进入基础安全- Web安全 - Web安全规则,启动拦截模式。
2)客户可以在控制台界面通过新增时间筛选最新的一条规则即可看到
2、主机安全云镜(目前在规则灰度中):
1)已购买云镜专业版及旗舰版的主机,可以通过资产指纹 - 环境变量 - JAVA 看下jdk的版本,大于或等于1.9版本才可能受影响(且需使用spring框架)
3、云防火墙
1) 打开云防火墙控制台,防火墙开关中对外网资产开启防火墙开关
2) 进入入侵防护 - 勾选虚拟补丁 - 开启拦截模式
4、在WAF等网络防护设备上,根据实际部署业务的流量情况,自行对以下字符的过滤(注意:大小写不敏感)
"class.*"、"Class.*"、"*.class.*"、"*.Class.*"、"class.module.*"
并在部署过滤规则后,对业务允许情况进行测试,避免影响正常业务。
临时方案2:临时修补措施(同时使用,或选择任意一个均可缓解该漏洞):
方法1:
在应用中全局搜索@InitBinder 注解,看看方法体内是否调用 dataBinder.setDisallowedFields 方法,如果发现此代码片段的引入, 则在原来的黑名单中,添加{"class.*","Class. *","*. class.*", "*.Class.*"}。 (注:如果此代码片段使用较多,则需要每个地方都追加)
方法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(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
建议参考官方缓解措施:https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement#vulnerability
【备注】:建议您在升级前做好数据备份工作,避免出现意外
漏洞参考
https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcementhttps://tanzu.vmware.com/security/cve-2022-22965
2022-03-31