피드로 돌아가기
엑셀 업로드 중 발생한 Zip Bomb 에러 파헤치기! 🥊
컬리 기술블로그컬리 기술블로그
Backend

엑셀 업로드 중 발생한 Zip Bomb 에러 파헤치기! 🥊

Kurly 배송팀이 엑셀 업로드 중 발생한 Zip Bomb 에러를 styles.xml 내 과도한 스타일 반복으로 원인 파악 후 ZipSecureFile.setMinInflateRatio() 조정으로 해결

2024년 10월 23일10intermediate

Context

엑셀 파일 업로드 기능에서 압축률이 비정상적으로 높은 파일(압축 크기 4,059바이트 → 압축 해제 크기 406,416바이트, 비율 0.009987)이 Apache POI의 Zip Bomb 감지 메커니즘에 걸려 서비스가 중단되었다. 문제 파일은 styles.xml 내에서 동일한 셀 스타일 정의가 반복되어 압축 알고리즘이 극도로 높은 압축률을 달성하면서 시스템 기본값인 MIN_INFLATE_RATIO 0.010000을 초과하게 되었다.

Technical Solution

  • 문제 분석: 에러 로그에서 압축 비율, 파일 크기, 문제 발생 엔트리(xl/styles.xml)를 파싱하여 원인 특정
  • 압축률 검사 메커니즘 이해: Apache POI의 XSSFWorkbook 생성 단계에서 자동으로 발동되는 ZipSecureFile의 압축 비율 검증 로직 확인
  • styles.xml 내용 검증: 압축 해제 후 XML을 분석하여 동일한 dxf 노드(font, fill, patternFill)가 반복 정의된 사실 확인
  • 최소 압축 해제 비율 조정: ZipSecureFile.setMinInflateRatio() 메서드로 압축 비율 임계값을 낮추어 정상 파일 처리 재개
  • 보안 수준 재평가: 계약된 사용자만 접근 가능한 시스템 특성을 고려하여 악의적 공격 위험도 낮음으로 판단

Key Takeaway

압축 파일 처리 시 압축률 임계값은 보안과 유용성 간의 트레이드오프이므로, 시스템 위협 수준과 실제 사용 패턴을 함께 고려하여 설정해야 한다. 로그에 담긴 정량적 정보(파일 크기, 압축 비율, 임계값, 문제 엔트리명)는 근본 원인 파악의 핵심 단서이므로 시스템 안정성 유지에 필수적이다.


Apache POI를 사용하는 Java 기반 엑셀 처리 서비스에서 Zip Bomb 에러가 발생하면, 먼저 에러 로그의 압축 비율(Ratio)과 MIN_INFLATE_RATIO를 비교하고, 실제 압축 해제 후 XML 내용을 검사하여 정상 데이터의 반복성 여부를 확인한 후 ZipSecureFile.setMinInflateRatio()로 임계값을 조정하거나 스타일 정의 중복을 제거해야 한다.

원문 읽기