Spring Security RegexRequestMatcher 认证绕过漏洞(CVE-2022-22978)
一、漏洞详情
当Spring-security使用 RegexRequestMatcher 进行权限配置,由于RegexRequestMatcher正则表达式配置权限的特性,正则表达式中包含“.”时,未经身份验证攻击者可以通过构造恶意数据包绕过身份认证。
二、影响版本
Spring Security 5.5.x < 5.5.7
Spring Security 5.6.x < 5.6.4
SpringSecurity其他低版本同样受影响
安全版本
Spring Security >= 5.5.7
Spring Security >= 5.6.4
Spring Security >= 5.7.0
三、处置建议
升级到官方已发布的最新版本:
Spring Security 5.5.x升级至 5.5.7:
https://github/spring-projects/spring-security/releases/tag/5.5.7
Spring Security 5.6.x升级至5.6.4 ∶
https://github/spring-projects/spring-security/releases/tag/5.6.4
四、版本依赖
Spring Boot Spring Security 是否受CVE-2022-22978影响
2.5.13 5.5.6 是
2.5.14 5.5.8 否(可用)
2.6.5 5.6.2 是
2.6.7 5.6.3 是
2.6.8 5.6.5 否(可用)
五、解决方案
1、直接升级Security 的jar包版本
修改pom.xml文件
<properties>
<spring-security.version>5.5.8</spring-security.version>
</properties>
需要将springboot版本同步升级才能生效
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.14</version>
<relativePath/>
</parent>
但是升级springboot版本会造成项目中一些相关的jar包依赖冲突,根据自己的项目对应修改。
2、只升级Security 的核心jar包
修改核心jar包版本
<properties>
<!--<spring-security.version>5.5.8</spring-security.version>-->
<core.version>5.7.8</core.version>
</properties>
引入依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${core.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${core.version}</version>
</dependency>
同时忽略掉spring boot security 自带的版本jar包,相关的引入依赖都忽略掉
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</exclusion>
</exclusions>
</dependency>
注:引入依赖会产生jar冲突
查询Maven 项目查找 jar 包是由哪个依赖引入的
直接使用mvn dependency:tree可以查看项目完整的依赖树。
命令格式如下:
mvn dependency:tree -Dverbose -Dincludes=要查询的内容(groupId:artifactId)
-dependency:tree:表示树状显示。
-Dverbose:表示可以显示所有的引用,包括因为多次引用重复而忽略的。
-Dincludes:可以制定查询条件
spring-security-web的groupId和artifactId为:
groupId: org.springframework.security
artifactId: spring-security-web
所以命令为
mvn dependency:tree -Dverbose -Dincludes=org.springframework.security:spring-security-web
根据控制台的jar包依赖排序,一一排查重复引用的jar包,在对应的pom模块中忽略掉旧版本就可以!
以上仅供参考学习!