Zip 폭탄(Zip bomb) 또는 압축 해제 폭탄(decompression bomb)이라 불리는 것이 있습니다. 겉보기에는 평범하고 작은 압축 파일이지만, 압축 해제를 시도하면 시스템이 감당하기 어려운 정도의 데이터가 쏟아져 나오는 악성 코드의 일종이지요. 이런 파일은 주로 보안 프로그램을 꺼 버리기 위해 사용됩니다. 안티바이러스 프로그램이 압축 파일을 검사하려 시도할 때, 압축 해제를 시도하는 순간 엄청난 데이터가 쏟아져 나오는 바람에 안티바이러스 프로그램이 이를 감당하지 못하고 종료되거나 혹은 사용자가 다운된 안티바이러스 프로그램을 꺼 버리게끔 유도하는 역할이지요. 아니면 직접적으로 시스템 다운을 일으키는 테러 또는 사보타주에 사용할 수도 있고요.
최근에 공개된 논문(위 링크)에서는 흔히 쓰이는 zip 포맷과 이 포맷에서 사용하는 압축 알고리즘인 DEFLATE의 특징을 활용하여 비재귀적(non-recursive) 방식으로 이런 zip 폭탄을 만드는 방법에 대해 서술하고 있습니다. 보통 zip 폭탄은 압축을 해제하면 또다른 zip 파일이 재귀적으로 생성되는 방식으로 만들어지는데, 근래의 안티바이러스 프로그램에서는 이런 경우를 방어하기 위해 zip 파일 안에 또다른 zip 파일이 계속 나타나는 경우 2~3단계까지만 파고들고 그 뒤는 그냥 무시하게끔 만들어져 있습니다. 위 논문에서는 이런 제한을 우회하기 위해, 1번의 압축 해제 시도만으로 무려 2800만배 이상 크기가 뻥튀기되어 255.9 TiB의 용량을 차지하게끔 만들어진 9.4 MiB짜리 zip 파일을 실제로 제시하고 있습니다.
DEFLATE 알고리즘의 이론적으로 가능한 압축 비율은 최대 1032배라고 하는데, 대체 어떻게 이런 게 가능한 걸까요. 저도 자세한 기술적인 부분은 잘 모르겠습니다만, 해설 트윗에 따르면 zip 파일에서 n번째 파일의 헤더와 내용이 n-1번째 파일의 내용이 되게 하는 형식으로 파일을 겹치고 메타데이터를 조작하여 이 겹쳐진 파일들이 각각 별개의 파일로 인식되게끔 만들었다는 모양입니다. 기존에 재귀적인 방식으로 만들어진 zip 폭탄 중 가장 유명한 것이 42.zip
이라는 파일인데, 41.4 KiB밖에 안 되는 작은 파일이지만 열어보면 안에 압축된 파일 16개가 각각 5겹으로 16개씩 나오고 맨 마지막 단계에서는 4 GiB짜리 파일이 튀어나와서 모든 파일들의 용량을 합치면 4 PiB라는 어마무시한 용량이 나온다는 물건입니다만 첫 단계의 압축을 풀었을 때는 고작 545.3 KiB밖에 안 되는 용량을 차지하거든요. 그런데 이건 한번만에 이렇게 엄청난 용량이 튀어나온다니 그저 놀라울 따름입니다. 게다가 이 방식은 호환성도 상당히 뛰어나, 대부분의 압축 해제 프로그램에서 다 먹힌다고 하네요.
뭐, 이 방법에 한해서라면 일정 수준 이상 피해가 커지지 않게끔 막는 방법이 없는 것은 아닙니다. 위에서 DEFLATE 알고리즘에서 이론적으로 가능한 압축 비율은 최대 1032배라고 했잖아요? 그 말은 정상적인 경우 압축 해제한 파일의 크기가 원래 zip 파일 크기의 1032배를 넘을 수 없다는 뜻이니, 압축 해제 중에 파일의 크기가 원래 파일 용량의 1032배를 초과하면 즉시 작업을 중단하고 기록중이던 파일을 삭제해버리면 됩니다. 하지만 그렇게 해도 일시적으로나마 저장 공간이 대량으로 점유되는 것은 피하기 어렵죠. 예를 들어 위 파일에 이 조치를 적용한다고 하면 대략 10 GiB에 가까운 저장공간을 일시적으로 사용한 시점에서 압축 해제가 중단되는 셈입니다. 당연히 CPU나 메모리도 그만큼 쓰일 것이고, 이에 따라 무의미한 전력소모도 일어나겠지요. 따라서 이런 파일들을 이메일에 첨부하여 대량으로 투하하는 방식으로 이메일 첨부파일 보안솔루션이나 수신자의 스마트폰을 마비시키는 DoS 공격 시나리오를 생각해볼 수도 있겠군요.
압축폭탄이라니 이 무슨