Bombenbau-Anleitungen (für angehende Informatiker)
Fork-Bombe
Eine Fork-Bombe ist ein Programm/Skript oder ein Kommandozeilen-Befehl der unbeschränkt
forkt und sich dadurch bombenartig vervielfältigt.
Ein Beispiel für die Shell ist diese Zeile, die auch auf der Kommandozeile (der Bash und ähnlicher
Shells) funktioniert:
:(){ :|:& };:
Schöner sieht diese Bombe auf dem Bild vom Debian-Paket pydance-music aus, das man mit dem
Lied forkbomb.ogg unter /usr/share/games/pydance/songs/forkbomb/ findet:
Hier wird zunächst die Funktion : definiert (bis zum Semikolon) und anschließend wird diese
ausgeführt.
Danach geht es rund: Die Funktion ruft sich zweifach selbst auf und jeder dieser neuen Aufrufe ruft
sich auch zweifach auf und so weiter.
Die Pipe (|) sorgt dafür dass die Shell sich forkt um das erste : auszuführen (es muss ja gleichzeitig
mit dem zweiten laufen, um seine Ausgabe als Eingabe für das zweite zu verwenden); das & sorgt
dafür, dass die Shell sich forkt, um den ganzen Ausdruck (also : | :) im Hintergrund auszuführen.
Jeder Funktionsaufruf sorgt also für zwei neue Prozesse; diese führen den gleichen Code selber
ebenfalls aus (da die Funktion sich ja selber aufruft), erzeugen als ebenso zwei neue Prozesse. Das
sind schon vier; bei der nächsten Runde werden es 8; usw..
Wie beim Explodieren von A-Bomben hat man auch hier anfänglich ein exponentielles Wachstum;
daher der Name der Fork-Bombe und deshalb verwendet das obige Bild von pydance-music als
Grundlage ein Bild vom Mock-Up (Attrappe) der Little Boy.
Dieses (auf 50 % verkleinerte und per Rechtsklick vergrößerbare) Bild von wikipedia.de zeigt das
exponentielle Wachstum, bei dem jeder einzelne Prozess zwei weitere auslöst.
Ein äquivalentes Beispiel der obigen Zeile für die Shell gibt es natürlich auch für Batch-Dateien
(MS-Windows):
%0|%0
Diese 5 Zeichen in einer Text-Datei mit Namen beispiel.bat reichen aus; zum Ausführen reicht dann
ein Doppelklick.
In C sieht die Fork-Bombe so aus:
#include <unistd.h>
int main (int argc, char* argv[]) { for(;;) fork(); }
In der Praxis zeigen sich einige Unterschiede zwischen den verschiedenen Varianten der Fork-
Bombe: Die letzte Version, mittels "gcc -O2 -o forkbomb forkbomb.c" compiliert, bringt SuSE 11.1
augenblicklich so schnell und nachhaltig zum Stehen, das ein in einem anderen Fenster laufendes
top nichts davon anzeigt und das Betriebssystem zumindest eine Stunde lang nur auf den Magic
System Key Request reagiert, selbst wenn die Forkbombe nur von einem einfachen User ausgeführt
wird, während die Shell-Version es nur träge macht, selbst wenn die Shell-Version von root
ausgeführt wird.
Der Grund hierfür sind Limitierungen von (2009) modernen Betriebssysteme, die meist auch beim
Superuser wirksam sind. Beispielsweiese läßt sich das SuSE 11.1 durch die C-Version nicht
aufhängen, wenn man in die C-Version vor jedem fork ein printf einfügt, oder hinter jedem fork
eine Endlosschleife wie for(;;) einfügt, denn das reduziert die Geschwindigkeit des Forkens und gibt
mehr Zeit zum Limitieren.
Die Wirkung der Fork-Bombe hängt auch vom Nice-Level bzw. der Priorität ab: Je niedriger der
Nice-Level bzw. je höher die Priorität desto schwerer ist sie zu stoppen.
Verwendet werden Fork-Bomben unter Anderem zum Reduzieren der Rechner-Geschwindigkeit
(für einzelne Prozesse) und auch zum Testen von Limitierungen beispielsweise mittels ulimit oder
/etc/security/limits.conf: Wurde richtig limitiert, kann eine Fork-Bombe nicht stören; hat ein User
keine Limitierungen, was traditionellerweise beim Superuser der Fall ist, MUß der Rechner
hierdurch hängen bleiben weil die Prozesse Resourcen (Speicher, CPU-Zeit) belegen, die durch das
exponentielle Wachstum rasch erschöpft sind, aber Notfall-Aktionen wie z. B. der Magic System
Key Request, müssen weiterhin funktionieren.
Ein weiteres Anwendungsfeld für Fork-Bomben ist das Überprüfen von Echtzeit-Eigenschaften wie
Interruptlatzenzeiten unter erschwerten Bedingungen, beispielsweise von RTAI.
Unter BSD findet man ein Fork-Bomb-Programm normalerweise unter ports/packages/pkgsrc, zum
Üben der System-Administration: http://bsdwiki.reedmedia.net/wiki/Monitor_disk_input--
output.html.
Eine Fork-Bombe ist eine der wenigen Möglichkeiten einen Rechner gezielt zum Hängen bleiben
(hangup) zu bringen um beispielsweise Watchdogs, die bei den meisten Server- u. Workstation-
Mainboards sowie IPMI-Modulen integriert sind, auch remote zu testen.
Allerdings eignen sich Forkbomben nur wenig zum Belasten von CPUs/GPUs/Kernen: Wie auch
Messungen mit Leistungsmessern zeigen, ist der Stromverbrauch mit einer Forkbombe weit
geringer als mit einem CPUburn-Programm, also einem Programm das optimiert wurde um (alle)
CPUs/GPUs/Cores durch möglichst hohen Stromverbrauch möglichst stark zu erwärmen. Und
hierbei zeigen sich die besten und damit höchsten Werte mit den Programmen der CPU-Hersteller,
die jeweils für nur eine Prozessor-Familie erstellt werden und meist "confidential" sind.
Links dazuMan kann zwar versuchen mit einer Fork-Bombe die CPUs noch zu mehr beschäftigen indem man
sie nebenbei noch etwas rechnen läßt, z. B. mittels
:(){ :|md5sum /dev/urandom&:& };:
oder
:(){ :|bzip2 -c /dev/zero > /dev/null&:& };:
aber damit wird meist nicht mehr Leistung verbraucht als mit einer einfachen Fork-Bombe.
Hierzu ein paar Werte der Stromaufnahme von meinem neuen Server im Februar 2010, mit dem
Mainboard X8SAX, BIOS t1070 mit aktiviertem TourboBoost und SMT, CPU Core i7 940, PSU
PWS-865-PQ, 6x 1 GiB RAM, 2 TB SATA II HDD, Nvidia GeForce 9600 GT, unter Debian 5.03
(Lenny and a half) 64 Bit sofern nichts anderes angegeben ist:
4,6 Watt im Standby (nach poweroff)
134 Watt mit BIOS-Meldungen oder ruhendem Desktop
165 Watt mit md5sum Fork-Bombe
165 Watt mit bzip2 Fork-Bombe
168 Watt mit simpler simple Fork-Bombe unter Knoppix (32 Bit)
230 Watt mit burnP6 mit 1 Thread/Core (d. h. 8 Threads wg. SMT)
260 Watt mit Nehalem-EP Power Thermal Utility Rev 1.4, mit 1 Thread/Core (d. h. 8 Threads wg
SMT), wobei es 32-Bit-Bibliotheken verwendet.
275 Watt wenn zusätzlich zum letzten noch Glxgears läuft und die Grafikkarte belastet.
Hierbei kann man noch mehr Leistung erreichen, beispielsweise um den Rechner in einer
Klimakammer zu testen oder um die Heizung im gleichen Raum zu unterstützen oder um das
Netzteil zu testen, indem man auch die Festplatte und das RAM auslastet und für die Grafikkarte
einen "Power Virus" wie Furmark (1.8) verwendet. Die maximale Leistung zu erreichen ist aber
nicht-trivial, weil die CPU-Cores nicht gleichzeitig sich selbst und andere Komponenten auslasten
können, so das man die optimalen Prioritäten und Anzahlen der jeweiligen Threads sowie deren
Verteilung auf die NUMA-Nodes oder Cores durch Messungen ermitteln muß.
Wikipedia-Eintrag dazu
http://www.forkbomb.com/
Hey ich verstehs echt nicht oder will es einfach nicht verstehn ... jedenfalls gehts im mir vorliegenden PDF weiter mit der Zombie Bombe also gibts bald neues Futter (allerdings keine Gehirne)
Herjeh ich weiß ja nichtmal wie ich die Smilys wegbekomme.