💣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
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:
Node: https://www.npmjs.com/
Python: https://pypi.org/
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