Neulich habe ich aus Zufall etwas über fork bombs gelesen. Ein wenig googlen hat mich zu diesem genialen Konstrukt geführt:
:() { :|:& }; :
Zuerst mal zur Erklärung dieser (scheinbar wirren) Zusammenstellung von Zeichen:
Die Bash erstellt eine Funktion “:” ohne Argumente ( -> :() <- ).
Die Funktionsdefinition liegt in den geschweiften Klammern. Und zwar wird das Ergebnis der Funktion ":" an die selbe Funktion gepiped. Die neue Funktion wird dabei im Hintergrund ausgeführt (&). Somit wird also die fork-bomb losgetreten. Mit dem ";" ist die Definition beendet. Der abschließende Doppelpunkt ruft die Funktion gleich auf.
Das ganze habe ich von der Bash meines Testrechners ausgeführt. Und: innerhalb weniger Augenblicke war der ganze Rechner funktionsunfähig. Alle verfügbaren Threads waren ausgefüllt. Keine Chance den Rechner wieder gangbar zu machen (mal abgesehen vom Reset-Knopf). Der Kernel hebt einfach die Hände und denkt bei sich: Whatever dude.
Da stellt sich natürlich die Frage, ob Linux keine Möglichkeit bietet lokale DoS-Attacken zu unterbinden. Gibt es natürlich (wundersamerweise ist das nicht defaultmäßig aktiviert). Die Datei /etc/security/limits.conf limitiert für User die möglichen Prozesse (und vieles andere kann dort auch eingeschränkt werden). Weitere Informationen findet man im Header dieser Datei.
Zur Umgehung meines Problems, habe ich folgende Einstellung gewählt:
* hard nproc 100
Damit wird die Anzahl der zulässigen Prozesse je Benutzer auf 100 eingeschränkt. Aber Achtung, die neue Einstellung wird erst bei jedem neuem Login gültig. Weiterhin ist zu probieren, wie sich KDE oder Gnome verhalten. Schließlich wird für eine GUI mit Internetbrowser und was sonst noch alles, einiges an Prozessen gestartet.
Nach einem neuen Login reagiert die bash auf eine Fork-Bomb so:
-bash: fork: Resource temporarily unavailable
Ein < Enter > bringt die Kommandozeile wieder. Also: die Gefahr einer lokalen DoS-Attack ist reduziert. (Ab jetzt auch auf allen meinen Rechnern.)
Ob die Einstellung funktioniert hat, kann man sich mit einem ulimit -a anschauen.
Bringt bei mir jetzt diese Ausgabe für die Prozesse:
max user processes (-u) 100
Quellen im Web dazu:
Pinguin-soft
linux.com
keywords: local DoS-Attack, limits.conf, fork-bomb