Iconos SCW
héroe bg sin separador
Blog

仔细研究 MVCrequestMatcher Spring 漏洞

Brysen Ackx
Publicado el 19 de abril de 2023
Última actualización el 9 de marzo de 2026

El 20 de marzo de 2023, Spring Security Advisories publicó una entrada de blog que hacía referencia a una vulnerabilidad descubierta internamente, CVE-2023-20860. No se reveló información detallada, salvo que se trataba de un problema de control de acceso relacionado con el uso de mvcMatchers. Los desarrolladores de Spring han corregido el problema y se recomienda actualizar la versión.

¿Quiere vivir una experiencia de primera mano? Pruebe la misión aquí.

Como la seguridad es nuestro principal objetivo en Secure Code Warriorhemos decidido profundizar en esta vulnerabilidad de mvcRequestMatchers y averiguar dónde está el problema.

Spring proporciona la interfaz RequestMatcher para determinar si una solicitud coincide con un patrón de ruta. Echa un vistazo al siguiente fragmento de código donde se utiliza el método de ayuda mvcMatchers para registrar los puntos finales junto con sus requisitos de autenticación y autorización. Por ejemplo, podemos ver que sólo los usuarios con el rol ADMIN pueden acceder al endpoint /logs/audit

¿MvcMisMatchers?

