ZIP Bomb이란? ZIP Bomb(압축 폭탄)은 높은 압축률을 활용하여 작은 크기의 압축 파일을 해제할 때 기하급수적으로 큰 데이터를 생성해 시스템을 마비시키는 공격 기법입니다. 이러한 파일을 해제하면 메모리 부족이나 시스템 과부하가 발생할 수 있습니다.
ZIP Bomb의 동작 원리
ZIP Bomb은 극도로 높은 압축률을 활용하여 작은 파일 크기에서도 압축 해제 시 엄청난 용량의 데이터를 생성합니다. 예를 들어:
- 42KB ZIP 파일 → 압축 해제 시 4.5PB(페타바이트)
- 10MB ZIP 파일 → 압축 해제 시 10GB~100GB 이상
이러한 압축 방식은 ZIP 파일 내에서 반복되는 데이터 패턴을 악용하여 극단적인 압축률을 만들어냅니다.
Java에서 ZIP Bomb 오류 발생 원인
Java에서 Apache POI 라이브러리를 이용해 Excel(XLSX) 파일을 읽을 때 Zip bomb detected 오류가 발생할 수 있습니다. 이는 Apache POI가 ZIP Bomb 감지 기능을 포함하고 있기 때문입니다.
ZIP Bomb 감지 원인
- XLSX 파일은 ZIP 포맷을 사용
- XLSX는 XML 기반 문서를 ZIP 압축한 파일이므로 ZIP 관련 검사가 수행됩니다.
- Apache POI의 ZIP Bomb 보호 기능
- 압축 해제 크기가 원본 파일 크기의 100배 이상이면 ZIP Bomb으로 간주합니다.
- 파일이 손상되었거나 비정상적인 압축 구조
- 손상된 파일이나 이상한 방식으로 압축된 파일도 ZIP Bomb으로 오탐지될 수 있습니다.
ZIP Bomb 오류 해결 방법
1️⃣ ZIP Bomb 보호 기능 완화 (비추천)
import org.apache.poi.openxml4j.util.ZipSecureFile;
ZipSecureFile.setMinInflateRatio(0.005); // 기본값 0.01 → 완화
🔹 주의: 보호 기능을 낮추면 보안에 취약해질 수 있습니다. 신뢰할 수 있는 파일에서만 사용하세요.
2️⃣ Excel에서 파일을 다시 저장
- Excel에서 파일을 엽니다.
- 파일 → 다른 이름으로 저장하여 새 파일로 저장합니다.
- 새 파일을 Java에서 다시 읽어봅니다.
✅ 이 방법은 파일이 손상되었을 경우 유용합니다.
3️⃣ 압축 비율 조정 (추천)
ZipSecureFile.setMinInflateRatio(0.0001); // 기존 0.01보다 낮게 설정
🔹 너무 낮은 값으로 설정하면 ZIP Bomb 공격에 취약해질 수 있으므로 적절한 수준을 유지해야 합니다.
4️⃣ 파일 직접 검사 (ZIP 변환 후 분석)
XLSX 파일을 ZIP으로 변환 후 압축 해제하여 크기를 비교해 봅니다.
mv file.xlsx file.zip
unzip file.zip
🔹 압축 해제 후 크기가 비정상적으로 크다면 ZIP Bomb 가능성이 있습니다.
5️⃣ Apache POI 최신 버전 사용
Apache POI는 지속적으로 보안 업데이트가 이루어지고 있으므로 최신 버전을 사용하는 것이 좋습니다.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version> <!-- 최신 버전 확인 후 업데이트 -->
</dependency>
🚀 결론
- 일반적인 Excel 파일이라면 ZipSecureFile.setMinInflateRatio(0.0001~0.005)로 조정하면 해결됨.
- 파일이 손상되었을 가능성이 있다면 Excel에서 열어보고 다시 저장 후 시도.
- ZIP Bomb이 의심되는 경우, 직접 압축 해제하여 검사.
- 보안이 중요한 경우, 보호 기능을 완화하기보다는 원인을 분석하여 해결하는 것이 좋음.
📌 위 방법으로 해결되지 않는다면 사용하는 코드와 엑셀 파일의 상태를 점검해 보세요!
#️⃣ #Java #Excel #ApachePOI #ZipBomb #보안 #파일오류 #XLSX #Java개발 #엑셀파일 #데이터보안 #메모리오류 #파일압축 #ZIP파일 #ZIP압축 #보안취약점 #데이터복구 #엑셀에러 #오류해결 #개발자팁 #프로그래밍
'Program > JAVA' 카테고리의 다른 글
[JAVA] 줄바꿈(\n 또는 \r\n)을 기준으로 문자열 나누기 - split, scanner, stream 등 (0) | 2025.02.19 |
---|