Zip 폭탄은 어떻게 만드나요?


131

우편 폭탄에 대한 이 질문 은 당연히 주제에 관한 Wikipedia 페이지로 연결 되었습니다. 이 기사에서는 1.3 엑사 바이트로 압축 해제되는 45.1 kb zip 파일의 예를 언급합니다.

처음에 그러한 파일을 만드는 데 사용될 원칙 / 기술은 무엇입니까? 나는 실제로 이것을하고 싶지 않다. 관련된 개념에 대한 단순화 된 "어떻게 작동 하는가"설명에 더 관심이있다.

추신

이 기사에서는 9 개의 zip 파일 레이어를 언급하므로 여러 개의 0을 압축하는 단순한 사례는 아닙니다. 왜 9, 왜 각각에 10 개의 파일이 있습니까?


5
@Michael 신고가 유효하지 않습니다. OP는 작동 방식을 묻었을뿐만 아니라, 게시 된 기사에서 안티 바이러스를 비활성화하려는 명시적인 목적을위한 것은 아니라고 말했습니다. 반대로,이 기사의 추진력은 안티 바이러스 비활성화에 대한 언급 만있는 DOS 스타일의 공격 인 것 같습니다.
San Jacinto

2
요점은 OP가 하나의 거대한 압축 파일이 아닌 중첩 된 아카이브로 구성된 특정 파일을 참조하고 있다는 것입니다.
Michael Borgwardt

1
마이클이 옳다고 생각합니다. "PS"에 설명 된 파일을 만드는 방법을 설명하지만 다른 사람은 그렇지 않습니다. 그러나 "PS"가 편집물로 추가 되었기 때문에 답변을 받았을 때 명백히 틀리지 않았을 수 있습니다. 그들은 단지 "그와 같은 파일"은 "1.3 엑사 바이트로 압축 해제되는 파일"을 의미한다고 생각했는데, "링크 된 기사에 설명 된 것과 같은 구조의 파일"을 의미하는 것으로 밝혀졌습니다.
Steve Jessop

1
@onebyone 나는 완전히 동의합니다. 그런 상황에서는 공감대가 적절하다고 생각하지 않습니다.
San Jacinto

4
나는 이것이 "질문에 대한 최선의 대답이 아니다"또는 "당신은 바보이며 살 가치가 없다"또는 그 사이의 행방을 의미하는 다운 보트를 고려할 것인지에 달려 있다고 생각한다. 개인적으로, 나는 답을 다시 읽고 내가 고쳐야 할 명백한 문제가 있는지 확인하기 위해 downvote를 사용합니다. 그러나 나는 내 대답이 무언가에 도움이된다고 생각한다면 동의하지 않고 대답을 바꾸지 않는 것이 매우 기쁩니다. 그리고 나는 어쨌든 전체 투표 과정에 대해 상당히 걱정하지 않았습니다. 이제 Jon Skeet을 절대로 잡지 못할 것이 분명합니다. ;-)
Steve Jessop

답변:


92

Wikipedia 페이지에서 인용 :

Zip 폭탄의 한 예는 45.1.zip 파일로, 45.1 킬로바이트의 압축 된 데이터로, 10 세트의 중첩 된 zip 파일 9 개 레이어를 포함하고, 각 맨 아래 레이어 아카이브 에는 총 1.30 엑사 바이트의 압축되지 않은 데이터에 대해 1.30 기가 바이트 파일이 포함 됩니다. .

따라서 1.3GB 크기의 단일 0GB 파일 하나만 압축하여 ZIP 파일로 압축 한 다음 10 개의 사본을 만들고 ZIP 파일로 압축 한 다음이 과정을 9 번 반복하면됩니다.

이 방법으로, 당신은 완전히 압축을 풀 때, 그 양으로 시작하지 않고도 터무니없는 양의 데이터를 생성하는 파일을 얻습니다.

