
Ich habe eine Test-VM eingerichtet, um die Wirkung von Fork-Bomben zu testen. Daher habe ich limits.conf
für den Benutzer Folgendes bearbeitet root
:
root hard nproc 512
Jetzt werfe ich eine Gabelbombe wie folgt ab:
:(){ :|:& };:
Danach wird nach einer Weile (die meines Erachtens dauert, bis die Grenze von 512 erreicht ist) der folgende Fehler angezeigt:
Dies geht ohne Unterbrechung weiter. Gibt es eine Möglichkeit, dies zu stoppen, ohne den Computer neu zu starten?
Antwort1
Gibt es eine Möglichkeit, dies zu stoppen, ohne den Computer neu zu starten?
Es ist nicht ganz unmöglich und Sie können es mit etwas Glück schaffen – d. h. Sie schaffen es, alle Prozesse zu beenden, bevor ein neuer gestartet wird. 1 Sie müssen jedoch sehr viel Glück haben, daher ist es weder ein zuverlässiger noch lohnender Versuch.[vielleicht hat slm hier mehr Glück als ich, lol – um ehrlich zu sein, habe ich mir nicht so viel Mühe gegeben]. Wenn Sie mit den Prioritäten herumspielen, könnten sich Ihre Chancen verbessern (siehe man nice
), obwohl ich vermute, dass dies auch die Wirksamkeit der Fork-Bombe beeinträchtigen wird.
Eine bessere Idee wäre es, eine Version mit Zeitüberschreitung zu verwenden. Ein Beispiel in C finden Sie in Fußnote 5 zumeine Antwort hier. 2 Sie können dasselbe mit einem Shell-Skript tun, es wäre allerdings nicht so kurz wie :(){ :|:& };:
:
#!/bin/bash
export fbomb_duration=$1
export fbomb_start=$(date +%s)
go () {
now=$(date +%s)
if [[ $(($now-$fbomb_start)) -gt $fbomb_duration ]]
then exit 0;
fi
go &
}
while ((1)); do
go
done
Führen Sie das mit einem Argument und einer Anzahl von Sekunden aus. Alle Forks werden nach dieser Zeit beendet.
1 Tatsächlich kann es irgendwann ganz von alleine passieren, wenn der Kernel-OOM-Killer Glück hat. Aber machen Sie sich keine Hoffnungen.
2 Die dort verwendete Methode, um diese spezielle Bombe zu lähmen (durch Setzen von vm.overcommit_memory=2
), wird mit ziemlicher Sicherheit nicht allgemein funktionieren, aber Sie könnten es versuchen. Ich werde es nicht tun, da ich mein System vorerst laufen lassen möchte ;)
Antwort2
Während ich die Antwort auf diese Frage mit dem Titel entwickelte:Wo ist der Fork() bei der Fork-Bombe :(){ :|: & };:?, baute ich eine sogenannte „Zündgabelbombe mit verzögerter Zündung“, die leichter zu zerstören war.
Außerdem konnte ich während der Entwicklung dieser Antwort regelmäßig eine Fork-Bombe stoppen, indem ich alle Prozesse beendete. Es war einfacher und wiederholbarer, als ich erwartet hätte.
Verwendete Methoden
Es ist schon eine Weile her, seit ich diese Antwort geschrieben habe, also bin ich mir jetzt nicht 100 % sicher, aber spontan denke ich, dass ich diese Methode verwendet habe:
$ pkill -f :
Es blieb ein wenig hängen, während auf einen Prozess gewartet wurde, aber irgendwann konnte es ausgeführt werden. Außerdem würde ich mir die ID des übergeordneten Prozesses notieren, bevor ich die Fork-Bombe starte, und würde auch Folgendes tun:
$ pkill -P <PPID>
Das ist die ID des übergeordneten Prozesses (PPID), von dem aus die Fork-Bombe ausgeführt wurde. Diese Methode würde alle untergeordneten Prozesse beenden, was dazu führen würde, dass sie alle kaskadieren und abstürzen.
Antwort3
Ich glaube, Sie könnten es so machen, wie in der Antwort von vorgeschlagenHiervorausgesetzt, Sie haben Zugriff auf die Shell.
killall -STOP -u user1
killall -KILL -u user1