Fork bomb je škodlivý nebo chybně napsaný program, který donekonečna vytváří kopie sebe sama (pomocí systémového volání fork() ), který obvykle také začne vytvářet kopie sebe sama atd.
Provádění takového programu může způsobit velké zatížení výpočetního systému nebo dokonce odmítnutí služby z důvodu nedostatku systémových prostředků (procesní úchyty, paměť, čas procesoru), což je cílem.
Klasický program vidlicové bomby (napsaný v C ) vypadá takto:
#include <unistd.h> int main () { zatímco ( 1 ) vidlice (); }Podobné případy úniku systémových prostředků jsou programy, které plodí zombie a osiřelé procesy . Pokud je však většina vidlicových bomb vytvořena záměrně, pak jsou tyto problémy obvykle výsledkem nepozornosti nebo neschopnosti programátora.
Vidlicová bomba vytváří velké množství svých kopií a snaží se tak zaplnit volné místo v seznamu aktivních procesů operačního systému . Po naplnění seznamu procesů je nemožné spustit užitečný program. I když nějaký jiný proces skončí a místo v seznamu procesů se uvolní, je nepravděpodobné, že se spustí užitečný program, protože mnoho dalších kopií vidlicové bomby již čeká na příležitost spustit svou další kopii.
Kromě naplnění seznamu procesů jsou také možné strategie naplnit virtuální paměť, čas CPU, sokety a další systémové prostředky. Výsledkem vyčerpání těchto zdrojů je zpomalení nebo prakticky zastavení operačního systému a/nebo užitečných programů ( zamrznutí počítače ).
Vidlicovou bombu lze získat i v důsledku chyby ve svědomitém programování. Například program naslouchající na síťovém portu může po přijetí síťového paketu nebo navázání spojení „spadnout“ do nekonečné smyčky vytváření kopií sebe sama, aby zpracoval paket nebo spojení. Jednoduchá chyba programování může vést k úniku paměti nebo následkům vidlicové bomby.
nebo:
#include <unistd.h> int main ( void ) { while ( vidlice ()) {}; } : (){ : | : & } ; :nebo
vidlice () { vidlice | vidlice & } VidličkaJava :
public class forkbomb { public static void main ( String [] args ) { Runtime . getRuntime (). exec ( new String [] { "javaw" , "-cp" , System . getProperty ( "java.class.path" ), "forkbomb" }); } }Perl :
vidlice zatímco vidlicePython :
import os zatímco Pravda : os . vidlička ()V některých systémech je takové volání zakázáno, kopírování je možné pouze v případě, že je uloženo ID procesu:
import os zatímco Pravda : a = os . vidlička ()rubín :
vidlice zatímco vidliceDruhá možnost:
smyčka { vidlice } <?php while ( true ) { pcntl_fork (); }Dávkový soubor Microsoft Windows :
: s start %0 goto : sDruhá možnost
začátek %0 %0Varianta na VB.NET
DoSystem . _ diagnostika . proces . Start ( System . Reflection . Assembly . GetExecutingAssembly ( ). Umístění ) Loop While True alg ProgramX při skutečném volání nc ProgramX cc con alg ProgramXV případě úspěšné vidlicové bomby je obtížné nebo téměř nemožné obnovit normální provoz počítače bez restartu , protože jediný způsob, jak zastavit fungování vidlicové bomby, je současné zastavení všech běžících kopií vidlicové bomby. Ve většině implementací operačních systémů vyžaduje volání příkazu k ukončení procesu spuštění nového procesu, což není možné za podmínek úspěšně běžící vidlicové bomby.
V praxi však některé vidlicové bomby nevyžadují tak drastická opatření a lze je zničit bez nutnosti restartu. Vezměme si například případ bomby z výše uvedeného příkladu:
: (){ : | : & } ; :Zvláštností tohoto kódu je, že po neúspěšném vygenerování svých kopií nezacyklí, ale ukončí se . V důsledku toho je seznam procesů neustále na pokraji zaplnění: jedna z kopií vidlicové bomby je ukončena a uvolněné místo je okamžitě obsazeno nově vytvořeným procesem z jiné kopie vidlicové bomby. Je možné soutěžit s vidlicovou bombou o místo v seznamu procesů. Pak je možné dříve nebo později spustit příkaz k zabití všech kopií vidlicové bomby současně, nebo spustit bezpečný program, který si postupně „získá“ místo v seznamu procesů až do posledního procesu forku. bomba skončí. Příklad takového zabezpečeného programu v zsh :
while ( spát 100 & ! ) do ; HotovoJedním ze způsobů, jak zabránit negativním účinkům vidlicové bomby, je násilně omezit počet procesů, které může uživatel spustit současně. Omezeno může být také množství přidělené virtuální paměti a dalších systémových prostředků. Když je vyčerpán maximální počet dostupných procesů, pokus procesu o vytvoření nového procesu selže. Maximální počet procesů, které lze spustit, by měl být takový, aby umožňoval spouštět přiměřeně užitečný počet programů, ale nevedl k havárii systému, když je od všech uživatelů systému současně spuštěna vidlicová bomba.
Je třeba poznamenat, že omezení počtu procesů samo o sobě nebrání vypuštění vidlicové bomby, ale je zaměřeno pouze na minimalizaci možného poškození, pokud je spuštěna.
Dalším řešením problému je inteligentní rozpoznání vidlicové bomby pomocí samotného operačního systému, ale toto řešení nenašlo široké uplatnění.
Existuje také taková obtíž, že pokud vidlicová bomba zabere veškerý dostupný čas procesoru, pak výsledky její práce mohou být katastrofální nejen na jednom procesoru, ale i na víceprocesorovém systému, a to i s omezením počtu procesů. . Pokud je například počet procesorů 16 a maximální počet běžících procesů je 100, pak pro každý procesor bude průměrně 6-7 spuštěných instancí vidlicové bomby, které pohltí procesorový čas. Chcete-li tento problém vyřešit, je použit limit spřažení procesoru.