Vidlicová bomba

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 31. srpna 2021; kontroly vyžadují 2 úpravy .

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.

Popis

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.

Příklady vidlicových bomb v různých programovacích jazycích

C : [1]

#include <stdlib.h> int main ( void ) { pro (;;) { systém ( "start" ); } }

nebo:

#include <unistd.h> int main ( void ) { while ( vidlice ()) {}; }

Bash : [2]

 : (){  : | : & } ; :

nebo

vidlice () { vidlice | vidlice & } Vidlička

Java :

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 vidlice

Python :

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 vidlice

Druhá možnost:

smyčka { vidlice }

PHP :

<?php while ( true ) { pcntl_fork (); }

Dávkový soubor Microsoft Windows :

: s start %0 goto : s

Druhá možnost

začátek %0 %0

Varianta na VB.NET

DoSystem . _ diagnostika . proces . Start ( System . Reflection . Assembly . GetExecutingAssembly ( ). Umístění ) Loop While True

Pseudokód :

alg ProgramX při skutečném volání nc ProgramX cc con alg ProgramX

Obtížnost eliminace

V 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 ; Hotovo

Prevence

Jední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.

Viz také

Poznámky

  1. jeden z elegantnějších příkladů vidlicové bomby od Markys'oma
  2. jeden z nejelegantnějších příkladů vidlicové bomby od Jaromila