Zip Slip: 압축 해제 과정에서 발생하는 Path Traversal 취약점
개요
Path Traversal 또는 Directory Traversal 취약점은 주로 사용자의 입력을 제대로 검증하지 않아 발생하는 보안 취약점이다. 공격자는 상대경로 혹은 절대경로를 사용하여 원래는 접근할 수 없는 파일 또는 의도하지 않은 경로의 파일을 읽고 수정할 수 있으며, 심지어 새로운 파일을 생성할 수도 있다. 이 취약점은 오래 전부터 알려져 있었지만 여전히 발견되고 있으며, 웹 환경뿐만 아니라 다양한 환경과 프로그램에서 발견되기도 한다. 이번 글에서는 특히 압축 프로그램의 압축 해제 과정에서 발생하는 Path Traversal 취약점인 Zip Slip에 대해 살펴보고, 주요 취약점을 소개하고자 한다.
Zip Slip 취약점이란?
Zip Slip은 압축 파일 내에 포함된 파일 경로를 악의적으로 조작하여, 압축 해제 시 대상 디렉토리 외부에 파일을 생성하거나 기존 파일을 덮어쓰는 취약점이다. 공격자가 이 취약점을 악용해 생성한 압축파일을 사용자가 압축 해제하면 공격자가 원하는 경로에 파일이 생성될 수 있다.
예를 들어, linux 환경에서 압축 파일에 아래와 같이 상대 경로가 포함되어 있고, Zip Slip 취약점이 존재하는 압축 프로그램 내부에서 경로를 제대로 검증하지 않고 압축을 해제한다면 /etc/passwd 파일을 덮어쓸 수 있다.
../../../../etc/passwd
Windows 환경의 경우 아래와 같이 상대 경로를 이용하여 사용자 Startup 폴더에 압축을 해제한다면, 시스템 부팅 시마다 공격자가 삽입한 파일이나 명령이 실행된다.
/../AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/
Zip Slip은 특정 압축 형식에서만 발생하는 문제가 아니다. ZIP, TAR, RAR, 7Z 등 파일 경로 정보를 포함하는 모든 압축 형식에서 Path Traversal 공격이 가능하다.
각 압축 형식마다 압축 파일 구조가 다르지만, 대표적인 압축 형식인 ZIP의 구조를 보면 파일 경로 정보가 포함된다는 것을 알 수 있다.
아래 표는 ZIP 파일 헤더 중 일부를 나타낸 자료이다.
| Bytes | Size | Description |
| 0 | 4 | Magic number. Must be 50 4B 03 04 |
| 4 | 2 | Version needed to extract (minimum). |
| 6 | 2 | General purpose bit flag. |
| 8 | 2 | Compression method; e.g. none = 0, DEFLATE = 8 (or “\0x08\0x00”). |
| 10 | 2 | File last modification time. |
| 12 | 2 | File last modification date. |
| 14 | 4 | CRC-32 of uncompressed data. |
| 18 | 4 | Compressed size (or FF FF FF FF for ZIP64). |
| 22 | 4 | Uncompressed size (or FF FF FF FF for ZIP64). |
| 26 | 2 | File name length (n). |
| 28 | 2 | Extra field length (m). |
| 30 | n | File name. |
| 30+n | m | Extra field. |
[표 1] ZIP 파일 헤더 (출처: Wikipedia)
위 표에 따르면 ZIP 파일에서는 30바이트(0x1E)부터 시작해, File name length에 지정된 길이만큼의 영역이 파일 이름(File name) 항목에 해당한다.
File name 항목은 압축 해제 시 생성될 파일의 이름을 지정하는 역할을 하지만, 해당 영역에 경로를 포함한 파일 이름을 저장함으로써 하위 폴더를 생성한 후 해당 위치에 파일을 추출하는 것도 가능하다.
공격자들은 File name에 python의 zipfile 모듈을 이용하거나, 직접 ZIP 파일을 조작해 File name 항목에 상대 경로를 삽입할 수 있다.
아래 그림은 File name에 상대 경로를 삽입한 ZIP 파일의 구조이다. 실제로 그림에서 0x1E 오프셋부터 파일 경로가 포함되어 있는 것을 확인할 수 있다. 이렇게 만들어진 압축 파일이 %USERPROFILE%\Downloads 경로에 다운로드된 상태에서, Zip Slip 공격에 취약한 압축 프로그램으로 압축을 해제하면 파일이 시작 프로그램 폴더에 생성된다.

