このリポジトリは、アプリケーションが https://spring.io/security/cve-2023-34035[CVE-2023-34035] に対して脆弱になりうる構成を示すサンプルセットです。
アプリケーションは、以下のすべてが当てはまる場合に脆弱です。
DispatcherServlet と少なくとも 1 つの他のサーブレットがマッピングされている。そのうちの 1 つにパスベースのサーブレットマッピング(例: /path/**)がある。/path/** 形式のエンドポイントを参照するために requestMatchers(String) を使用している。== サンプル
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 がクラスパス上にあり、DispatcherServlet と少なくとも 1 つの他のサーブレットがマッピングされており(そのうちの 1 つはルート以外のパスベースのサーブレットマッピング(この場合は DispatcherServlet)を持ち)、アプリケーションがそれらのエンドポイントを保護するために requestMatchers(String) を使用しているため、脆弱です。
=== servlet:java-configuration:jetty
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/jetty[このサンプル] は、DispatcherServlet が /(デフォルト)にデプロイされている安全なアプリケーションを表します。
これは脆弱ではありません。Spring MVC がクラスパス上にあり、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 がクラスパス上にあり、DispatcherServlet と少なくとも 1 つの他のサーブレットがマッピングされており(そのうちの 1 つはルート以外のパスベースのサーブレットマッピング(この場合は MyServlet)を持ち)、アプリケーションがそれらのエンドポイントを保護するために requestMatchers(String) を使用しているため、脆弱です。
=== servlet:java-configuration:tomcat
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/java-configuration/tomcat[このサンプル] は、DispatcherServlet が /(デフォルト)にデプロイされている安全なアプリケーションを表します。
これは脆弱ではありません。Spring MVC がクラスパス上にあり、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 がクラスパス上にあり、DispatcherServlet と少なくとも 1 つの他のサーブレットがマッピングされており(そのうちの 1 つはルート以外のパスベースのサーブレットマッピング(この場合は 2 つの DispatcherServlets のうちの 1 つ)を持ち)、アプリケーションがそれらのエンドポイントを保護するために 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 がクラスパス上にあり、DispatcherServlet と少なくとも 1 つの他のサーブレットがマッピングされており(そのうちの 1 つはルート以外のパスベースのサーブレットマッピング(この場合は 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 がクラスパス上にあり、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 がクラスパス上にあり、DispatcherServlet と少なくとも 1 つの他のサーブレットがマッピングされており(そのうちの 1 つはルート以外のパスベースのサーブレットマッピング(この場合は 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 がクラスパス上にあり、DispatcherServlet が使用されていますが、/ にデプロイされており、ルート以外のパスベースのサーブレットマッピングはありません。
=== servlet:spring-boot:java:undertow
https://github.com/jzheaux/cve-2023-34035-mitigations/tree/main/servlet/spring-boot/java/undertow[このサンプル] は、DispatcherServlet が /(デフォルト)にデプロイされている安全なアプリケーションを表します。
これは脆弱ではありません。Spring MVC がクラスパス上にあり、DispatcherServlet が使用されていますが、/ にデプロイされており、ルート以外のパスベースのサーブレットマッピングはありません。
== 軽減策
次のようなエラーが発生した場合:
requestMatchers(MvcRequestMatcher);
otherwise, please use requestMatchers(AntPathRequestMatcher).それに従う必要があります。
[注記]
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 を使用することです。
これにより、サーブレットマッピングをより明確に考慮できるようになります。
たとえば、アプリケーションが /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 ブランチには、軽減策が必要な 8 つのサンプルを修正するための 8 つのコミットがあります。
5.8.6、6.0.6、6.1.3、6.2.0-M2 がリリースされると、それらのブランチに追加の変更が加えられ、ベストプラクティスの軽減策が明確になります。