또한 중첩 된 아카이브는 바이러스 스캐너 (이러한 "폭탄"의 주요 대상)와 같은 프로그램이 현명하고 "너무 큰"아카이브의 압축을 풀기를 거부합니다. 마지막 레벨까지 총 데이터 양이 그다지 중요하지는 않지만 가장 낮은 수준의 파일이 해당 수준에 도달 할 때까지 얼마나 큰지 "보지"않으며 각 개별 파일이 "너무 크지"않습니다. 큰 숫자 만 문제가됩니다.


2
할 수 없습니다 ... 일단 파일을 맨 아래에 압축하면 압축 된 파일은 다음 레이어에 대해 압축 할 수 없습니다.
복어

16
아, 그러나 각 레벨마다 10 개의 동일한 파일 이 있습니다.이 파일은 다시 잘 압축됩니다. ZIP은 파일 간 중복성을 활용하지 않지만 개별적으로 압축 된 10 개의 동일한 파일을 포함하는 아카이브는 다음 계층에서 악용 할 수있는 중복성이 많을 수 있습니다.
Michael Borgwardt

10
요점은 가능한 가장 작은 파일에서 최대량의 데이터를 생성하는 방법이 아닙니다. 요점은 바이러스 스캐너가 너무 큰 아카이브를 보호하려는 시도를 물리 치고 있습니다.
Michael Borgwardt

2
그것은 위키 백과에 대한 기사의 추진력이 아닙니다. DOS 스타일의 공격을 추진하는 것 같습니다.
San Jacinto

2
그러나 파일은 재귀 적으로 추출되지 않습니다 ... 피해자는 계속해서 하위 zip 파일을 추출해야합니다 ... 어떻게 든 해결할 수 있습니다.
Manoj

46

0의 1.3 엑사 바이트 파일을 작성하십시오.

마우스 오른쪽 버튼으로 클릭> 압축 (zip) 폴더로 보내기.


22
당신은 풍자 "웃는"을 잊었다.
tvanfosson

1
파일 크기 제한으로 인해 대부분의 파일 시스템 및 압축 알고리즘에서는 불가능할 것입니다. 그러나 압축 된 아카이브에 파일을 중첩시키고 압축 알고리즘에 총 크기 제한이있는 경우 더 많은 중첩 된 아카이브를 아카이브에 배치하면 이러한 제한을 무시할 수 있습니다.
Blixt

133
1.3 엑사 바이트 파일을 1로 만들어야합니다. 그들은 0보다 훨씬 더 얇습니다 :)
Quinn Wilson

33
@quinn - (초기에는 더 뚱뚱) 0을 압축하는 이유 훨씬 더 효과적이다
wefwfwefwe

1
내가 실수하지 않으면 1GB 이상의 zip 파일을 제공합니다.
Chris S

36

Linux에서 다음 명령을 사용하여 쉽게 수행 할 수 있습니다.

dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -

count를 압축하려는 KB 수로 바꾸십시오. 위의 예제는 10MiB zip 폭탄을 생성합니다 (폭탄은 많지 않지만 프로세스를 보여줍니다).

압축되지 않은 모든 데이터를 저장하기 위해 하드 디스크 공간이 필요하지 않습니다.


8
하지만 당신은 필요 그것은 크기에서 O (n)이 여전히, 압축되지 않은 데이터를 압축하기 위해 컴퓨팅 파워를 압축되지 않은 데이터입니다.
tonfa

2
예, 다른 모든 답변과 마찬가지로 여기에 있습니다.
Thomi

6
Michael Borgwardt의 대답은 압축되지 않은 데이터의 크기가 O (log N)입니다.
Steve Jessop

1
어쨌든. 프로세스의 각 반복은 "아카이브 헤더를 제거하고, 압축 파일 항목을 10 번 복제하고, 아카이브 헤더를 대체하고, 압축"Zip 중첩 수준을 1 씩 증가 시키며, 이전 단계의 압축 데이터 크기에 비례하여 시간이 걸립니다. 압축되지 않은 데이터의 크기에 10을 곱하고 압축 된 데이터의 크기를 늘리면 선형 요소와 같은 방식으로 수행되지 않습니다.
Steve Jessop

