此仓库是一组示例,用于演示应用程序可能受到 https://spring.io/security/cve-2023-34035[CVE-2023-34035] 影响的情况。
当以下所有条件都成立时,应用程序存在漏洞:
DispatcherServlet 和至少一个其他 Servlet 被映射;其中一个具有基于路径的 Servlet 映射(例如 /path/**)requestMatchers(String) 来引用其 Servlet 映射形式为 /path/** 的端点== 示例
这里有使用 Spring Boot 和不使用 Spring Boot 的示例。
包含失败测试的示例对 CVE-2023-34035 存在漏洞。测试通过的示例则不存在漏洞。
在所有情况下,每个示例都包含来自 Spring Security 的相同缓解错误,但需要注意的是,这种缓解措施在许多情况下是临时的,需等待下一个维护版本发布。
=== servlet:java-configuration:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/dispatcher-servlet-path[此示例] 代表一个存在漏洞的应用程序,其中 DispatcherServlet 被部署到 /mvc/* 而非默认的 /。
它是 存在漏洞 的,因为 Spring MVC 在 classpath 上,DispatcherServlet 和至少一个其他 Servlet 被映射——其中一个是基于非根路径的 Servlet 映射(在本例中是 DispatcherServlet),并且应用程序使用 requestMatchers(String) 来保护这些端点。
=== servlet:java-configuration:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/jetty[此示例] 代表一个安全的应用程序,其中 DispatcherServlet 被部署到 /(默认)。
它是 不存在漏洞 的。虽然 Spring MVC 在 classpath 上且使用了 DispatcherServlet,但它被部署到 /,并且没有基于非根路径的 Servlet 映射。
=== servlet:java-configuration:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/other-servlets[此示例] 代表一个存在漏洞的应用程序,其中部署了 DispatcherServlet 以及一个自定义 Servlet MyServlet。
它是 存在漏洞 的,因为 Spring MVC 在 classpath 上,DispatcherServlet 和至少一个其他 Servlet 被映射——其中一个是基于非根路径的 Servlet 映射(在本例中是 MyServlet),并且应用程序使用 requestMatchers(String) 来保护这些端点。
=== servlet:java-configuration:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/tomcat[此示例] 代表一个安全的应用程序,其中 DispatcherServlet 被部署到 /(默认)。
它是 不存在漏洞 的。虽然 Spring MVC 在 classpath 上且使用了 DispatcherServlet,但它被部署到 /,并且没有基于非根路径的 Servlet 映射。
=== servlet:java-configuration:two-dispatcher-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/two-dispatcher-servlets[此示例] 代表一个存在漏洞的应用程序,其中部署了 DispatcherServlet 以及一个自定义 Servlet MyServlet。
它是 存在漏洞 的,因为 Spring MVC 在 classpath 上,DispatcherServlet 和至少一个其他 Servlet 被映射——其中一个是基于非根路径的 Servlet 映射(在本例中是两个 DispatcherServlet 之一),并且应用程序使用 requestMatchers(String) 来保护这些端点。
=== servlet:spring-boot:java:dispatcher-servlet-path
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/dispatcher-servlet-path[此示例] 代表一个存在漏洞的应用程序,其中 DispatcherServlet 被部署到 /mvc/* 而非默认的 /。
它是 存在漏洞 的,因为 Spring MVC 在 classpath 上,DispatcherServlet 和至少一个其他 Servlet 被映射——其中一个是基于非根路径的 Servlet 映射(在本例中是 DispatcherServlet),并且应用程序使用 requestMatchers(String) 来保护这些端点。
=== servlet:spring-boot:java:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/jetty[此示例] 代表一个安全的应用程序,其中 DispatcherServlet 被部署到 /(默认)。
它是 不存在漏洞 的。虽然 Spring MVC 在 classpath 上且使用了 DispatcherServlet,但它被部署到 /,并且没有基于非根路径的 Servlet 映射。
=== servlet:spring-boot:java:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/other-servlets[此示例] 代表一个存在漏洞的应用程序,其中部署了 DispatcherServlet 以及一个自定义 Servlet MyServlet。
它是 存在漏洞 的,因为 Spring MVC 在 classpath 上,DispatcherServlet 和至少一个其他 Servlet 被映射——其中一个是基于非根路径的 Servlet 映射(在本例中是 MyServlet),并且应用程序使用 requestMatchers(String) 来保护这些端点。
=== servlet:spring-boot:java:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/tomcat[此示例] 代表一个安全的应用程序,其中 DispatcherServlet 被部署到 /(默认)。
它是 不存在漏洞 的。虽然 Spring MVC 在 classpath 上且使用了 DispatcherServlet,但它被部署到 /,并且没有基于非根路径的 Servlet 映射。
=== servlet:spring-boot:java:undertow
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/undertow[此示例] 代表一个安全的应用程序,其中 DispatcherServlet 被部署到 /(默认)。
它是 不存在漏洞 的。虽然 Spring MVC 在 classpath 上且使用了 DispatcherServlet,但它被部署到 /,并且没有基于非根路径的 Servlet 映射。
== 缓解措施
如果遇到如下错误:
requestMatchers(MvcRequestMatcher);
otherwise, please use requestMatchers(AntPathRequestMatcher).请遵循该错误的指示。
[NOTE]
5.8.5、6.0.5、6.1.2 和 6.2.0-M1 版本的 Spring Security 存在一些误报。现在,在许多情况下,以下措施是临时的,需等待 5.8.6、6.0.6、6.1.3 和 6.2.0-M2 发布。
如错误消息所示,主要的缓解措施是使用完整的 RequestMatcher。这是为了能够更清晰地考虑 Servlet 映射。
例如,如果应用程序有一个部署到 /my-servlet/* 的 Servlet,并按如下方式授权该流量:
那么,应用程序应改为:
import static org.springframework.security.web.util.matcher.AntPathRequestMatcher.antMatcher;
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector); }
或者,如果 DispatcherServlet 部署到不同的路径,例如 /spring-mvc/*,那么将:
改为:
@Bean MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { return new MvcRequestMatcher.Builder(introspector).servletPath("/spring-mvc"); }
在构建 MvcRequestMatcher 时分离 Servlet 路径对于确保请求被正确匹配非常重要。
== 分支
在此仓库中,每个 Spring Security 的次要版本都有一个分支。在该分支上,每个受影响的示例都有一个包含所需缓解措施的提交。
例如,在 5.8.x 分支上,有八个提交来修复需要缓解措施的八个示例。
当 5.8.6、6.0.6、6.1.3 和 6.2.0-M2 发布时,将对这些分支进行额外修改,以便明确最佳实践的缓解措施。