漏洞詳情
CVE-2022-22978 中,在Spring Security受影響版本范圍內(nèi),若使用了存在特殊配置(含 .)的RegexRequestMatcher 的情況下可能導(dǎo)致權(quán)限繞過。
受影響版本:
5.5.0 <= Spring Security < 5.5.7
5.6.0 <= Spring Security < 5.6.4
Spring Security 更早的不受支持的版本
安全版本:
Spring Security >= 5.5.7
Spring Security >= 5.6.4
Spring Security >= 5.7.0
修復(fù)方法
修改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>
在升級完之后遇到以下問題:
1.跨域配置無效:我刪除了之前的配置,重寫了一個方法
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import java.util.Arrays;
/**
* @author hecai
* @description: TODO
* @date 2022/10/17 13:33
* @Version 1.0
*/
@Configuration
public class CorsConfig {
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOriginPatterns(Arrays.asList("*"));
config.setAllowCredentials(true);
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
//配置CorsFilter優(yōu)先級
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
2.遇到了定時任務(wù)quzarts包自動裝配數(shù)據(jù)庫無效,我修改了配置文件為:
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
public class SchedulerConfigurations {
@Autowired
DynamicRoutingDataSource dynamicDataSource;
@Bean(name = "SchedulerFactoryBeanNameCunzai")
public SchedulerFactoryBean schedulerFactoryBean() {
DataSource dataSource= dynamicDataSource.getDataSource("scheduler");
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "AmychScheduler");
prop.put("org.quartz.scheduler.instanceId", "AUTO");
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "20");
prop.put("org.quartz.threadPool.threadPriority", "5");
prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
prop.put("org.quartz.jobStore.isClustered", "true");
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
factory.setQuartzProperties(prop);
factory.setSchedulerName("AmychScheduler");
factory.setStartupDelay(30);
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
factory.setOverwriteExistingJobs(true);
factory.setAutoStartup(true);
return factory;
}
}
3.定時任務(wù)quzarts包的配置文件一開始卸載底層代碼(公司內(nèi)部封裝好的,暫時無人維護),并自動注入容器,我已經(jīng)無法修改底層代碼,所以我采取的做法是:從容器中移除這個bean,使用我修改后的文件即可
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.stereotype.Component;
/**
* @author hecai
* @description: TODO
* @date 2022/10/17 10:59
* @Version 1.0
*/
@Component
public class RemoveRegistyBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
/**
* 移出bean。 aa是bean的名稱
* @param beanDefinitionRegistry
* @throws BeansException
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
if (beanDefinitionRegistry.containsBeanDefinition("schedulerFactoryBean")){
beanDefinitionRegistry.removeBeanDefinition("schedulerFactoryBean");
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}