3
테스트와 마찬가지로, -9 1.3GB의 0을 압축합니다. 결과는 1.3M 파일입니다. 나는 이것을 10 번 복제했다 (zip 헤더로 엉망이 될 수 없으므로 결과는 zip 폭탄으로 작동하지 않지만 원리를 보여줍니다) zip -9에서 34381 바이트로 압축되는 13M 파일을 제공합니다. 따라서 deflate는 특정 최대 크기의 토큰 만 지원하기 때문에 복제 단계는 실제로 파일을 작게 만듭니다. 18453에서 다음 단계의 결과, 다음, 19012, 19312, 19743, 20120, 20531, 20870.
스티브 Jessop

10

아래는 Windows 용입니다.

로부터 개념의 보안 초점 증거 (! NSFW)는, 그것은 (42 zip 파일 이름)과 같이 간다 16 개 폴더 16 개 폴더, 각이있는 ZIP 파일입니다 :

\ 42 \ lib 0 \ book 0 \ chapter 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ book F \ chapter F \ doc F \ 0.dll

나는이 그림에 잘못되었을 수도 있지만 4 ^ 16 (4,294,967,296) 디렉토리를 생성합니다. 각 디렉토리에는 N 바이트의 할당 공간이 필요하기 때문에 결국 용량이 큽니다. 끝에있는 dll 파일은 0 바이트입니다.

첫 번째 디렉토리 만 압축 해제하면 \42\lib 0\book 0\chapter 0\doc 0\0.dll4GB의 할당 공간이 생성됩니다.


27
방금 보안 연구를 수행하는 벌거 벗은 숙녀라고 생각했습니다.
James McMahon

3
지퍼는 nsfw였습니다. 큰 공황 경보가 울리고 케이지가 책상 주위 천장에서 떨어질 것입니다.
Chris S

4
바이러스 파일이 히트 될 때마다 HR과의 인터뷰가 발생하면 바이러스 스캐너가 필요하지 않거나 HR 부서가 필요하지 않습니다. 그들 중 하나는 사업에 기여하지 않습니다 ;-)
Steve Jessop

2
네트워크 바이러스 검색 프로그램이이를 확인하고 추출하기를 원하기 때문에 NSFW 일 수도 있습니다.
Michael Stum

5
바이러스 스캐너는 의심스러운 것으로 표시해야합니다 (안전하게 차단되거나 바이러스 설치 시도로 안전하지 않은 것으로보고 될 수 있음). 폭탄이 실제로 폭발하면 IT 부서는 가치있는 것을 알게되었습니다. 더 나은 바이러스 스캐너가 필요합니다.
Steve Jessop

8

심각한 답변 :

압축은 반복되는 패턴을 발견하기 때문에 압축 파일은 다음과 같은 데이터를 포함합니다.

0x100000000000000000000000000000000000  
(Repeat this '0' ten trillion times)

매우 짧은 zip 파일이지만 확장하면 크기가 큽니다.


1
0x1 (0x35), 즉 두 번째 0은 35 번 반복되어 주석으로 확장됩니다.
Michael

5

실제 환경에서 파일을 만들려면 (즉, 엄청난 하드 드라이브에 1.3 엑사 바이트 파일을 만들지 않고) 파일 형식을 이진 수준에서 배우고 원하는 파일의 모양을 번역해야 할 수도 있습니다. 압축.


5

이 기사에서는 9 개의 zip 파일 레이어를 언급하므로 여러 개의 0을 압축하는 단순한 사례는 아닙니다. 왜 9, 왜 각각에 10 개의 파일이 있습니까?

우선, Wikipedia 기사는 현재 16 개의 파일이있는 5 개의 레이어를 말합니다. 불일치가 어디에서 왔는지 확실하지 않지만 그게 전부가 아닙니다. 진짜 질문은 왜 처음부터 중첩을 사용 하는가입니다.

