HD-2024-1407

Contrebande de requêtes HTTP
Affectations
Node.js
4.21.3 LTS
en
Node.js
Node.js NES
Icône de cercle d'exclamation
Patch disponible
Cette vulnérabilité a été corrigée dans la version Never-Ending Support (NES) proposée par HeroDevs.

‍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

Détails de la vulnérabilité
ID
HD-2024-1407
PROJET concerné
Node.js
Versions concernées
4.21.3 LTS
Date de publication
16 octobre 2024
≈ Date fixe
30 juin 2024
Fixé en
Sévérité
Haut
Catégorie
Contrebande de requêtes HTTP