💣Dependency confusion

Description

La confusion de dépendances est une technique d'attaque par laquelle les attaquants exploitent les mécanismes de résolution de dépendances utilisés lors du développement de logiciels. Lorsque les développeurs construisent des applications en utilisant des gestionnaires de paquets tels que npm (pour JavaScript) ou pip (pour Python), ils spécifient les dépendances nécessaires pour leur projet. Les attaquants peuvent profiter de l'absence de contrôle rigoureux des sources de ces dépendances. Ils publient des packages malveillants dans des registres publics qui portent le même nom que les packages légitimes, mais avec des versions supérieure. Lorsque les développeurs construisent leur projet, le gestionnaire de paquets peut télécharger et inclure automatiquement le package malveillant sans que les développeurs en aient conscience. Cela permet aux attaquants de compromettre le système cible en exploitant les vulnérabilités du package malveillant.

Reconnaissance

Backend

Afin de tester ce type de vulnérabillité, il faut impérativement trouver les packages utilisés par l'application en back-end. Cela est principalement rendu possible par des fuites de données techniques ou une revue de code. (Si le code source est rendu disponible sur Github par exemple)

Exemples:

https://target.com/.git, https://target.com/package.json, https://target.com/package-lock.json...

Exemple:

https://target.com/?page=../../../package.json

Rechercher dans Github, Gitlab, npmjs.com, pastebin.com...ubli

Dorks

site:target.com inurl:/ui/package.json
site:target.com inurl:/ui/package-lock.json
site:target.com inurl:/package.json

Frontend

De la même manière, on va ensuite rechercher les packages utilisés en frontend soit via de l'OSINT, soit en analysant le code source des pages à la recherche des imports de packages.

On va alors rechercher les termes suivants:

  • import

  • require()

Vérification

L'étape suivante vise simplement à vérifier si les packages trouvés existent sur les registres publiques:

Exploitation

Si un package trouvé n'existe pas dans les registres publiques, il est alors possible de vérifier la vulnérabilité en le créant et en l'enregistrant sous le même nom et à une version supérieur (une version supérieur sera selectionné en première).

Exemple avec Node

Création de l'exploit

Dans le fichier package.json:

  • Remplacer la valeur name par le nom du package privé

  • Remplacer la valeur version par une version supérieur à celle du package privé

  • Remplacer l'url de la commande curl dans preinstall par votre collaborator

Upload de l'exploit dans le registre publique

  • Créer un compte sur https://www.npmjs.com/ si ce n'est pas déjà fait

  • Dans un terminal, se connecter avec la commande npm login

  • Entrer la commande npm publish . dans le répertoire de l'exploit.

  • Vérifier que le package est bien disponible sur npmjs.com

Si la cible est vulnérable, alors a chaque fois que le serveur va executer la commande npm install, la RCE sera executé.

Ressources

Dernière mise à jour