압축 파일 *에 대해 유일하게 지원되는 압축 방법 인 DEFLATE는 최대 압축률이 1032입니다. 이는 1-3 바이트의 모든 반복 시퀀스에 대해 무조건 달성 할 수 있습니다. 압축 파일에 대해 수행하는 작업에 관계없이 DEFLATE 만 사용하는 한 압축 해제 된 크기는 원래 압축 파일 크기의 최대 1032 배입니다.

따라서 중첩 된 zip 파일을 사용하여 엄청나게 큰 압축 비율을 달성해야합니다. 압축 레이어가 2 개인 경우 최대 비율은 1032 ^ 2 = 1065024가됩니다. 3의 경우 1099104768 등입니다. 42.zip에 사용 된 5 개 계층의 경우 이론상 최대 압축 비율은 1170572956434432입니다. 실제로 볼 수 있듯이 실제 42.zip은 해당 레벨과는 거리가 멀습니다. 그중 일부는 zip 형식의 오버 헤드이며 일부는 방금 신경 쓰지 않았습니다.

추측해야한다면 42.zip은 큰 빈 파일을 만들고 반복적으로 압축하여 복사하여 형성되었다고 말할 수 있습니다. 형식의 한계를 뛰어 넘거나 압축 등을 극대화하려는 시도는 없습니다. 레이어 당 16 개의 사본을 임의로 선택했습니다. 요점은 많은 노력없이 큰 페이로드를 만드는 것이 었습니다.

참고 : bzip2와 같은 다른 압축 형식은 훨씬 더 큰 최대 압축 비율을 제공합니다. 그러나 대부분의 zip 파서는 허용하지 않습니다.

추신 : zip 파일을 만들어서 사본 자체의 압축을 풀 수 있습니다 (quiine). 또한 여러 개의 사본을 압축 해제 할 수도 있습니다. 따라서 파일을 영원히 재귀 적으로 압축 해제하면 가능한 최대 크기는 무한대입니다. 유일한 제한 사항은 각 반복마다 최대 1032까지 증가 할 수 있다는 것입니다.

PPS 1032 그림은 zip의 파일 데이터가 분리되어 있다고 가정합니다. zip 파일 형식의 단점 중 하나는 아카이브의 파일을 나열하고 파일 데이터로 오프셋하는 중앙 디렉토리가 있다는 것입니다. 동일한 데이터를 가리키는 파일 항목을 여러 개 만들면 중첩 없이도 압축률이 훨씬 높아지지만 파서는 이러한 zip 파일을 거부 할 수 있습니다.


4

zipbomb (또는 gzbomb)을 작성하는 좋은 방법은 대상으로하는 바이너리 형식을 아는 것입니다. 그렇지 않으면 스트리밍 파일 (예 :)을 사용하더라도 /dev/zero스트림을 압축하는 데 필요한 컴퓨팅 성능이 여전히 제한됩니다.

gzip 폭탄의 좋은 예 : http://selenic.com/googolplex.gz57 (여러 파일을 압축 한 후 여러 수준의 압축 후 파일에 메시지가 포함되어 있음)

그 메시지를 찾는 재미를 :)


2

아마도 유닉스에서 특정 양의 0을 zip 프로그램이나 다른 것에 직접 파이프 할 수 있습니까? 그래도 유닉스에 대해 충분히 모른다. 그 외에는 0의 소스가 필요하고 stdin이나 다른 것에서 읽히는 지퍼에 파이프를 넣으십시오 ...


하나의 큰 스트림을 0으로 압축 한 결과가 아닌 특정 파일을 언급하는 실제 질문을 무시한 것으로 하향 조정되었습니다.
Michael Borgwardt

아니, 당신은 여전히 ​​컴퓨팅 능력에 의해 제한됩니다. gzip / zip은 많은 CPU를 사용하기 때문에 (또는 압축 해제 된 파일의 크기 인 O (n) n 이상) gzip / zip을 실행하지 않는 것이 이상적입니다.
tonfa

