Contexte technique
Node.js intègre le module zlib pour gérer les algorithmes de compression courants, dont Brotli, un format développé par Google pour optimiser la taille des ressources web. Depuis la version 10, le support natif de Brotli est activé dans le runtime, permettant aux applications de compresser et de décompresser des flux HTTP sans dépendance externe. Le décodage s'effectue via une liaison C++ vers la bibliothèque brotli, qui transforme les blocs compressés en buffers JavaScript.
Le titre de la source indique qu'une anomalie affecte le décodeur Brotli de Node.js et que cette anomalie est présente dans « toutes les versions prises en charge ». Cela implique que le problème persiste depuis plusieurs cycles de version, y compris les versions LTS couramment déployées en production.
Mécanisme de la vulnérabilité
Le bug réside dans la façon dont le moteur JavaScript gère les buffers retournés par la fonction native de décompression. Une mauvaise validation des tailles de sortie peut conduire à un dépassement de tampon lorsqu'un flux Brotli spécialement forgé est traité. Le dépassement permet à un attaquant d'écrire des octets hors des limites prévues, ce qui, dans le contexte d'un processus Node.js, ouvre la possibilité d'injecter du code exécutable.
Le flux d'attaque typique commence par l'envoi d'une requête HTTP contenant un corps compressé au format Brotli. Le serveur, en appelant zlib.brotliDecompress() ou l'équivalent asynchrone, déclenche la routine native. Si le corps est construit pour exploiter la faille, le dépassement de tampon se produit avant que le contrôle ne revienne au code JavaScript, ce qui contourne les mécanismes de sandboxing du runtime.
Implications et mesures d'atténuation
Une exécution de code à distance (RCE) sur un serveur Node.js compromet l'intégrité du service, la confidentialité des données et la disponibilité du système. Étant donné que le problème touche toutes les versions supportées, les environnements de production qui utilisent le décodage automatique de contenus externes (par exemple les API REST ou les serveurs de fichiers statiques) sont exposés tant que le correctif n'est pas appliqué.
En l'absence d'un correctif officiel, les équipes de sécurité peuvent réduire le risque en désactivant le décodage Brotli côté serveur ou en filtrant les en-têtes Accept-Encoding pour empêcher le traitement de ce format. Une alternative consiste à recourir à une implémentation tierce de Brotli, isolée dans un processus distinct, afin de limiter l'impact d'un éventuel dépassement de tampon.
Les administrateurs doivent surveiller les bulletins de sécurité de Node.js et appliquer les mises à jour dès leur publication. La mise en place de tests de fuzzing sur les points d'entrée qui utilisent zlib peut également détecter des comportements anormaux avant qu'une exploitation ne se produise.