在未打补丁的 Grails Spring Security Core (GSSC) 插件中发现的漏洞 CVE-2022-41923 可能导致不恰当的权限管理。本代码库描述了如何绕过该问题。
如果您正在使用未打补丁版本的插件,我们强烈建议您升级到已修补的版本。如果您无法立即升级,我们鼓励您实施本文档中描述的变通方案。 如果您使用的是 GSSC 插件 2.x 版本,这一点尤其重要,因为没有为 2.x 版本提供补丁。
为了正确配置变通方案,您需要了解以下信息:
您的应用程序使用的 GSSC 插件版本。请在您的 build.gradle 文件中查找版本号。(对于 Grails 2.x,在 BuildConfig.groovy 文件中查找。)
您使用的安全配置类型:即 grails.plugin.springsecurity.securityConfigType 的配置值。
| 配置值 | 文档参考 |
|---|---|
Annotation (默认) | Secured 注解 |
InterceptUrlMap | 静态映射 |
Requestmap | Requestmap 实例 |
注意:在以下所有说明和配置中,均使用了 demo 包。请根据您的应用程序以及您放置补丁源文件的位置适当更改此包。
根据您的安全配置类型确定所需的变通方案类。
| 配置值 | 变通方案类 |
|---|---|
Annotation | PatchedAnnotationFilterInvocationDefinition |
InterceptUrlMap | PatchedInterceptUrlMapFilterInvocationDefinition |
Requestmap | PatchedRequestmapFilterInvocationDefinition |
将对应的源文件复制到您的 src/main/groovy 源码树中。
最后,将以下配置添加到您的 application.groovy 配置文件中,并将 PatchedAnnotationFilterInvocationDefinition 替换为所需的变通方案类。
grails.plugin.springsecurity.objectDefinitionSourceBeanClass = 'demo.PatchedAnnotationFilterInvocationDefinition'
如上所述,根据您的安全配置类型确定所需的变通方案类。将对应的源文件复制到您的 src/groovy 源码树中。然后根据您的应用程序安全配置类型编辑 bean 配置。
如果使用安全配置类型 Annotation,编辑 grails-app/conf/spring/resources.groovy 并包含:
import demo.PatchedAnnotationFilterInvocationDefinition
import grails.plugin.springsecurity.SpringSecurityUtils
beans = {
def conf = SpringSecurityUtils.securityConfig
objectDefinitionSource(demo.PatchedAnnotationFilterInvocationDefinition) {
application = ref('grailsApplication')
grailsUrlConverter = ref('grailsUrlConverter')
responseMimeTypesApi = ref('responseMimeTypesApi')
boolean lowercase = conf.controllerAnnotations.lowercase
if (conf.rejectIfNoRule instanceof Boolean) {
rejectIfNoRule = conf.rejectIfNoRule
}
}
// ... 现有的 bean 配置 ...
}
如果使用安全配置类型 InterceptUrlMap,编辑 grails-app/conf/spring/resources.groovy 并包含:
import demo.PatchedInterceptUrlMapFilterInvocationDefinition
import grails.plugin.springsecurity.SpringSecurityUtils
beans = {
def conf = SpringSecurityUtils.securityConfig
objectDefinitionSource(demo.PatchedInterceptUrlMapFilterInvocationDefinition) {
if (conf.rejectIfNoRule instanceof Boolean) {
rejectIfNoRule = conf.rejectIfNoRule
}
}
// ... 现有的 bean 配置 ...
}
如果使用安全配置类型 Requestmap,编辑 grails-app/conf/spring/resources.groovy 并包含:
import demo.PatchedRequestmapFilterInvocationDefinition
import grails.plugin.springsecurity.SpringSecurityUtils
beans = {
def conf = SpringSecurityUtils.securityConfig
objectDefinitionSource(demo.PatchedRequestmapFilterInvocationDefinition) {
if (conf.rejectIfNoRule instanceof Boolean) {
rejectIfNoRule = conf.rejectIfNoRule
}
}
// ... 现有的 bean 配置 ...
}
有关此漏洞的更多信息,请参阅 Grails 博客文章。
讨论和问题可指向此 Grails Spring Security Core 插件的 GitHub 问题。