En Spring, ** es un patrón que permite buscar cualquier número de directorios y subdirectorios en una URL. Por ejemplo, /bankaccount/** coincidiría con todas las URL que empiecen por /bankaccount/, incluidos subdirectorios como /bankaccount/dashboard/settings

El patrón * es un patrón que coincide con cualquier URL y tiene exactamente un nivel de subdirectorio. Por ejemplo, /cuentabancaria/* coincidiría con cuenta bancaria/cuadro de mandos.

Al configurar los matchers con *, Spring afirma que se produjo "un desajuste en la concordancia de patrones entre Spring Security y Spr ing MVC", creando la vulnerabilidad.

Esencialmente, debido a la falta de un separador delante del doble comodín, la ruta no coincide con una solicitud entrante, ya que todas las solicitudes entrantes van precedidas de una barra. Esto significa que las reglas de control de acceso no se aplican y permiten a cualquier usuario no autenticado acceder a los recursos.

Echemos un vistazo al commit que ha solucionado el problema.

El cambio más destacado e importante es la adición de la línea 315, que corrige la omisión de las reglas de autorización y autenticación. Garantiza que cualquier patrón de ruta que se envíe vaya precedido de una barra oblicua (/). 

404 coincidencia no encontrada

Clase PathPatternMatchableHandlerMapping (Fuente spring-framework)

Al enviar una petición web a /cuentasbancarias/vista , el método match analizará y comparará los patrones definidos en el filtro de seguridad con la ruta solicitada. El analizador sintáctico convertirá el patrón dado en un árbol de elementos de ruta.

El analizador lee el primer carácter como un SeparatorPathElement. A continuación, continúa leyendo los caracteres de la cadena hasta el siguiente separador, creando un nuevo LiteralPathElement.

Entonces, ¿dónde falla cuando se utiliza ** como patrón? 

Aunque existen muchos tipos de elementos de ruta, los más interesantes son WildcardPathElementy WildcardTheRestPathElement, con sus respectivas representaciones de cadena: * y /**. 

Un WildcardPathElement coincide con cero o más caracteres dentro de un único segmento de ruta, mientras que un WildcardTheRestPathElement coincide con cero o más segmentos de ruta por sí solos (incluidos los separadores).

Esto último nos da una pista de lo que falla al enviar ** como patrón. Durante el análisis busca patrones, pero ** no empieza con la barra oblicua esperada. Así que en lugar de convertirse en un WildcardTheRestPathElement, se convierte en dos WildcardPathElements consecutivos.

A continuación, el patrón analizado se utiliza para comparar con la URL solicitada. Se espera que las rutas empiecen por una barra oblicua, pero los comodines no coinciden con los separadores.

Extracto de WildCardPathElement.java

Esto significa que en lugar de un RequestMatchResult, se devuelve un null. En consecuencia, las reglas de control de acceso establecidas en este comparador no se aplicarán a la URL solicitada.

Spring ha solucionado el problema añadiendo una barra. En otras palabras, cualquier patrón ** se convierte en /**, lo que significa que puede ser analizado como un WildcardTheRestPathElement, y se devolverá un RequestMatchResult ya que el patrón ahora coincide con la URL solicitada.

¿Vulnerabilidad o uso indebido de la API?

Es discutible si esto debería considerarse una vulnerabilidad, ya que el código funciona como se pretende. El problema radica básicamente en el hecho de que la documentación de Spring no menciona explícitamente que las rutas deban comenzar con un separador. Por lo tanto, podría considerarse más un caso de mal uso de la API que un error o vulnerabilidad.

黄色几何抽象背景上的骷髅图标
黄色几何抽象背景上的骷髅图标
Ver recursos
Ver recursos

2023 年 3 月 20 日,Spring Security Advisories 发布了一篇博客文章,引用了内部发现的漏洞 CVE-2023-20860。没有透露任何详细信息,只是这是与使用 “mvcMatchers” 有关的访问控制问题。Spring 开发人员已经修复了这个问题,建议进行版本更新。由于安全是我们在Secure Code Warrior的主要关注点,因此我们决定更深入地研究这个MvcRequestMatchers漏洞,找出核心问题所在。

¿Te interesa saber más?

Más información

Secure Code Warrior puede ayudar a su organización a proteger el código a lo largo de todo el ciclo de vida del desarrollo de software y a crear una cultura que dé prioridad a la ciberseguridad. Tanto si es usted responsable de seguridad de aplicaciones, desarrollador, director de seguridad de la información o cualquier otra persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados al código inseguro.

Reservar una demostración
Compartir en:
marcas de LinkedInSocialx logotipo
Autor
Brysen Ackx
Publicado el 19 de abril de 2023

Brysen es desarrollador de software en Secure Code Warrior y se centra en escribir código seguro.

Compartir en:
marcas de LinkedInSocialx logotipo
黄色几何抽象背景上的骷髅图标
黄色几何抽象背景上的骷髅图标

El 20 de marzo de 2023, Spring Security Advisories publicó una entrada de blog que hacía referencia a una vulnerabilidad descubierta internamente, CVE-2023-20860. No se reveló información detallada, salvo que se trataba de un problema de control de acceso relacionado con el uso de mvcMatchers. Los desarrolladores de Spring han corregido el problema y se recomienda actualizar la versión.

¿Quiere vivir una experiencia de primera mano? Pruebe la misión aquí.

Como la seguridad es nuestro principal objetivo en Secure Code Warriorhemos decidido profundizar en esta vulnerabilidad de mvcRequestMatchers y averiguar dónde está el problema.

Spring proporciona la interfaz RequestMatcher para determinar si una solicitud coincide con un patrón de ruta. Echa un vistazo al siguiente fragmento de código donde se utiliza el método de ayuda mvcMatchers para registrar los puntos finales junto con sus requisitos de autenticación y autorización. Por ejemplo, podemos ver que sólo los usuarios con el rol ADMIN pueden acceder al endpoint /logs/audit

¿MvcMisMatchers?

En Spring, ** es un patrón que permite buscar cualquier número de directorios y subdirectorios en una URL. Por ejemplo, /bankaccount/** coincidiría con todas las URL que empiecen por /bankaccount/, incluidos subdirectorios como /bankaccount/dashboard/settings

El patrón * es un patrón que coincide con cualquier URL y tiene exactamente un nivel de subdirectorio. Por ejemplo, /cuentabancaria/* coincidiría con cuenta bancaria/cuadro de mandos.

Al configurar los matchers con *, Spring afirma que se produjo "un desajuste en la concordancia de patrones entre Spring Security y Spr ing MVC", creando la vulnerabilidad.

Esencialmente, debido a la falta de un separador delante del doble comodín, la ruta no coincide con una solicitud entrante, ya que todas las solicitudes entrantes van precedidas de una barra. Esto significa que las reglas de control de acceso no se aplican y permiten a cualquier usuario no autenticado acceder a los recursos.

Echemos un vistazo al commit que ha solucionado el problema.

El cambio más destacado e importante es la adición de la línea 315, que corrige la omisión de las reglas de autorización y autenticación. Garantiza que cualquier patrón de ruta que se envíe vaya precedido de una barra oblicua (/). 

404 coincidencia no encontrada

Clase PathPatternMatchableHandlerMapping (Fuente spring-framework)

Al enviar una petición web a /cuentasbancarias/vista , el método match analizará y comparará los patrones definidos en el filtro de seguridad con la ruta solicitada. El analizador sintáctico convertirá el patrón dado en un árbol de elementos de ruta.

El analizador lee el primer carácter como un SeparatorPathElement. A continuación, continúa leyendo los caracteres de la cadena hasta el siguiente separador, creando un nuevo LiteralPathElement.

Entonces, ¿dónde falla cuando se utiliza ** como patrón? 

Aunque existen muchos tipos de elementos de ruta, los más interesantes son WildcardPathElementy WildcardTheRestPathElement, con sus respectivas representaciones de cadena: * y /**. 

Un WildcardPathElement coincide con cero o más caracteres dentro de un único segmento de ruta, mientras que un WildcardTheRestPathElement coincide con cero o más segmentos de ruta por sí solos (incluidos los separadores).

Esto último nos da una pista de lo que falla al enviar ** como patrón. Durante el análisis busca patrones, pero ** no empieza con la barra oblicua esperada. Así que en lugar de convertirse en un WildcardTheRestPathElement, se convierte en dos WildcardPathElements consecutivos.

A continuación, el patrón analizado se utiliza para comparar con la URL solicitada. Se espera que las rutas empiecen por una barra oblicua, pero los comodines no coinciden con los separadores.

Extracto de WildCardPathElement.java

Esto significa que en lugar de un RequestMatchResult, se devuelve un null. En consecuencia, las reglas de control de acceso establecidas en este comparador no se aplicarán a la URL solicitada.

Spring ha solucionado el problema añadiendo una barra. En otras palabras, cualquier patrón ** se convierte en /**, lo que significa que puede ser analizado como un WildcardTheRestPathElement, y se devolverá un RequestMatchResult ya que el patrón ahora coincide con la URL solicitada.

¿Vulnerabilidad o uso indebido de la API?

Es discutible si esto debería considerarse una vulnerabilidad, ya que el código funciona como se pretende. El problema radica básicamente en el hecho de que la documentación de Spring no menciona explícitamente que las rutas deban comenzar con un separador. Por lo tanto, podría considerarse más un caso de mal uso de la API que un error o vulnerabilidad.

Ver recursos
Ver recursos

Rellene el siguiente formulario para descargar el informe.

Nos gustaría obtener su permiso para enviarle información sobre nuestros productos y/o temas relacionados con la codificación de seguridad. Trataremos su información personal con el máximo cuidado y nunca la venderemos a otras empresas con fines comerciales.

Enviar
Icono de éxito de SCW
Icono de error scw
Para enviar el formulario, habilite las cookies de análisis. Una vez completado, puede desactivarlas nuevamente si lo desea.
黄色几何抽象背景上的骷髅图标

El 20 de marzo de 2023, Spring Security Advisories publicó una entrada de blog que hacía referencia a una vulnerabilidad descubierta internamente, CVE-2023-20860. No se reveló información detallada, salvo que se trataba de un problema de control de acceso relacionado con el uso de mvcMatchers. Los desarrolladores de Spring han corregido el problema y se recomienda actualizar la versión.

¿Quiere vivir una experiencia de primera mano? Pruebe la misión aquí.

Como la seguridad es nuestro principal objetivo en Secure Code Warriorhemos decidido profundizar en esta vulnerabilidad de mvcRequestMatchers y averiguar dónde está el problema.

Spring proporciona la interfaz RequestMatcher para determinar si una solicitud coincide con un patrón de ruta. Echa un vistazo al siguiente fragmento de código donde se utiliza el método de ayuda mvcMatchers para registrar los puntos finales junto con sus requisitos de autenticación y autorización. Por ejemplo, podemos ver que sólo los usuarios con el rol ADMIN pueden acceder al endpoint /logs/audit

¿MvcMisMatchers?

En Spring, ** es un patrón que permite buscar cualquier número de directorios y subdirectorios en una URL. Por ejemplo, /bankaccount/** coincidiría con todas las URL que empiecen por /bankaccount/, incluidos subdirectorios como /bankaccount/dashboard/settings

El patrón * es un patrón que coincide con cualquier URL y tiene exactamente un nivel de subdirectorio. Por ejemplo, /cuentabancaria/* coincidiría con cuenta bancaria/cuadro de mandos.

Al configurar los matchers con *, Spring afirma que se produjo "un desajuste en la concordancia de patrones entre Spring Security y Spr ing MVC", creando la vulnerabilidad.

Esencialmente, debido a la falta de un separador delante del doble comodín, la ruta no coincide con una solicitud entrante, ya que todas las solicitudes entrantes van precedidas de una barra. Esto significa que las reglas de control de acceso no se aplican y permiten a cualquier usuario no autenticado acceder a los recursos.

Echemos un vistazo al commit que ha solucionado el problema.

El cambio más destacado e importante es la adición de la línea 315, que corrige la omisión de las reglas de autorización y autenticación. Garantiza que cualquier patrón de ruta que se envíe vaya precedido de una barra oblicua (/). 

404 coincidencia no encontrada

Clase PathPatternMatchableHandlerMapping (Fuente spring-framework)

Al enviar una petición web a /cuentasbancarias/vista , el método match analizará y comparará los patrones definidos en el filtro de seguridad con la ruta solicitada. El analizador sintáctico convertirá el patrón dado en un árbol de elementos de ruta.

El analizador lee el primer carácter como un SeparatorPathElement. A continuación, continúa leyendo los caracteres de la cadena hasta el siguiente separador, creando un nuevo LiteralPathElement.

Entonces, ¿dónde falla cuando se utiliza ** como patrón? 

Aunque existen muchos tipos de elementos de ruta, los más interesantes son WildcardPathElementy WildcardTheRestPathElement, con sus respectivas representaciones de cadena: * y /**. 

Un WildcardPathElement coincide con cero o más caracteres dentro de un único segmento de ruta, mientras que un WildcardTheRestPathElement coincide con cero o más segmentos de ruta por sí solos (incluidos los separadores).

Esto último nos da una pista de lo que falla al enviar ** como patrón. Durante el análisis busca patrones, pero ** no empieza con la barra oblicua esperada. Así que en lugar de convertirse en un WildcardTheRestPathElement, se convierte en dos WildcardPathElements consecutivos.

A continuación, el patrón analizado se utiliza para comparar con la URL solicitada. Se espera que las rutas empiecen por una barra oblicua, pero los comodines no coinciden con los separadores.

Extracto de WildCardPathElement.java

Esto significa que en lugar de un RequestMatchResult, se devuelve un null. En consecuencia, las reglas de control de acceso establecidas en este comparador no se aplicarán a la URL solicitada.

Spring ha solucionado el problema añadiendo una barra. En otras palabras, cualquier patrón ** se convierte en /**, lo que significa que puede ser analizado como un WildcardTheRestPathElement, y se devolverá un RequestMatchResult ya que el patrón ahora coincide con la URL solicitada.

¿Vulnerabilidad o uso indebido de la API?

Es discutible si esto debería considerarse una vulnerabilidad, ya que el código funciona como se pretende. El problema radica básicamente en el hecho de que la documentación de Spring no menciona explícitamente que las rutas deban comenzar con un separador. Por lo tanto, podría considerarse más un caso de mal uso de la API que un error o vulnerabilidad.

Ver el seminario web
Empecemos.
Más información

Haga clic en el siguiente enlace y descargue el PDF de este recurso.

Secure Code Warrior puede ayudar a su organización a proteger el código a lo largo de todo el ciclo de vida del desarrollo de software y a crear una cultura que dé prioridad a la ciberseguridad. Tanto si es usted responsable de seguridad de aplicaciones, desarrollador, director de seguridad de la información o cualquier otra persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados al código inseguro.

Ver informeReservar una demostración
Ver recursos
Compartir en:
marcas de LinkedInSocialx logotipo
¿Te interesa saber más?

试试我们的使命,亲身体验影响,学习如何避免犯类似的错误。

现在就试试吧
Compartir en:
marcas de LinkedInSocialx logotipo
Autor
Brysen Ackx
Publicado el 19 de abril de 2023

Brysen es desarrollador de software en Secure Code Warrior y se centra en escribir código seguro.

Compartir en:
marcas de LinkedInSocialx logotipo

El 20 de marzo de 2023, Spring Security Advisories publicó una entrada de blog que hacía referencia a una vulnerabilidad descubierta internamente, CVE-2023-20860. No se reveló información detallada, salvo que se trataba de un problema de control de acceso relacionado con el uso de mvcMatchers. Los desarrolladores de Spring han corregido el problema y se recomienda actualizar la versión.

¿Quiere vivir una experiencia de primera mano? Pruebe la misión aquí.

Como la seguridad es nuestro principal objetivo en Secure Code Warriorhemos decidido profundizar en esta vulnerabilidad de mvcRequestMatchers y averiguar dónde está el problema.

Spring proporciona la interfaz RequestMatcher para determinar si una solicitud coincide con un patrón de ruta. Echa un vistazo al siguiente fragmento de código donde se utiliza el método de ayuda mvcMatchers para registrar los puntos finales junto con sus requisitos de autenticación y autorización. Por ejemplo, podemos ver que sólo los usuarios con el rol ADMIN pueden acceder al endpoint /logs/audit

¿MvcMisMatchers?

En Spring, ** es un patrón que permite buscar cualquier número de directorios y subdirectorios en una URL. Por ejemplo, /bankaccount/** coincidiría con todas las URL que empiecen por /bankaccount/, incluidos subdirectorios como /bankaccount/dashboard/settings

El patrón * es un patrón que coincide con cualquier URL y tiene exactamente un nivel de subdirectorio. Por ejemplo, /cuentabancaria/* coincidiría con cuenta bancaria/cuadro de mandos.

Al configurar los matchers con *, Spring afirma que se produjo "un desajuste en la concordancia de patrones entre Spring Security y Spr ing MVC", creando la vulnerabilidad.

Esencialmente, debido a la falta de un separador delante del doble comodín, la ruta no coincide con una solicitud entrante, ya que todas las solicitudes entrantes van precedidas de una barra. Esto significa que las reglas de control de acceso no se aplican y permiten a cualquier usuario no autenticado acceder a los recursos.

Echemos un vistazo al commit que ha solucionado el problema.

El cambio más destacado e importante es la adición de la línea 315, que corrige la omisión de las reglas de autorización y autenticación. Garantiza que cualquier patrón de ruta que se envíe vaya precedido de una barra oblicua (/). 

404 coincidencia no encontrada

Clase PathPatternMatchableHandlerMapping (Fuente spring-framework)

Al enviar una petición web a /cuentasbancarias/vista , el método match analizará y comparará los patrones definidos en el filtro de seguridad con la ruta solicitada. El analizador sintáctico convertirá el patrón dado en un árbol de elementos de ruta.

El analizador lee el primer carácter como un SeparatorPathElement. A continuación, continúa leyendo los caracteres de la cadena hasta el siguiente separador, creando un nuevo LiteralPathElement.

Entonces, ¿dónde falla cuando se utiliza ** como patrón? 

Aunque existen muchos tipos de elementos de ruta, los más interesantes son WildcardPathElementy WildcardTheRestPathElement, con sus respectivas representaciones de cadena: * y /**. 

Un WildcardPathElement coincide con cero o más caracteres dentro de un único segmento de ruta, mientras que un WildcardTheRestPathElement coincide con cero o más segmentos de ruta por sí solos (incluidos los separadores).

Esto último nos da una pista de lo que falla al enviar ** como patrón. Durante el análisis busca patrones, pero ** no empieza con la barra oblicua esperada. Así que en lugar de convertirse en un WildcardTheRestPathElement, se convierte en dos WildcardPathElements consecutivos.

A continuación, el patrón analizado se utiliza para comparar con la URL solicitada. Se espera que las rutas empiecen por una barra oblicua, pero los comodines no coinciden con los separadores.

Extracto de WildCardPathElement.java

Esto significa que en lugar de un RequestMatchResult, se devuelve un null. En consecuencia, las reglas de control de acceso establecidas en este comparador no se aplicarán a la URL solicitada.

Spring ha solucionado el problema añadiendo una barra. En otras palabras, cualquier patrón ** se convierte en /**, lo que significa que puede ser analizado como un WildcardTheRestPathElement, y se devolverá un RequestMatchResult ya que el patrón ahora coincide con la URL solicitada.

¿Vulnerabilidad o uso indebido de la API?

Es discutible si esto debería considerarse una vulnerabilidad, ya que el código funciona como se pretende. El problema radica básicamente en el hecho de que la documentación de Spring no menciona explícitamente que las rutas deban comenzar con un separador. Por lo tanto, podría considerarse más un caso de mal uso de la API que un error o vulnerabilidad.

Índice

Descargar PDF
Ver recursos
¿Te interesa saber más?

Más información

Secure Code Warrior puede ayudar a su organización a proteger el código a lo largo de todo el ciclo de vida del desarrollo de software y a crear una cultura que dé prioridad a la ciberseguridad. Tanto si es usted responsable de seguridad de aplicaciones, desarrollador, director de seguridad de la información o cualquier otra persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados al código inseguro.

Reservar una demostraciónDescargar
Compartir en:
marcas de LinkedInSocialx logotipo
Centro de recursos

Recursos para ayudarle a empezar

Más publicaciones
Centro de recursos

Recursos para ayudarle a empezar

Más publicaciones