새소식

반응형
Java/Spring

Apache POI Excel 파일 업로드 중 "Zip bomb detected.." 에러

  • -
반응형

Apache POI 를 사용하여 Excel 파일을 XSSFWorkbook으로 변환 과정에서 에러가 발생하였다.

변환 코드는 아래와 같다.

@Service
public class MigrationService {
    private String pw = "8282";

    public void customerMigrationService(MultipartFile file) {
        XSSFWorkbook wb = null;
        XSSFSheet sheet = null;
        XSSFRow row = null;
        XSSFCell cell = null;

        try {
            #.xlsx 엑셀파일에 암호가 걸려있어 풀기 위해 사용
            POIFSFileSystem fs = new POIFSFileSystem(file.getInputStream());
            EncryptionInfo info = new EncryptionInfo(fs);
            Decryptor d = Decryptor.getInstance(info);

            if(d.verifyPassword(pw)) {
                //ZipSecureFile.setMinInflateRatio(0);
                wb = new XSSFWorkbook(d.getDataStream(fs));
                sheet = wb.getSheetAt(2);
                row = sheet.getRow(3);
                cell = row.getCell(16);
            }else {
                throw new Exception("파일의 패스워드가 일지하지 않습니다.");
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

에러 본문

java.io.IOException: Zip bomb detected! The file would exceed the max. ratio of compressed file size to the size of the expanded data.
This may indicate that the file is used to inflate memory usage and thus could pose a security risk.
You can adjust this limit via ZipSecureFile.setMinInflateRatio() if you need to work with files which exceed this limit.
Uncompressed size: 2259238, Raw/compressed size: 22584, ratio: 0.009996

 

* 원인

Zip Bomb 라는 용어는 zip 폭탄, 죽음의 zip, 압축 해제 폭탄 등 프로그램이나 시스템이 읽을 때 충돌하거나 뻗어버리게

만드는 악의적인 컴퓨터 압축 파일이라고 한다.

.xlsx 파일은 XML 파일을 포함한 압축 파일이기 떄문에 POI에서 Zip Bomb 관련 취약점이 발생할 가능성이 있다고 한다.

이러한 이유로 Apache POI는 취약점을 방지하기 위해 기본적으로 해당 취약점에 대해 recject 시키고 있다.

 

* 해결방법

Workbook을 생성하기 전에 아래 코드를 추가하면 된다.

ZipSecureFile.setMinInflateRatio(0);
반응형

'Java > Spring' 카테고리의 다른 글

Spring Data JPA, ORM(Object-Relational Mapping)  (0) 2022.03.21
Spring 이란  (0) 2022.03.19
MyBatis  (0) 2021.12.27
org.springframework.dao.RecoverableDataAccessException 에러  (0) 2021.12.22
오버로딩(Overloading), 오버라이딩(Overriding)  (0) 2021.12.06
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.