Attaque de confusion de dépendance
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_.py
fichier et remplacez package_name
-le par le nom de package souhaité :
Ouvrez poc.py
le 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.py
puis 0.0.1
reconstruisez 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 :
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-url
au 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