Node.js corrige un bug HTTP qui pourrait permettre aux attaquants de planter des applications

0

Node.js a publié des mises à jour pour une vulnérabilité de gravité élevée qui pourrait être exploitée par des attaquants pour corrompre le processus et provoquer des comportements inattendus, tels que des plantages d’applications et potentiellement une exécution de code à distance.

La vulnérabilité use-after-free, identifiée comme CVE-2021-22930, concerne la façon dont les flux HTTP2 sont gérés dans le langage.

Node.js propose des correctifs immédiats pour la faille

Récemment, Node.js a publié des correctifs pour une vulnérabilité de haute gravité, use-after-free, identifiée comme CVE-2021-22930.

Les vulnérabilités use-after-free se produisent lorsqu’un programme essaie d’accéder à une ressource dans une adresse mémoire qui a été précédemment libérée et ne détient plus la ressource.

Cela peut entraîner une corruption des données ou des comportements inattendus tels que des plantages d’applications ou même l’exécution de code à distance dans certains cas.

Les correctifs ont atterri dans la dernière version de Node.js 16.6.0 et ont également été rétroportés vers les versions 12.22.4 (LTS) et 14.17.4 (LTS).

Le correctif présenté ci-dessous a été appliqué sur plusieurs branches Node.js pour éliminer la vulnérabilité use-after-free:

node.js
Un correctif simple résout la vulnérabilité (GitHub)

Eran Levin a été crédité pour avoir signalé cette vulnérabilité.

La publication brutale de la mise à jour pour une vulnérabilité de gravité élevée s’explique par le fait que les discussions autour de la vulnérabilité étaient déjà publiques :

« Nous aimons normalement donner un préavis et fournir des versions dans lesquelles les seuls changements sont des correctifs de sécurité, mais comme cette vulnérabilité était déjà publique, nous avons pensé qu’il était plus important de sortir ce correctif rapidement dans les versions qui étaient déjà prévues », a annoncé Daniel Bevenius, ingénieur logiciel principal de Red Hat et membre du comité directeur technique (TSC) de NodeJS.

Bug déclenché lors de l’abandon des connexions HTTP

La vulnérabilité a été déclenchée dans les cas où Node.js a analysé les trames RST_STREAM entrantes, sans code d’erreur ni code d’annulation.

Dans les applications basées sur le protocole HTTP/2, la trame RST_STREAM est envoyée par l’un ou l’autre des hôtes ayant l’intention de mettre fin à une connexion.

Par exemple, dans une architecture client-serveur, si une application cliente souhaite mettre fin à la connexion, elle enverra une trame RST_STREAM au serveur.

A la réception de la trame, le serveur cessera de répondre au client, interrompant éventuellement la connexion. Toutes les trames « DONNEES » que le serveur était sur le point d’envoyer au client pouvaient alors être rejetées.

Mais dans le cas des versions vulnérables de Node.js, lorsqu’une trame RST_STREAM était reçue par le serveur avec un code « cancel » (nghttp2_cancel), le récepteur tentait de « purger » toutes les données reçues.

Et, une fois cela fait, un rappel automatique exécuterait en plus la fonction « close », tentant de libérer la mémoire une seconde fois, qui avait déjà été libérée lors de la dernière étape.

Et cela entraînerait un plantage de l’application ou un comportement erratique en raison d’une erreur double-free.

Cette erreur, auparavant considérée comme un « bug » plutôt qu’une vulnérabilité exploitable, a été signalée le 8 juin 2021 par Matthew Douglass sur un fil public.

Douglass a pu reproduire le bogue à 100 % du temps sur son système, ce qui a entraîné des plantages d’applications.

La discussion a duré pendant plus d’un mois entre les contributeurs de Douglass et de Node.js:

« Le problème semble être dû au traitement de la trame RST_STREAM reçue sans code d’erreur et sans code d’erreur d’annulation. »

« Le nœud essaie de forcer le traitement et de purger toutes les données existantes pour le flux. Cela oblige nghttp2 à fermer le flux déjà détruit provoquant l’erreur double-free », a répondu kumarak, un utilisateur de GitHub.

Le correctif déployé à la place ajoute le flux entrant de trames RST_STREAM à une file d’attente et traite la file d’attente une fois que cela est sûr. Cela empêcherait toute erreur double-free ou use-after-free.

Les utilisateurs de Node.js doivent effectuer une mise à niveau vers la dernière version 16.6.0 ou une version rétroportée corrigée.

Laisser un commentaire