Pytałem już o sposób uniemożliwienia wykonania ‘fork-bomby’ na innym forum, ale jedyne odpowiedzi, jakie otrzymałem, wskazywały na konieczność ograniczenia maksymalnej liczby możliwych do uruchomienia przez dany program procesów. Albo z użyciem “ulimit”, albo z użyciem “cgroups”.
Jednak takie ograniczenie uniemożliwia wykonywanie się zwykłych programów, ponieważ one tworzą wielokrotnie procesy potomne na przykład z “shella”. Sprawdziłem to praktycznie i na przykład uruchomienie programu (używającego “fork” w sposób zwykły) z linii komend wymaga co najmniej 30 procesów.
Problem polega na tym, że po rozpoczęciu działania ‘fork-bomby’ system uniemożliwia jej zatrzymanie. Program “pkill” nie nadąża z usuwaniem procesów, często nie można się przełączyć nawet do innego terminala, by wykonać jakiekolwiek polecenie. Poza tym jeśli szkodliwy program zawiera jakieś mechanizmy zmieniające nazwę procesu i “pid” rodzica, to wtedy już w ogóle nic się nie da zrobić ręcznie.
“cgroups” umożliwia tutaj ustawienie maksymalnego wykorzystania CPU przez grupę procesów, ale przecież zwykły program potrzebuje działać z pełną prędkością. Oraz ustawienie innych parametrów jak maksymalne użycie pamięci operacyjnej, “swap”, czy wspomnianą liczbę procesów potomnych.
Natomiast nie sugerując się powyższymi rozwiązaniami, które niczego tak naprawdę nie rozwiązują, chciałbym zapytać, na czym miałoby polegać ograniczenie działania ‘fork-bomby’, jej wykrywanie. Jakie są cechy charakterystyczne ‘fork-bomby’ w porównaniu do zwykłych procesów? By móc ewentualnie zaimplementować w systemie automatyczne wykrywanie ‘fork-bomby’ i jej blokowanie.
Faktem jest, że ‘fork-bomba’ tworzy masowo kolejne procesy w krótkim czasie, więc może jakieś ograniczenie na ilość procesów utworzonych w jednostce czasu? W pustych przykładach ‘fork-bomb’ też te procesy zaraz po utworzeniu usuwa (jeśli zdąży czasowo). Jakieś inne pomysły, czym różni się ‘fork-bomba’ od zwykłego programu używającego “fork”, tak by nie zablokować zwykłych programów? I jaką można by wprowadzić poprawkę do systemu? A może istnieje już jakieś rozwiązanie tego typu, np. w systemach “hardened”?