CVE-2020-26311
20 Nov 2024
Dernière mise à jour
20 Nov 2024
Dernière mise à jour
Voici une analyse de la vulnérabilité CVE-2020-26311 de type Regular expression Denial of Server (ReDoS) affectant la librairie useragent (https://github.com/3rd-Eden/useragent).
Vendeur : N/A
Produit : useragent (https://github.com/3rd-Eden/useragent)
Version(s) impactée(s) : *
Type de vulnérabilité : Regular expression Denial of Service (ReDoS) (CWE-1333 - Inefficient Regular Expression Complexity)
Toutes les versions (la dernière version est la 2.3.0) de useragent sont vulnérables à une faille de type ReDoS lors du parsing du User-Agent.
Le parsing du User-Agent permet d'extraire des informations telles que le nom du user-agent, sa version, ou celle du système d'exploitation, en s'appuyant sur des expressions régulières :
Ces très nombreuses (c'est-à-dire un peu moins de 1000) expressions régulières sont présentes dans le fichier regexps.js
du dossier lib
:
Malheureusement, certaines de ces expressions régulières sont vulnérables aux attaques ReDoS, ce qui peut entraîner une interruption du service. En voici quelques-unes que j'ai identifiées :
De plus, le ticket GitHub décrivant la vulnérabilité intègre également une preuve de concept (https://securitylab.github.com/advisories/GHSL-2020-312-redos-useragent/) :
La correction de ce type de vulnérabilités n'est pas toujours simple, car elle implique de modifier les expressions régulières vulnérables pour en réduire la complexité, tout en veillant à ce qu'elles continuent à détecter correctement le motif recherché.
Une première chose faisable lors de l'écriture d'une expression régulière, peut être d'utiliser un outil permettant d'en tester la sensibilité au ReDoS, tel que l'outil ReDoS checker (https://devina.io/redos-checker) :
En général, l'exploitation d'une attaque ReDoS requiert une chaîne de caractères relativement longue, en particulier lorsqu'elle est de type polynomial. Une mesure de défense en profondeur consiste donc à limiter le nombre de caractères de la chaîne à tester.
Certaines technologies permettent de mettre en place une limite du nombre de backtracks pouvant être effectués. C'est ce que propose par exemple l'option pcre.backtrack_limit
en PHP, qui possède une valeur par défaut de 1 000 000.