
Этот репозиторий содержит набор примеров, демонстрирующих конфигурации, в которых приложения могут быть уязвимы к https://spring.io/security/cve-2023-34035[CVE-2023-34035].
Приложение уязвимо, если выполняются все следующие условия:
DispatcherServlet и как минимум еще один сервлет замаплены; один из них имеет сервлет-маппинг на основе пути (например, /path/**)requestMatchers(String) для указания конечных точек, сервлет-маппинг которых имеет вид /path/**== Примеры
Есть набор примеров, использующих 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 и как минимум еще один сервлет замаплены — один из них имеет сервлет-маппинг на основе пути, не являющийся корневым (в данном случае 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:java-configuration:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/other-servlets[Этот пример] представляет уязвимое приложение, где развернут DispatcherServlet, а также пользовательский сервлет MyServlet.
Оно уязвимо, поскольку Spring MVC находится в classpath, DispatcherServlet и как минимум еще один сервлет замаплены — один из них имеет сервлет-маппинг на основе пути, не являющийся корневым (в данном случае 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:java-configuration:two-dispatcher-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/two-dispatcher-servlets[Этот пример] представляет уязвимое приложение, где развернут DispatcherServlet, а также пользовательский сервлет MyServlet.
Оно уязвимо, поскольку Spring MVC находится в classpath, DispatcherServlet и как минимум еще один сервлет замаплены — один из них имеет сервлет-маппинг на основе пути, не являющийся корневым (в данном случае один из двух 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 и как минимум еще один сервлет замаплены — один из них имеет сервлет-маппинг на основе пути, не являющийся корневым (в данном случае 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:spring-boot:java:other-servlets
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/other-servlets[Этот пример] представляет уязвимое приложение, где развернут DispatcherServlet, а также пользовательский сервлет MyServlet.
Оно уязвимо, поскольку Spring MVC находится в classpath, DispatcherServlet и как минимум еще один сервлет замаплены — один из них имеет сервлет-маппинг на основе пути, не являющийся корневым (в данном случае 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:spring-boot:java:undertow
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/undertow[Этот пример] представляет безопасное приложение, где DispatcherServlet развернут в / (по умолчанию).
Оно не уязвимо. Хотя Spring MVC находится в classpath и DispatcherServlet используется, он развернут в /, и нет сервлет-маппингов на основе пути, не являющихся корневыми.
== Смягчение
В случае, если вы получите ошибку, подобную следующей:
requestMatchers(MvcRequestMatcher);
otherwise, please use requestMatchers(AntPathRequestMatcher).следуйте ей.
[ПРИМЕЧАНИЕ]
Версии Spring Security 5.8.5, 6.0.5, 6.1.2 и 6.2.0-M1 имеют некоторые ложные срабатывания.
Сейчас во многих случаях следующее является временным, до выхода 5.8.6, 6.0.6, 6.1.3 и 6.2.0-M2.
Как намекает сообщение об ошибке, основное смягчение — использовать полный RequestMatcher.
Это делается для того, чтобы сервлет-маппинг можно было более четко учесть.
Например, если приложение имеет сервлет, развернутый в /my-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 важно для обеспечения правильного сопоставления запроса.
== Ветки
В этом репозитории есть ветка для каждого минорного релиза Spring Security. В этой ветке есть коммит для каждого затронутого примера с необходимым смягчением.
Например, в ветке 5.8.x есть восемь коммитов для исправления восьми примеров, требующих смягчения.
Когда выйдут 5.8.6, 6.0.6, 6.1.3 и 6.2.0-M2, в эти ветки будут внесены дополнительные изменения, чтобы было ясно, как лучше всего применять смягчение.