Attaque de confusion de dépendance

Nov 24 2022
L'attaque Dependency Confusion est un type d'attaque dans lequel un attaquant trompe un gestionnaire de packages pour qu'il installe un package malveillant à partir d'un référentiel public, au lieu du package légitime privé du fournisseur. Dhiyaneshwaran a écrit un excellent blog expliquant ses recherches et ses découvertes, je vous recommande de lire son blog si vous ne l'avez pas déjà fait.

Aperçu

L'attaque Dependency Confusion est un type d'attaque, où un attaquant trompe un gestionnaire de packages pour qu'il installe un package malveillant à partir d'un référentiel public, au lieu de celui privé légitime du fournisseur.

Dhiyaneshwaran a écrit un excellent blog expliquant ses recherches et ses découvertes, je vous recommande de lire son blog si vous ne l'avez pas déjà fait.

Dans ce blog, nous nous concentrerons sur les packages Python en termes d'identification de la mauvaise configuration et de son exploitation.

Le PIP expliqué

Par défaut, lorsque vous téléchargez un package python à l'aide de pip, il recherche dans le référentiel Pypi la dernière version du package souhaité et l'installe, mais un développeur peut déployer son propre référentiel Pypi privé pour héberger ses packages personnalisés localement au lieu de publier les packages publiquement.

Afin de télécharger un package à partir d'un référentiel local, l'URL du référentiel doit être spécifiée. Cela peut être fait en utilisant les deux options suivantes :

  • --extra-index-url
  • --index-url
  • pip3 install --extra-index-url <LOCAL_REPO_URL>/simple/ --trusted-host <LOCAL_REPO_URL> -r requirements.txt
    #OR
    pip3 install --index-url <LOCAL_REPO_URL>/simple/ --trusted-host <LOCAL_REPO_URL> -r requirements.txt
    

Piratage de colis

Dans l'exemple de scénario suivant, nous allons démontrer l'attaque.

Conditions préalables

  • Créer un compte sur Pypi
  • Créer un référentiel Pypi privé

Clonez le dépôt suivant :

git clone https://github.com/zAbuQasem/dependecy-confusion-templates
cd dependecy-confusion-templates/python-pip

      
                

mv package_name safepackage

Modifiez ensuite le __init_.pyfichier et remplacez package_name-le par le nom de package souhaité :

Ouvrez poc.pyle fichier et ajoutez l'url de votre serveur/webhook, afin de recevoir les déclencheurs de package.

Enfin, créez le package et téléchargez-le dans le référentiel Pypi :

# Prerequisities
sudo apt install twine -y
sudo apt-get install gcc libpq-dev -y
sudo apt-get install python-dev  python-pip -y
sudo apt-get install python3-dev python3-pip python3-venv python3-wheel -y
pip3 install wheel

# Builing and uploading
python3 setup.py sdist bdist_wheel
twine upload dist/* --verbose

Changez maintenant la version dans le setup.pypuis 0.0.1reconstruisez le package à l'aide des commandes ci-dessus, après cela, copiez le fichier de package dans le serveur Pypi local, comme indiqué dans l'image ci-dessous :

Vérifiez le package en visitant l'URL Pypi locale :

Cliquez sur simple pour voir les forfaits disponibles

En exécutant la commande suivante, nous pouvons voir que pip a installé la dernière version même si nous lui avons fourni l'URL de notre référentiel privé :

pip3 install --extra-index-url http://example:8080/simple/ --trusted-host example.com safepackage

      
                

python3 -c "import safepackage"

      
                

Remédiation

Supprimez maintenant le package installé et réinstallez-le avec --index-urlau lieu de--extra-index-url

Pip a installé le package à partir de notre référentiel privé comme prévu.

Conclusion

  • Hébergez votre package sur les référentiels publics et privés.
  • Essayez d'éviter d'utiliser--extra-index-url