Zip Slip (압축 해제 경로 조작)
Zip Slip (Archive Extraction Path Traversal)
설명
Zip Slip은 압축 파일의 엔트리 경로(entryName, fileName 등)를 검증하지 않고 파일 시스템 경로로 사용해 쓸 때 발생하는 취약점입니다. 공격자는 엔트리 이름에 "../"(디렉터리 트래버설) 또는 절대 경로(C:, /tmp 등)를 넣어, 의도된 추출 디렉터리 밖의 임의 위치에 파일을 생성하거나 덮어쓸 수 있습니다. 악용 시 웹 루트에 스크립트를 심어 원격 코드 실행을 유발하거나, 시스템/애플리케이션 설정 파일을 덮어써 서비스 장애를 일으킬 수 있습니다.
잠재적 영향
임의 파일 쓰기/덮어쓰기: 공격자가 애플리케이션 권한으로 임의 경로에 파일을 생성·수정해 웹셸 업로드, 설정 변조를 유발할 수 있음.
원격 코드 실행: 웹 루트, 크론/시작 스크립트 경로 등에 파일을 쓰면 코드가 실행될 수 있음.
서비스 거부(DoS): 중요한 구성 파일, 바이너리, 로그를 덮어써 서비스 중단 또는 장애 유발 가능.
데이터 무결성 훼손: 애플리케이션 데이터/로그 변조로 추적 회피 및 보안 가시성 저하.
해결 방법
경로 검증: 엔트리 경로를 path.normalize 후 절대 경로 여부(path.isAbsolute)와 ".." 포함 여부를 확인하고, path.resolve(목적지, 엔트리)를 사용해 계산된 최종 경로가 목적지 디렉터리의 실경로(realpath)로 시작하는지 검사하세요.
우회 차단: Windows 드라이브 표기(예: C:), 심볼릭 링크 엔트리, 예약 명칭(NUL, CON 등)을 거부하세요.
허용 목록 기반: 필요한 확장자/디렉터리만 추출(allowlist)하고 나머지는 스킵하세요.
파일 생성 정책: 가능한 경우 기존 파일 덮어쓰기를 금지(open/write 시 'wx' 또는 존재 검사)하고, 디렉터리는 안전하게 생성(fs.mkdir {recursive:true}).
라이브러리 옵션: zip 처리 라이브러리의 안전 옵션(엔트리 필터, symlink 차단)이 있으면 활성화하세요.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 엔트리 이름(entryName)을 검증 없이 path.join으로 결합해 파일을 씀으로써, "../" 또는 절대 경로가 포함된 엔트리가 목적지 디렉터리 밖으로 탈출해 임의 파일 생성/덮어쓰기가 가능합니다.
안전한 코드: 엔트리 경로를 path.normalize로 정규화하고, 절대 경로/상위 디렉터리 요소를 거부하며, path.resolve 후 실경로(realpath) 기준으로 목적지 내부에 속하는지 검증합니다. 검증을 통과한 경우에만 파일을 생성하여 Zip Slip을 차단합니다.
참조
Last updated