Vulnérabilité de sécurité critique dans l’extraction d’archives ZIP de Bower
31 janvier 2019
0 minutes de lectureAu début du mois, il a été découvert que Bower, un gestionnaire de paquets web populaire, était vulnérable lors de l’extraction d’archives. À ce jour, deux incidents de sécurité lui sont associés, et des versions correctives sont disponibles :
Des écritures de fichiers arbitraires susceptibles d’entraîner une injection de commandes à distance, corrigées dans Bower 1.8.6, étaient dues aux vulnérabilités Zip Slip présentes dans la dépendance decompress-zip, une dépendance open source utilisée par Bower.
Les écritures de fichiers arbitraires provoquées par des vulnérabilités liées aux liens symboliques dans des archives .tar.gz, exploitées en raison de la manière dont Bower extrait ces archives, ont été corrigées dans Bower 1.8.8.
Webpack, yarn et le registre npm ont peut-être changé la donne pour Bower, mais celui-ci est toujours utilisé. Même s’il existe aujourd’hui des gestionnaires de paquets plus populaires et que npm est de facto le registre JavaScript, Bower reste très utilisé comme gestionnaire de paquets, avec près de 2 millions de téléchargements par mois, ce qui souligne la gravité d’un tel problème de sécurité.
Le 1er janvier 2019, un chercheur en sécurité nommé skyn3t a signalé au groupe de travail sur la sécurité de Node.js, sur HackerOne, une écriture de fichier arbitraire résultant d’une validation incorrecte des liens symboliques, liée à la manière dont Bower gère l’extraction des archives tar.
Peu après le triage du bogue, Adam Stankiewicz, membre de l’équipe principale de Bower, a été invité à examiner le rapport. Il l’a rapidement confirmé et a fourni un correctif dans la version 1.8.8 de Bower pour résoudre le problème de sécurité.
Traversée de chemin malveillante lors de l’extraction d’archives
Si un acteur malveillant créait une archive ZIP spécialement conçue pour un paquet ensuite installé avec Bower, cela pourrait entraîner une traversée de chemin et l’extraction de fichiers en dehors du répertoire racine prévu pour décompresser l’archive.
La preuve de concept (PoC) ci-dessous provient d’un rapport de sécurité divulgué par skyn3t au programme du groupe de travail sur la sécurité de Node.js sur HackerOne. Elle montre comment une gestion non sécurisée des liens symboliques peut entraîner des écritures de fichiers arbitraires.
L’archive de paquet malveillante
L’archive doit créer un lien symbolique vers un répertoire, puis déposer un fichier dans ce répertoire cible. Toutefois, pour reproduire cette structure, nous devons créer manuellement une archive malveillante.
Nous allons commencer par créer un répertoire pour le paquet malveillant, un fichier package.json par défaut pour Bower et un lien symbolique vers /tmp :
Nous pouvons maintenant créer une archive tar pour ce paquet, en veillant à ne pas la compresser :

La difficulté consiste à placer un fichier de notre choix dans le répertoire /tmp, et donc dans mySpecialDirectory/ à l’intérieur de l’archive. Le nom de ce fichier est déjà utilisé par un lien ; nous ne pouvons donc pas simplement le réutiliser dans notre propre système de fichiers.
Pour contourner cette difficulté, nous revenons aux fonctionnalités standard des archives : la modification de données à l’intérieur de l’archive. Les fichiers tar peuvent être mis à jour, par exemple en y ajoutant d’autres fichiers, ce qui nous permet de créer une échappatoire.
Nous allons supprimer le lien, créer un répertoire à sa place, puis y créer notre propre fichier. Nous ajouterons ensuite ce fichier à l’archive à l’aide de la fonction de mise à jour tar :
Comme le montre la capture d’écran, l’archive contient un lien symbolique vers le répertoire /tmp, ainsi qu’un lien symbolique vers un fichier malveillant que nous avons créé :

À noter : les archives compressées ne peuvent pas être modifiées de la même manière que les archives tar. Nous allons donc compresser l’archive avec gzip maintenant qu’elle a été rendue malveillante :
Déclencher l’installation par Bower
Maintenant que nous avons une archive tar.gz dans le répertoire personnel ~/tmp, exécutons une installation Bower à partir du système de fichiers local pour montrer comment le paquet est décompressé :

Comme on peut le voir, Bower 1.8.7 est utilisé. Lors de l’installation du paquet malveillant, le fichier malveillant que nous contrôlions a ensuite été installé dans le répertoire /tmp du système.
Corriger la vulnérabilité
Bower prend en charge les types d’archives suivants : tar, tar.gz et zip. Une vulnérabilité similaire touchant les paquets ZIP avait déjà été corrigée en corrigeant decompress-zip, mais tar et tar.gz restaient vulnérables.
Le correctif appliqué pour les vulnérabilités tar et tar.gz a permis d’atténuer le problème en ignorant tous les liens symboliques dans les paquets à installer. Une nouvelle version de Bower, la version 1.8.8, a depuis été publiée. Les utilisateurs peuvent la mettre à niveau pour atténuer le problème de sécurité.
Début 2018, l’équipe de recherche en sécurité de Snyk a créé le terme « vulnérabilité Zip Slip » après avoir mené des recherches approfondies sur l’exploitation de l’extraction d’archives entraînant des écritures de fichiers arbitraires. Une vulnérabilité critique peut également permettre l’exécution de commandes à distance et l’écrasement de fichiers de configuration système sensibles.
Les recherches sur Zip Slip ont permis de découvrir des milliers de projets vulnérables dans de nombreux écosystèmes, notamment des projets d’Apache, de Pivotal, d’Amazon et d’autres acteurs.
En résumé
Nous avons vu comment créer un paquet malveillant conçu pour provoquer une écriture de fichier arbitraire. Mais le problème ne se limite pas au téléchargement de paquets malveillants. Si un paquet est récupéré par un canal non sécurisé, par exemple via une connexion non HTTPS, une attaque de l’homme du milieu peut être menée.
Les problèmes d’extraction de fichiers ne sont pas nouveaux et remontent peut-être à un article de Phrack publié en 1991, qui expliquait comment pirater un BBS en exploitant ce type de failles dans l’extraction ZIP. À mesure que les recherches dans ce domaine progressent, nous continuerons probablement à découvrir des vulnérabilités Zip Slip dans des bibliothèques et des applications.
Même si les liens symboliques sont autorisés, manipuler des archives contrôlées par des utilisateurs est dangereux et exige les mêmes précautions que pour toute autre donnée fournie par un utilisateur.
À retenir
Passez à Bower 1.8.8 dès que possible.
Consultez notre fiche mémo Zip Slip pour découvrir des exemples de code vulnérable dans différents écosystèmes de langages de programmation et savoir comment éviter des vulnérabilités similaires dans votre code.



