Un análisis detallado de la vulnerabilidad mvcRequestMatcher de Spring

El 20 de marzo de 2023, Spring Security Advisories publicó una entrada de blog sobre 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 solucionado el problema y se recomienda actualizar la versión.
¿Le gustaría vivir una experiencia de primera mano? Pruebe la misión aquí.
Dado que la seguridad es nuestro principal objetivo en Secure Code Warrior, decidimos profundizar en esta vulnerabilidad de mvcRequestMatchers y averiguar dónde reside el problema principal.
Spring proporciona la interfaz RequestMatcher para determinar si una solicitud coincide con un patrón de ruta. Eche un vistazo al fragmento de código a continuación donde se utiliza el método auxiliar mvcMatchers para registrar los puntos finales junto con sus requisitos de autenticación y autorización. Por ejemplo, podemos ver que solo los usuarios con el rol ADMIN pueden acceder al punto final /logs/audit .

¿MvcMisMatchers?
En Spring, ** es un patrón para hacer coincidir cualquier número de directorios y subdirectorios en una URL. Por ejemplo, /bankaccount/** coincidiría con todas las URL que comienzan con /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, /bankaccount/* coincidiría con bankaccount/dashboard.
Al configurar los comparadores con *, Spring afirma que se produjo "una falta de coincidencia en la correspondencia de patrones entre Spring Security y Spring MVC", lo que creó la vulnerabilidad.
Esencialmente, debido a la falta de un separador delante del comodín doble, la ruta no coincide con una solicitud entrante, ya que todas las solicitudes entrantes van precedidas de una barra diagonal. Esto significa que las reglas de control de acceso no se aplican, permitiendo que cualquier usuario no autenticado acceda a los recursos.
Echemos un vistazo al commit que solucionó el problema.

El cambio más destacado e importante es la adición de la línea 315, que soluciona 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 diagonal (/).
404 coincidencia no encontrada

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

El analizador lee el primer carácter como un SeparatorPathElement. Luego continúa leyendo los caracteres de la cadena hasta el siguiente separador, creando un nuevo LiteralPathElement.
Entonces, ¿dónde está el error al usar ** como patrón?
Aunque existen muchos tipos de elementos de ruta, los más interesantes aquí son WildcardPathElement y 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í mismos (incluidos los separadores).
Este último nos da una pista de lo que sale mal al enviar ** como patrón. Durante el análisis busca patrones, pero ** no comienza con la barra diagonal esperada. Por lo tanto, en lugar de convertirse en un WildcardTheRestPathElement, se convierte en dos WildcardPathElements consecutivos.
A continuación, el patrón analizado se utiliza para buscar coincidencias con la URL solicitada. Se espera que las rutas comiencen con una barra diagonal, pero un comodín no coincide con los separadores.

Esto significa que, en lugar de un RequestMatchResult, se devuelve un valor nulo. En consecuencia, las reglas de control de acceso aplicadas a este comparador no se aplicarán a la URL solicitada.
Spring solucionó el problema anteponiendo una barra diagonal. En otras palabras, cualquier patrón ** se convierte en /**, lo que significa que puede analizarse 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 debe considerarse una vulnerabilidad, ya que el código funciona según lo previsto. El problema radica básicamente en que la documentación de Spring carece de una mención explícita de que las rutas deben comenzar con un separador. Por lo tanto, podría considerarse más un caso de uso indebido de la API que un error o una vulnerabilidad.
Controle el desarrollo impulsado por IA antes de su lanzamiento
Mida el riesgo asistido por IA, aplique políticas de codificación segura en el momento de la confirmación y acelere la entrega segura en todo su ciclo de vida de desarrollo de software (SDLC).
Explorar más blogs
Acceda a contenido especializado sobre programación segura, gobernanza de IA y gestión de riesgos de software.

Una cultura de seguridad: cómo Sage creó su programa de defensores
Descubre cómo Sage reforzó su seguridad con un enfoque flexible y centrado en las relaciones, logrando formar a más de 200 expertos en seguridad y alcanzar una reducción de riesgos cuantificable.

Kamer van Koophandel: Seguridad a escala impulsada por los desarrolladores
La Cámara de Comercio (Kamer van Koophandel) comparte cómo integró la programación segura en el desarrollo diario mediante certificaciones basadas en roles, evaluaciones comparativas de puntuación de confianza y una cultura de responsabilidad compartida en seguridad.

Cómo un «Juego de Códigos» guía a IAG Group hacia un futuro de programación más seguro
IAG Group es la entidad detrás de muchas de las principales compañías de seguros en la región de Asia-Pacífico, que suscribe pólizas para millones de clientes por un valor aproximado de 11.400 millones de dólares australianos en primas anuales.

Mes de la Concienciación sobre Ciberseguridad 2026: Comprender la seguridad de la IA es fundamental para la defensa empresarial
Hemos llegado a un punto en el que la mayoría de las principales empresas de IA han pedido públicamente una ralentización global en el desarrollo de la IA para que las medidas de seguridad puedan ponerse al día, pero la verdad es que ya se han materializado graves problemas de seguridad. Esto deja a innumerables líderes de seguridad y equipos ejecutivos en una situación urgente, a medida que los costes monetarios y de riesgo de la implementación de la IA siguen acumulándose.

Habilitador 8: Branding de su programa
Un programa de codificación segura necesita algo más que un buen contenido para tener éxito. El Habilitador 8 muestra cómo el branding transforma la participación en una experiencia codiciada basada en el estatus.
.avif)
Cada empleado está ahora en la primera línea de la ciberseguridad de la IA
El panorama tecnológico empresarial está cambiando a una velocidad que pocos previeron hasta que fue demasiado tarde. Hemos cruzado oficialmente el umbral del código escrito por humanos y la asistencia básica de copilotos hacia la era del Ciclo de Vida de Desarrollo Agéntico (ADLC). Si bien los agentes de IA autónomos prometen una eficiencia sin precedentes en múltiples funciones, también traen consigo una clase completamente nueva de riesgos regulatorios y de seguridad.
Proteja el desarrollo basado en IA antes de su lanzamiento
Identifique riesgos de desarrollo, aplique políticas y prevenga vulnerabilidades en todo el ciclo de vida de su software.