Bash fork() bomb

Bash fork() bomb

przez -
10 1694
Konsola program
Fork – bomba (ang. fork bomb) jest swego rodzaju atakiem Denial of Service. Metoda ta opiera się na szybkim stworzeniu wielu kopii programu, które unieruchomią system. Ponieważ w wieloprocesowym tylko określona ilość procesów może być efektywnie wykonywana naraz, stworzenie odpowiednio dużej liczby procesów może unieruchomić system. Wykorzystując funkcję fork(), która służy do tworzenia nowych procesów, możemy zapełnić tablicę procesów systemu operacyjnego.

Tworząc odpowiedni program, polecenie możemy w nieskończoność tworzyć nowe procesy. Unieruchomienie takiej reakcji łańcuchowej jest praktycznie niemożliwe. W takiej sytuacji wywołanie nowego procesu (mającego na celu np. zabicie procesów bomby) jest wstrzymane do czasu zwolnienia choćby jednego wpisu, co jednak jest mało prawdopodobne, ponieważ każdy proces bomby jest gotów w tym momencie się rozmnożyć.

GranicaKażdy z nowo utworzonych procesów wykonuje jakiś kod – działa w tle. Planista systemowy każdemu przydziela czas procesora. Ponieważ procesy tworzą nam się w nieskończoność, czas jaki im jest przydzielany dąży do 0. Takie działanie praktycznie unieruchamia system.

Przejdźmy teraz do samego kodu, który wywoła taką bombę w naszym systemie. Wystarczy wdać w konsoli proste polecenie.

:(){ :|:& };:

Nie polecam uruchamiać go na maszynie, która nie ma ustawionych limitów. W ten sposób po prostu zawiesimy system.

Żeby zrozumieć działanie tego polecenia, zapiszmy je w troszkę wygodniejszej formie:

:(){
  :|:&
};:

Na samym początku tworzona funkcja o nazwie :, która nie przyjmuje żadnych argumentów. W swoim ciele, które jest ograniczone znakami { } wywołuje się rekurencyjnie dwukrotnie, oraz przekazuje strumieniem swoje wyjście do innej instancji tej funkcji. Ten strumień to mechanizm nienazwanych potoków (pipes, |). Następnie przechodzi do tła &, dzięki czemu zabicie procesu – ojca nie zabije procesów – potomków. Średnik kończy definicję funkcji, a końcowy dwukropek jest jej pierwszym wywołaniem.

A tutaj bardziej przejrzysty zapis tej funkcji:

bomb() {
 bomb | bomb &
}; bomb

Kiedy uruchomimy na komputerze taką bombę, praktycznie staje się niemożliwe aby odzyskać kontrolę nad systemem bez jego ponownego uruchomienia. Tak naprawdę jedynym sposobem na zniszczenie takiej bomby jest zabicie wszystkich jej procesów. Niestety próba użycia programu do zabijania procesów kill, potrzebuje utworzenia odrębnego procesu, co może okazać się niemożliwe ze względu na brak wolnej pamięci lub gdy nie ma wolnych miejsc w tablicy procesów.

Jedyną skuteczną metodą obrony przed fork – bombami jest ustalenie górnego limitu procesów, jakie może utworzyć dany proces, lub użytkownik (dotyczy to również jego dalszych potomków). W momencie kiedy proces będzie próbował utworzyć inny proces, a jego rodzic posiada już więcej niż przewiduje maksimum, sklonowanie nie zachodzi. Na konsoli powinien wtedy pojawić się następujący komunikat:

-bash: fork: Resource temporarily unavailable

Maksimum powinno być wystarczająco niskie, aby w razie zaatakowania maszyny przez wielu użytkowników naraz pozostawić wystarczającą ilość wolnych zasobów na uniknięcie katastrofy.

Linki

Podobne artykuły