[그림 1] 압축 해제 파일 경로가 포함된 ZIP 파일
ZIP 형식뿐만 아니라 7Z, RAR 등 다양한 압축 형식에서도 파일 이름 영역에 경로 정보를 포함시킬 수 있다.
아래 그림에서 RAR, TAR 형식 파일에 파일 경로와 이름이 포함되어 있는 구조를 확인할 수 있다.

[그림 2] 압축 해제 파일 경로가 포함된 RAR 파일

[그림 3] 압축 해제 파일 경로가 포함된 TAR 파일
이처럼 파일 내부에 파일 경로와 이름을 확인할 수 있는 형식도 있지만, 7Z처럼 평문으로 저장되어 있지 않은 형식도 있다. 평문으로 저장되어 있지 않은 경우에도 평문으로 복호화 후 경로 문자열을 처리하는 과정에서 문제가 발생할 수 있다.
주요 취약점
CVE-2025-8088
RARLAB WinRAR 7.13 이전 버전에서 발견된 Path Traversal 취약점으로, 공격자는 순회 문자인 “..\” 와 Alternate Data Stream(ADS)를 활용해 경로 검증을 우회하고, 압축 해제 시 임의 경로에 파일을 생성할 수 있다. 해당 취약점은 ESET의 연구원들이 발견했으며, RomCom APT 그룹의 실제 악용 사례도 보고되었다.
CVE-2025-6218
RARLAB WinRAR 7.12 이전 버전에서 공격자가 삽입한 상대 경로에 대해 충분한 검증을 하지 않아 상위 디렉토리 접근을 통한 원격 명령 실행 (Remote Code Execution) 취약점이 발견되었다. 이 취약점은 압축 해제 시 생성할 파일 이름에 상대 경로가 포함되어 있고, 특히 공백 문자가 같이 포함된 경우 기존의 상대 경로 검증 필터링을 우회할 수 있다는 점을 악용한다. 간단한 PoC 및 참고자료는 ignis-sec Github CVE-2025-6128에서 확인 가능하다.
CVE-2022-30333
RARLAB Unrar 6.12 이전 버전에서 영향을 받는 취약점으로, Linux/Unix 환경에서 RAR 형식의 파일 압축 해제 과정에서 발생한다. 가장 기본적인 ../../example 방식으로 공격이 가능하며, ~/ssh/authorized_keys 등과 같이 임의 경로의 파일에 대해 덮어쓰거나 파일을 생성할 수 있다.
CVE-2018-20250
WinRAR 5.61 이전 버전에서 ACE 형식 파일을 해제할 때 경로 필터링이 미흡하여 발생하는 취약점이다. ACE 형식 파일 압축 해제 과정에서 실행되는 Ace32Loader.exe 프로세스에서는 UNACEV2.dll 모듈을 사용한다. UNACEV2.dll 내부에서 경로 문자열 처리 로직 중 “:” 문자와 “\” 문자에 대한 필터링을 우회할 수 있어 상위 디렉토리에 접근이 가능해진다.
결론
Zip Slip 취약점은 사용자가 스크립트나 실행 파일을 직접 실행하지 않더라도 단순히 압축 해제를 수행하는 것만으로 악용될 수 있으며, 공격자가 지정하는 경로에 따라 임의 코드 실행으로 이어질 가능성이 존재한다. 또한 공격에 사용되는 페이로드는 파일의 종류나 확장자에 제한되지 않으며, 경로 정보가 포함된 모든 압축 파일이 공격에 활용될 수 있다.
하지만 Zip Slip 취약점은 압축을 해제하는 사용자의 상호작용이 필요하므로, 사용자는 의심스러운 압축 파일을 해제할 때 각별한 주의가 필요하다. 또한 주기적으로 프로그램을 업데이트해 최신 버전으로 유지할 필요가 있다.
참고자료
https://nvd.nist.gov/vuln/detail/CVE-2025-6218
https://nvd.nist.gov/vuln/detail/cve-2022-30333
https://nvd.nist.gov/vuln/detail/cve-2018-20250
https://nvd.nist.gov/vuln/detail/CVE-2025-8088