Un problème de sécurité critique a été identifié dans le réseau de diffusion de contenu cdnjs fourni par Cloudflare, qui est destiné à accélérer la livraison des bibliothèques JavaScript, permettant l'exécution de code arbitraire sur les serveurs CDN. Le danger de cette vulnérabilité est aggravé par le fait que près de 12,7 % de tous les sites Internet utilisent ce service pour charger des bibliothèques JavaScript, et que la compromission de l'infrastructure permet de remplacer les bibliothèques servies par n'importe lequel de ces sites.
Le service cdnjs charge des paquets directement depuis Git ou le dépôt NPM, permettant ainsi à tout site d'utiliser gratuitement le réseau de diffusion de contenu Cloudflare pour accélérer le chargement des bibliothèques JavaScript. En étudiant le code des composants cdnjs publiés sur GitHub, il a été révélé que le module archive/tar natif du langage Go utilisé pour décompresser les paquets NPM dans des archives tgz rend la liste des fichiers telle quelle, sans normalisation des chemins. Dans les cas où le script décompresse le contenu en se basant sur la liste fournie, la présence de fichiers dans l'archive tels que «.. /.. /.. /.. /.. /.. /.. /tmp /test» peut entraîner le remplacement de fichiers arbitraires dans le système, dans la mesure où les droits d'accès le permettent.
Il a été supposé qu'un attaquant pourrait demander l'ajout de sa bibliothèque à cdnjs et télécharger dans le dépôt NPM une archive soigneusement conçue contenant des fichiers dont le chemin comprend des caractères «.. /». Sur les serveurs cdnjs, une opération d' « autoupdate » est régulièrement effectuée, pendant laquelle le gestionnaire télécharge les nouvelles versions de la bibliothèque proposée et décompresse le contenu. Grâce aux fichiers avec des chemins «.. /», l'attaquant pourrait réussir à remplacer les fichiers contenant les scripts du service et exécuter son code sur le serveur le système où la décompression a été effectuée.
Dans le cas des mises à jour chargées à partir de Git, il a été constaté que le gestionnaire de mise à jour ne tenait pas compte des liens symboliques lors de la copie des fichiers depuis Git. Cette particularité permettait de lire n'importe quel fichier depuis de serveurs le système grâce à l'ajout de liens symboliques dans Git.
Des expériences sur la démonstration d'une violation de cdnjs pour obtenir une récompense sur HackerOne ont été lancées par la vérification d'une hypothèse concernant la lecture des fichiers. Un lien symbolique test.js pointant vers le fichier /proc/self/maps a été ajouté au dépôt Git de la bibliothèque JavaScript diffusée via CDN. Après la publication d'une nouvelle version de cette bibliothèque, le gestionnaire de mises à jour a traité ce dépôt et a publié le fichier mentionné sur cdnjs (test.js a été créé comme un lien symbolique et lors de la demande de ce fichier, son contenu /proc/self/maps était fourni).
En remplaçant le lien symbolique par le fichier /proc/self/environ, l'auteur de l'étude a remarqué que les données fournies contenaient les valeurs des variables d'environnement GITHUB_REPO_API_KEY et WORKERS_KV_API_TOKEN. La première variable contenait la clé API pour accéder en écriture au dépôt robocdnjs sur GitHub. La seconde variable contenait le jeton pour le stockage KV dans cdnjs. En tirant parti des informations obtenues, l'attaquant pouvait apporter des modifications à cdnjs et compromettre entièrement l'infrastructure.
Source : opennet.ru
