Overview
Le parseur llhttp du module http dans plusieurs versions de Node.js n'utilise pas strictement la séquence CRLF pour délimiter les requêtes HTTP, ce qui peut conduire à la contrebande de requêtes HTTP (HTTP Request Smuggling - HRS).
La contrebande de requêtes HTTP interfère avec l'exécution correcte des requêtes par un serveur HTTP. Les ramifications possibles de cet exploit comprennent l'accès non autorisé à un système, la possibilité pour un attaquant de modifier des données (dans des bases de données, des comptes d'utilisateurs et d'autres enregistrements), le détournement de session, la divulgation d'informations, l'empoisonnement de la mémoire cache et le déni de service.
Ce problème affecte les versions suivantes de Node.js : 16.0.0 jusqu'à (mais excluant) 16.20.1, 18.0.0 jusqu'à (mais excluant) 18.16.1 et 20.0.0 jusqu'à (mais excluant) 20.3.1.
Détails
Informations sur le module
Paquets affectés : llhttp
Versions de Node.js concernées : 14 LTS
Dépôt : https://github.com/nodejs/node
Paquets publiés : Node
Gestionnaire de paquets : npm
Informations sur les vulnérabilités
Cette vulnérabilité de haute sévérité est présente dans de nombreuses versions de la bibliothèque llhttp. Bien que la section 3 de la RFC7230 indique que seule la séquence CRLF doit délimiter chaque champ d'en-tête, les versions vulnérables de la bibliothèque autorisent uniquement le caractère CR (sans LF) pour délimiter les champs d'en-tête HTTP.
Cette bibliothèque étant fournie avec Node.js, de nombreuses versions de Node.js dans les branches v16, v18 et v20 sont concernées.
Il n'y a pas de solution de rechange.
Étapes de la reproduction
- Installer une version vulnérable de Node sur un serveur.
- Créer une requête HTTP qui, au lieu d'utiliser \r\n (CRLF), utilise seulement \r (CR) pour terminer les champs d'en-tête. Dans l'exemple ci-dessous, la première requête se termine uniquement par \r, ce qui permet potentiellement à la seconde requête d'être passée en fraude (cachée ou mal interprétée par certaines couches du serveur web). La seconde requête est correctement formée car elle se termine par \r\n.
POST / HTTP/1.1
Host: example.com
Content-Type : application/x-www-form-urlencoded
Content-Length : 11\r
Cookie: session=abc123\r
\r
data=payload1
POST /secret HTTP/1.1
Host: example.com
Content-Type : application/x-www-form-urlencoded
Content-Length : 11
\r\n
data=payload2
Il n'existe pas de solution de contournement.
Atténuation
Tous les utilisateurs doivent mettre à jour leur version de Node sans cette vulnérabilité.
Ressources complémentaires
- Entrée NIST
https://nvd.nist.gov/vuln/detail/CVE-2023-30589 - https://github.com/advisories/GHSA-cggh-pq45-6h9x
Soyez alerté chaque fois qu'une nouvelle vulnérabilité est corrigée dans les logiciels open source que nous soutenons.