아카이브 추출 중 임의 파일 접근 (Zip Slip)
Zip Slip (Archive Extraction Path Traversal)
설명
Zip Slip은 압축 파일(zip 등) 내부 엔트리 이름을 그대로 사용해 대상 디렉터리 아래에 파일을 생성할 때 발생하는 경로 탐색 취약점입니다. 엔트리 이름에 ../, .., 절대 경로(/, C:\ 등) 같은 요소가 포함되면, 정규화/검증 없이 결합된 결과 경로가 대상 디렉터리 밖으로 벗어나 민감한 위치에 파일을 생성·덮어쓸 수 있습니다. 공격자는 악성 아카이브에 이러한 경로를 포함시켜 애플리케이션이 임의 위치에 파일을 기록하게 만들 수 있습니다. 또한 심볼릭 링크를 악용해 의도치 않은 경로로 쓰게 만들 가능성도 있습니다.
잠재적 영향
임의 파일 쓰기/덮어쓰기: 공격자가 시스템 임의 경로에 파일을 생성하거나 기존 파일을 덮어쓸 수 있음
구성 파일 변조: 애플리케이션/서버 설정 파일을 바꿔 동작을 변경하거나 서비스 중단 유발
원격 코드 실행: 웹 루트에 악성 스크립트(WebShell) 업로드 또는 실행 경로의 바이너리/스크립트 교체로 코드 실행 가능
정보 유출 및 권한 상승: 권한 있는 프로세스가 쓰는 경로를 악용해 민감 정보 노출 또는 높은 권한 획득
해결 방법
경로 정규화 및 접두(prefix) 검증: base.resolve(entryName).normalize() 또는 getCanonicalFile()로 정규화한 뒤, 결과 경로가 반드시 base 디렉터리로 시작하는지 startsWith(base)로 확인
절대 경로/상위 디렉터리 거부: 이름이 절대 경로이거나 ../, ..\ 를 포함하면 즉시 거부
허용 목록(whitelist) 사용: 예상 가능한 파일/디렉터리 구조만 추출 허용
디렉터리 생성 시도 전 검증: 부모 디렉터리도 정규화·검증 후에만 Files.createDirectories 수행
심볼릭 링크 방어: 필요 시 추출 중 링크 엔트리를 건너뛰거나, 대상 경로를 toRealPath(LinkOption.NOFOLLOW_LINKS)로 재검증
최소 권한: 추출 작업은 최소 권한으로 실행하고, 필요 없는 파일 권한을 부여하지 않음
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 엔트리 이름(entry.getName())을 그대로 new File(destDir, name)에 결합해 사용합니다. 공격자가 "../../etc/passwd" 같은 이름을 넣으면, 결합된 경로가 대상 디렉터리를 벗어나 시스템 임의 위치로 이어져 민감 파일을 생성·덮어쓰게 됩니다.
안전한 코드: 엔트리 이름을 base.resolve(name).normalize()로 정규화하고, 결과 경로가 항상 대상 디렉터리(base)로 시작하는지 startsWith로 검증합니다. 절대 경로나 상위 디렉터리 패턴을 즉시 차단하고, 검증이 통과한 경우에만 디렉터리를 생성하고 파일을 씁니다. 이를 통해 아카이브 외부로 이탈하는 경로 쓰기를 근본적으로 차단합니다.
참조
Last updated