Un examen plus approfondi de la vulnérabilité de mvcRequestMatcher Spring
Le 20 mars 2023, Spring Security Advisories a publié un billet de blog faisant référence à une vulnérabilité découverte en interne, CVE-2023-20860. Aucune information détaillée n'a été divulguée, si ce n'est qu'il s'agissait d'un problème de contrôle d'accès concernant l'utilisation de mvcMatchers. Les développeurs de Spring ont remédié au problème et une mise à jour de la version est conseillée.
Souhaitez-vous vivre une expérience de première main ? Essayez la mission ici.
La sécurité étant notre principale préoccupation chez Secure Code Warriornous avons décidé de nous pencher sur la vulnérabilité de mvcRequestMatchers et de comprendre où se situe le problème.
Spring fournit l'interface RequestMatcher pour déterminer si une requête correspond à un modèle de chemin. Jetez un coup d'œil à l'extrait de code ci-dessous dans lequel la méthode d'aide mvcMatchers est utilisée pour enregistrer les points de terminaison avec leurs exigences en matière d'authentification et d'autorisation. Par exemple, nous pouvons voir que seuls les utilisateurs ayant le rôle ADMIN peuvent accéder au point de terminaison /logs/audit .

MvcMisMatchers?
Dans Spring, ** est un modèle qui permet de faire correspondre un nombre quelconque de répertoires et de sous-répertoires dans une URL. Par exemple, /bankaccount/** correspondrait à toutes les URL commençant par /bankaccount/, y compris les sous-répertoires tels que /bankaccount/dashboard/settings.
Le motif * est un motif qui correspond à n'importe quelle URL et qui comporte exactement un niveau de sous-répertoire. Par exemple, /bankaccount/* correspondrait à bankaccount/dashboard.
Lors de la configuration des filtres avec *, Spring indique qu '"une erreur dans la correspondance des motifs entre Spring Security et Spr ing MVC" s'est produite, créant ainsi la vulnérabilité.
Essentiellement, en raison de l'absence de séparateur devant le double caractère générique, le chemin ne correspond pas à une demande entrante, car toutes les demandes entrantes sont précédées d'une barre oblique. Cela signifie que les règles de contrôle d'accès ne sont pas appliquées, ce qui permet à tout utilisateur non authentifié d'accéder aux ressources.
Jetons un coup d'œil au commit qui a corrigé le problème.

La modification la plus importante est l'ajout de la ligne 315, qui corrige le contournement des règles d'autorisation et d'authentification. Elle garantit que tout modèle de chemin soumis est précédé d'une barre oblique (/).
404 correspondance non trouvée

Lors de l'envoi d'une requête web à /bankaccounts/view , la méthode match analyse et compare les motifs définis dans le filtre de sécurité avec le chemin d'accès demandé. L'analyseur transforme le motif donné en un arbre d'éléments de chemin.

L'analyseur lit le premier caractère en tant qu'élément SeparatorPathElement. Il continue ensuite à lire les caractères de la chaîne jusqu'au séparateur suivant, en créant un nouvel élément LiteralPathElement.
Où se situe le problème lorsque l'on utilise ** comme modèle ?
Bien qu'il existe de nombreux types d'éléments de chemin, les plus intéressants sont les éléments WildcardPathElementet WildcardTheRestPathElement, avec leurs représentations respectives sous forme de chaînes de caractères : * et /**.
Un WildcardPathElement correspond à zéro ou plusieurs caractères dans un seul segment de chemin, tandis qu'un WildcardTheRestPathElement correspond à zéro ou plusieurs segments de chemin seuls (y compris les séparateurs).
Cette dernière nous donne un indice sur ce qui ne va pas lorsque l'on soumet ** comme motif. Lors de l'analyse syntaxique, il recherche des motifs, mais ** ne commence pas par la barre oblique attendue. Ainsi, au lieu de devenir un WildcardTheRestPathElement, il devient deux WildcardPathElements consécutifs.
Ensuite, le motif analysé est utilisé pour établir une correspondance avec l'URL demandée. Les chemins doivent commencer par une barre oblique, mais les caractères génériques ne correspondent pas aux séparateurs.

Cela signifie qu'au lieu d'un RequestMatchResult, c'est un null qui est renvoyé. Par conséquent, les règles de contrôle d'accès placées sur ce comparateur ne seront pas appliquées à l'URL demandée.
Spring a résolu le problème en ajoutant une barre oblique. En d'autres termes, tout motif ** devient /**, ce qui signifie qu'il peut être analysé comme un WildcardTheRestPathElement, et qu'un RequestMatchResult sera renvoyé car le motif correspond désormais à l'URL demandée.
Vulnérabilité ou utilisation abusive de l'API ?
On peut se demander si cela doit être considéré comme une vulnérabilité, car le code fonctionne comme prévu. Le problème réside essentiellement dans le fait que la documentation de Spring ne mentionne pas explicitement que les chemins doivent commencer par un séparateur. Par conséquent, on pourrait considérer qu'il s'agit davantage d'un cas de mauvaise utilisation de l'API que d'un bogue ou d'une vulnérabilité.


Le 20 mars 2023, Spring Security Advisories a publié un billet de blog faisant référence à une vulnérabilité découverte en interne, CVE-2023-20860. Aucune information détaillée n'a été divulguée, si ce n'est qu'il s'agissait d'un problème de contrôle d'accès concernant l'utilisation de `mvcMatchers`. Les développeurs de Spring ont remédié au problème, et une mise à jour de la version est conseillée. La sécurité étant notre principale préoccupation sur Secure Code Warrior, nous avons décidé de nous pencher sur cette vulnérabilité mvcRequestMatchers et de comprendre où se situe le problème principal.

Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.
Réservez une démonstrationBrysen est développeur de logiciels à Secure Code Warrior et se concentre sur l'écriture de codes sécurisés.


Le 20 mars 2023, Spring Security Advisories a publié un billet de blog faisant référence à une vulnérabilité découverte en interne, CVE-2023-20860. Aucune information détaillée n'a été divulguée, si ce n'est qu'il s'agissait d'un problème de contrôle d'accès concernant l'utilisation de mvcMatchers. Les développeurs de Spring ont remédié au problème et une mise à jour de la version est conseillée.
Souhaitez-vous vivre une expérience de première main ? Essayez la mission ici.
La sécurité étant notre principale préoccupation chez Secure Code Warriornous avons décidé de nous pencher sur la vulnérabilité de mvcRequestMatchers et de comprendre où se situe le problème.
Spring fournit l'interface RequestMatcher pour déterminer si une requête correspond à un modèle de chemin. Jetez un coup d'œil à l'extrait de code ci-dessous dans lequel la méthode d'aide mvcMatchers est utilisée pour enregistrer les points de terminaison avec leurs exigences en matière d'authentification et d'autorisation. Par exemple, nous pouvons voir que seuls les utilisateurs ayant le rôle ADMIN peuvent accéder au point de terminaison /logs/audit .

MvcMisMatchers?
Dans Spring, ** est un modèle qui permet de faire correspondre un nombre quelconque de répertoires et de sous-répertoires dans une URL. Par exemple, /bankaccount/** correspondrait à toutes les URL commençant par /bankaccount/, y compris les sous-répertoires tels que /bankaccount/dashboard/settings.
Le motif * est un motif qui correspond à n'importe quelle URL et qui comporte exactement un niveau de sous-répertoire. Par exemple, /bankaccount/* correspondrait à bankaccount/dashboard.
Lors de la configuration des filtres avec *, Spring indique qu '"une erreur dans la correspondance des motifs entre Spring Security et Spr ing MVC" s'est produite, créant ainsi la vulnérabilité.
Essentiellement, en raison de l'absence de séparateur devant le double caractère générique, le chemin ne correspond pas à une demande entrante, car toutes les demandes entrantes sont précédées d'une barre oblique. Cela signifie que les règles de contrôle d'accès ne sont pas appliquées, ce qui permet à tout utilisateur non authentifié d'accéder aux ressources.
Jetons un coup d'œil au commit qui a corrigé le problème.

La modification la plus importante est l'ajout de la ligne 315, qui corrige le contournement des règles d'autorisation et d'authentification. Elle garantit que tout modèle de chemin soumis est précédé d'une barre oblique (/).
404 correspondance non trouvée

Lors de l'envoi d'une requête web à /bankaccounts/view , la méthode match analyse et compare les motifs définis dans le filtre de sécurité avec le chemin d'accès demandé. L'analyseur transforme le motif donné en un arbre d'éléments de chemin.

L'analyseur lit le premier caractère en tant qu'élément SeparatorPathElement. Il continue ensuite à lire les caractères de la chaîne jusqu'au séparateur suivant, en créant un nouvel élément LiteralPathElement.
Où se situe le problème lorsque l'on utilise ** comme modèle ?
Bien qu'il existe de nombreux types d'éléments de chemin, les plus intéressants sont les éléments WildcardPathElementet WildcardTheRestPathElement, avec leurs représentations respectives sous forme de chaînes de caractères : * et /**.
Un WildcardPathElement correspond à zéro ou plusieurs caractères dans un seul segment de chemin, tandis qu'un WildcardTheRestPathElement correspond à zéro ou plusieurs segments de chemin seuls (y compris les séparateurs).
Cette dernière nous donne un indice sur ce qui ne va pas lorsque l'on soumet ** comme motif. Lors de l'analyse syntaxique, il recherche des motifs, mais ** ne commence pas par la barre oblique attendue. Ainsi, au lieu de devenir un WildcardTheRestPathElement, il devient deux WildcardPathElements consécutifs.
Ensuite, le motif analysé est utilisé pour établir une correspondance avec l'URL demandée. Les chemins doivent commencer par une barre oblique, mais les caractères génériques ne correspondent pas aux séparateurs.

Cela signifie qu'au lieu d'un RequestMatchResult, c'est un null qui est renvoyé. Par conséquent, les règles de contrôle d'accès placées sur ce comparateur ne seront pas appliquées à l'URL demandée.
Spring a résolu le problème en ajoutant une barre oblique. En d'autres termes, tout motif ** devient /**, ce qui signifie qu'il peut être analysé comme un WildcardTheRestPathElement, et qu'un RequestMatchResult sera renvoyé car le motif correspond désormais à l'URL demandée.
Vulnérabilité ou utilisation abusive de l'API ?
On peut se demander si cela doit être considéré comme une vulnérabilité, car le code fonctionne comme prévu. Le problème réside essentiellement dans le fait que la documentation de Spring ne mentionne pas explicitement que les chemins doivent commencer par un séparateur. Par conséquent, on pourrait considérer qu'il s'agit davantage d'un cas de mauvaise utilisation de l'API que d'un bogue ou d'une vulnérabilité.

Le 20 mars 2023, Spring Security Advisories a publié un billet de blog faisant référence à une vulnérabilité découverte en interne, CVE-2023-20860. Aucune information détaillée n'a été divulguée, si ce n'est qu'il s'agissait d'un problème de contrôle d'accès concernant l'utilisation de mvcMatchers. Les développeurs de Spring ont remédié au problème et une mise à jour de la version est conseillée.
Souhaitez-vous vivre une expérience de première main ? Essayez la mission ici.
La sécurité étant notre principale préoccupation chez Secure Code Warriornous avons décidé de nous pencher sur la vulnérabilité de mvcRequestMatchers et de comprendre où se situe le problème.
Spring fournit l'interface RequestMatcher pour déterminer si une requête correspond à un modèle de chemin. Jetez un coup d'œil à l'extrait de code ci-dessous dans lequel la méthode d'aide mvcMatchers est utilisée pour enregistrer les points de terminaison avec leurs exigences en matière d'authentification et d'autorisation. Par exemple, nous pouvons voir que seuls les utilisateurs ayant le rôle ADMIN peuvent accéder au point de terminaison /logs/audit .

MvcMisMatchers?
Dans Spring, ** est un modèle qui permet de faire correspondre un nombre quelconque de répertoires et de sous-répertoires dans une URL. Par exemple, /bankaccount/** correspondrait à toutes les URL commençant par /bankaccount/, y compris les sous-répertoires tels que /bankaccount/dashboard/settings.
Le motif * est un motif qui correspond à n'importe quelle URL et qui comporte exactement un niveau de sous-répertoire. Par exemple, /bankaccount/* correspondrait à bankaccount/dashboard.
Lors de la configuration des filtres avec *, Spring indique qu '"une erreur dans la correspondance des motifs entre Spring Security et Spr ing MVC" s'est produite, créant ainsi la vulnérabilité.
Essentiellement, en raison de l'absence de séparateur devant le double caractère générique, le chemin ne correspond pas à une demande entrante, car toutes les demandes entrantes sont précédées d'une barre oblique. Cela signifie que les règles de contrôle d'accès ne sont pas appliquées, ce qui permet à tout utilisateur non authentifié d'accéder aux ressources.
Jetons un coup d'œil au commit qui a corrigé le problème.

La modification la plus importante est l'ajout de la ligne 315, qui corrige le contournement des règles d'autorisation et d'authentification. Elle garantit que tout modèle de chemin soumis est précédé d'une barre oblique (/).
404 correspondance non trouvée

Lors de l'envoi d'une requête web à /bankaccounts/view , la méthode match analyse et compare les motifs définis dans le filtre de sécurité avec le chemin d'accès demandé. L'analyseur transforme le motif donné en un arbre d'éléments de chemin.

L'analyseur lit le premier caractère en tant qu'élément SeparatorPathElement. Il continue ensuite à lire les caractères de la chaîne jusqu'au séparateur suivant, en créant un nouvel élément LiteralPathElement.
Où se situe le problème lorsque l'on utilise ** comme modèle ?
Bien qu'il existe de nombreux types d'éléments de chemin, les plus intéressants sont les éléments WildcardPathElementet WildcardTheRestPathElement, avec leurs représentations respectives sous forme de chaînes de caractères : * et /**.
Un WildcardPathElement correspond à zéro ou plusieurs caractères dans un seul segment de chemin, tandis qu'un WildcardTheRestPathElement correspond à zéro ou plusieurs segments de chemin seuls (y compris les séparateurs).
Cette dernière nous donne un indice sur ce qui ne va pas lorsque l'on soumet ** comme motif. Lors de l'analyse syntaxique, il recherche des motifs, mais ** ne commence pas par la barre oblique attendue. Ainsi, au lieu de devenir un WildcardTheRestPathElement, il devient deux WildcardPathElements consécutifs.
Ensuite, le motif analysé est utilisé pour établir une correspondance avec l'URL demandée. Les chemins doivent commencer par une barre oblique, mais les caractères génériques ne correspondent pas aux séparateurs.

Cela signifie qu'au lieu d'un RequestMatchResult, c'est un null qui est renvoyé. Par conséquent, les règles de contrôle d'accès placées sur ce comparateur ne seront pas appliquées à l'URL demandée.
Spring a résolu le problème en ajoutant une barre oblique. En d'autres termes, tout motif ** devient /**, ce qui signifie qu'il peut être analysé comme un WildcardTheRestPathElement, et qu'un RequestMatchResult sera renvoyé car le motif correspond désormais à l'URL demandée.
Vulnérabilité ou utilisation abusive de l'API ?
On peut se demander si cela doit être considéré comme une vulnérabilité, car le code fonctionne comme prévu. Le problème réside essentiellement dans le fait que la documentation de Spring ne mentionne pas explicitement que les chemins doivent commencer par un séparateur. Par conséquent, on pourrait considérer qu'il s'agit davantage d'un cas de mauvaise utilisation de l'API que d'un bogue ou d'une vulnérabilité.

Cliquez sur le lien ci-dessous et téléchargez le PDF de cette ressource.
Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.
Voir le rapportRéservez une démonstration
Essayez notre mission pour en mesurer l'impact et apprendre comment éviter de commettre une erreur similaire.
Essayez-le maintenantBrysen est développeur de logiciels à Secure Code Warrior et se concentre sur l'écriture de codes sécurisés.
Le 20 mars 2023, Spring Security Advisories a publié un billet de blog faisant référence à une vulnérabilité découverte en interne, CVE-2023-20860. Aucune information détaillée n'a été divulguée, si ce n'est qu'il s'agissait d'un problème de contrôle d'accès concernant l'utilisation de mvcMatchers. Les développeurs de Spring ont remédié au problème et une mise à jour de la version est conseillée.
Souhaitez-vous vivre une expérience de première main ? Essayez la mission ici.
La sécurité étant notre principale préoccupation chez Secure Code Warriornous avons décidé de nous pencher sur la vulnérabilité de mvcRequestMatchers et de comprendre où se situe le problème.
Spring fournit l'interface RequestMatcher pour déterminer si une requête correspond à un modèle de chemin. Jetez un coup d'œil à l'extrait de code ci-dessous dans lequel la méthode d'aide mvcMatchers est utilisée pour enregistrer les points de terminaison avec leurs exigences en matière d'authentification et d'autorisation. Par exemple, nous pouvons voir que seuls les utilisateurs ayant le rôle ADMIN peuvent accéder au point de terminaison /logs/audit .

MvcMisMatchers?
Dans Spring, ** est un modèle qui permet de faire correspondre un nombre quelconque de répertoires et de sous-répertoires dans une URL. Par exemple, /bankaccount/** correspondrait à toutes les URL commençant par /bankaccount/, y compris les sous-répertoires tels que /bankaccount/dashboard/settings.
Le motif * est un motif qui correspond à n'importe quelle URL et qui comporte exactement un niveau de sous-répertoire. Par exemple, /bankaccount/* correspondrait à bankaccount/dashboard.
Lors de la configuration des filtres avec *, Spring indique qu '"une erreur dans la correspondance des motifs entre Spring Security et Spr ing MVC" s'est produite, créant ainsi la vulnérabilité.
Essentiellement, en raison de l'absence de séparateur devant le double caractère générique, le chemin ne correspond pas à une demande entrante, car toutes les demandes entrantes sont précédées d'une barre oblique. Cela signifie que les règles de contrôle d'accès ne sont pas appliquées, ce qui permet à tout utilisateur non authentifié d'accéder aux ressources.
Jetons un coup d'œil au commit qui a corrigé le problème.

La modification la plus importante est l'ajout de la ligne 315, qui corrige le contournement des règles d'autorisation et d'authentification. Elle garantit que tout modèle de chemin soumis est précédé d'une barre oblique (/).
404 correspondance non trouvée

Lors de l'envoi d'une requête web à /bankaccounts/view , la méthode match analyse et compare les motifs définis dans le filtre de sécurité avec le chemin d'accès demandé. L'analyseur transforme le motif donné en un arbre d'éléments de chemin.

L'analyseur lit le premier caractère en tant qu'élément SeparatorPathElement. Il continue ensuite à lire les caractères de la chaîne jusqu'au séparateur suivant, en créant un nouvel élément LiteralPathElement.
Où se situe le problème lorsque l'on utilise ** comme modèle ?
Bien qu'il existe de nombreux types d'éléments de chemin, les plus intéressants sont les éléments WildcardPathElementet WildcardTheRestPathElement, avec leurs représentations respectives sous forme de chaînes de caractères : * et /**.
Un WildcardPathElement correspond à zéro ou plusieurs caractères dans un seul segment de chemin, tandis qu'un WildcardTheRestPathElement correspond à zéro ou plusieurs segments de chemin seuls (y compris les séparateurs).
Cette dernière nous donne un indice sur ce qui ne va pas lorsque l'on soumet ** comme motif. Lors de l'analyse syntaxique, il recherche des motifs, mais ** ne commence pas par la barre oblique attendue. Ainsi, au lieu de devenir un WildcardTheRestPathElement, il devient deux WildcardPathElements consécutifs.
Ensuite, le motif analysé est utilisé pour établir une correspondance avec l'URL demandée. Les chemins doivent commencer par une barre oblique, mais les caractères génériques ne correspondent pas aux séparateurs.

Cela signifie qu'au lieu d'un RequestMatchResult, c'est un null qui est renvoyé. Par conséquent, les règles de contrôle d'accès placées sur ce comparateur ne seront pas appliquées à l'URL demandée.
Spring a résolu le problème en ajoutant une barre oblique. En d'autres termes, tout motif ** devient /**, ce qui signifie qu'il peut être analysé comme un WildcardTheRestPathElement, et qu'un RequestMatchResult sera renvoyé car le motif correspond désormais à l'URL demandée.
Vulnérabilité ou utilisation abusive de l'API ?
On peut se demander si cela doit être considéré comme une vulnérabilité, car le code fonctionne comme prévu. Le problème réside essentiellement dans le fait que la documentation de Spring ne mentionne pas explicitement que les chemins doivent commencer par un séparateur. Par conséquent, on pourrait considérer qu'il s'agit davantage d'un cas de mauvaise utilisation de l'API que d'un bogue ou d'une vulnérabilité.
Table des matières

Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.
Réservez une démonstrationTéléchargerRessources pour vous aider à démarrer
AI Coding Assistants : Un guide de navigation sécurisée pour la prochaine génération de développeurs
Les grands modèles linguistiques offrent des avantages irrésistibles en termes de rapidité et de productivité, mais ils présentent également des risques indéniables pour l'entreprise. Les garde-fous traditionnels ne suffisent pas à contrôler le déluge. Les développeurs ont besoin de compétences précises et vérifiées en matière de sécurité pour identifier et prévenir les failles de sécurité dès le début du cycle de développement du logiciel.
Sécurité dès la conception : Définir les meilleures pratiques, permettre aux développeurs et évaluer les résultats de la sécurité préventive
Dans ce document de recherche, les cofondateurs de Secure Code Warrior , Pieter Danhieux et Matias Madou, Ph.D., ainsi que des contributeurs experts, Chris Inglis, ancien directeur national américain de la cybernétique (aujourd'hui conseiller stratégique du Paladin Capital Group), et Devin Lynch, directeur principal du Paladin Global Institute, révèleront les principales conclusions de plus de vingt entretiens approfondis avec des responsables de la sécurité des entreprises, y compris des RSSI, un vice-président de la sécurité des applications et des professionnels de la sécurité des logiciels.
Ressources pour vous aider à démarrer
Définir la norme : SCW publie des règles de sécurité gratuites pour le codage de l'IA sur GitHub
Le développement assisté par IA n'est plus un horizon : il est bel et bien là, et il transforme rapidement la manière dont les logiciels sont écrits. Des outils comme GitHub Copilot, Cline, Roo, Cursor, Aider et Windsurf transforment les développeurs en copilotes, permettant des itérations plus rapides et accélérant tout, du prototypage aux projets de refactorisation majeurs.
Bouclez la boucle des vulnérabilités avec Secure Code Warrior + HackerOne
Secure Code Warrior est heureux d'annoncer sa nouvelle intégration avec HackerOne, un leader dans les solutions de sécurité offensive. Ensemble, nous construisons un écosystème puissant et intégré. HackerOne met le doigt sur les vulnérabilités dans les environnements réels, en exposant le "quoi" et le "où" des problèmes de sécurité.
Révélation : Comment l'industrie du cyberespace définit la notion de "Secure by Design" (sécurité dès la conception)
Dans notre dernier livre blanc, nos cofondateurs, Pieter Danhieux et Matias Madou, Ph.D., ont rencontré plus de vingt responsables de la sécurité d'entreprise, notamment des RSSI, des responsables AppSec et des professionnels de la sécurité, afin d'identifier les principales pièces de ce puzzle et de découvrir la réalité qui se cache derrière le mouvement Secure by Design. Il s'agit d'une ambition partagée par les équipes de sécurité, mais il n'y a pas de manuel de jeu commun.