@tonfa : 글쎄, 물론 당신은 컴퓨팅 파워에 의해 제한 될 것입니다. 내 추론은 당신이 당신의 디스크에 엑사 바이트 (exabyte)의 큰 파일을 만들고 싶지 않다고 생각하고 압축 한 것이다.
Svish

2

모든 파일 압축 알고리즘은 압축 할 정보 의 엔트로피 에 의존합니다 . 이론적으로 0 또는 1의 스트림을 압축 할 수 있으며 충분히 길면 매우 잘 압축됩니다.

이것이 이론적 인 부분입니다. 실용적인 부분은 이미 다른 사람들에 의해 지적되었습니다.


2

bz2, lzma (7-zip) 및 rar와 같은 최근 (1995 년 이후) 압축 알고리즘은 단조로운 파일을 굉장히 압축하며 단일 압축 레이어로 크기가 큰 콘텐츠를 다루기 쉬운 크기로 감쌀 수 있습니다.

또 다른 방법은 극단적 인 크기의 스파 스 파일 (엑사 바이트)을 생성 한 다음 스파 스 파일 (예 : tar)을 이해하는 평범한 파일로 압축하는 것입니다. 검사관이 디스크에 파일을 쓰면 파일의 실제 내용 사이를 채울 때만 공간이 거의 사용되지 않습니다 (잘 작동하는 보관함과 최신 파일 시스템을 가정).


2

그것을 시도했다. 출력 zip 파일 크기는 작은 84KB 파일입니다.

내가 지금까지 한 단계 :

  1. '0'으로 가득 찬 1.4GB .txt 파일을 만듭니다.
  2. 압축하십시오.
  3. .zip의 이름을 .txt로 바꾸고 16 부를 복사하십시오.
  4. 모든 파일을 .zip 파일로 압축하십시오.
  5. .zip 파일 내에서 이름이 바뀐 .txt 파일의 이름을 다시 .zip으로 바꿉니다.
  6. 3 ~ 5 단계를 8 번 반복하십시오.
  7. 즐겨 :)

이름이 바뀐 zip 파일의 압축이 여전히 작은 크기로 압축하는 부분을 설명하는 방법을 모르겠지만 작동합니다. 어쩌면 기술 용어가 부족할 수도 있습니다.


그건 그렇고, 그 안에있는 모든 zip 파일을 지속적으로 추출하는 것을 두려워하지 마십시오. 아래로 중첩 된 zip 파일 만 추출하고 맨 아래까지는 추출하지 않습니다.
jaycroll

2

실리콘 밸리 시즌 3 7 화 우편 폭탄을 생성하는 단계는 다음과 같습니다.

  1. 크기가 0 (예 : 1GB) 인 더미 파일을 만듭니다.
  2. 이 파일을 zip 파일 say로 압축하십시오 1.zip.
  3. n이 파일의 사본을 만들고 (예 : 10 개) 압축 된 아카이브에 파일을 추가하십시오 (예 :) 2.zip.
  4. 3 단계를 반복하십시오 k.
  5. 당신은 우편 폭탄을 얻을 것이다.

파이썬 구현의 경우 this를 확인 하십시오 .


1

ZIP이 Run Length Encoding을 사용하는지 여부는 알 수 없지만 그렇게하면 압축 된 파일에 작은 데이터 조각과 매우 큰 run-length 값이 포함됩니다. 실행 길이 값은 작은 데이터 조각이 몇 번 반복되는지 지정합니다. 값이 매우 크면 결과 데이터가 비례 적으로 커집니다.


2
ZIP은 데이터를 효과적으로 토큰 화하는 Lempel-Ziv-Welch (또는 수정 된 버전) 압축을 사용합니다. 바이트의 '세트'바이트가 길면 압축률이 좋아 지므로 GIF (LZW도 사용)는 그래픽에 적합하고 JPEG (복잡한 사인파 압축 사용)은 데이터가 훨씬 더 '무작위'인 사진에 더 좋습니다 '.
나사로
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.