Forkbomb?

Hallo!

In diesem Blog:
http://www.junauza.com/2008/11/7-deadly-linux-comman…
stehen 7 Wege, um ein Linuxsystem mit einfachen Konsolenkommandos zu zerstören.

Die meisten verstehe ich, #2 will ich nicht verstehen, aber die Forkbomb (#4)
sieht einfach genug aus, um sie verstehen zu können.

Die sieht so aus: :frowning:){:expressionless::&};:

Was genau macht die Zeile? Und warum erzeugt sie oft korrupte Daten?

Viele Grüße!
Ph.

Hallo Scrabz,

die Forkbomb (#4)
sieht einfach genug aus, um sie verstehen zu können.
Die sieht so aus: :frowning:){:expressionless::&};:
Was genau macht die Zeile?

Der Ausdruck :frowning:) ist einfach eine die Deklaration einer Funktion, um das Ganze etwas undurchsichtiger zu machen, heisst die funktion eben nicht f() oder foo(), sondern :frowning:).
In den geschweiften Klammern { } steckt dann der eigentliche Inhalt der Funktion, also im Normalfall sowas:

f() {
echo hallo Welt
}

um beim Aufruf von f „Hallo Welt“ auszugeben.
Hier ruft sich aber die Funktion zweimal selbst wieder auf, das erste Mal als normaler Aufruf, der darauf wartet, bis der Prozess beendet wird und das zweite Mal als ein Prozess, der sofort in den Hintergrund geschickt wird (daher das &-Zeichen) und dort weiterläuft und die Shell kann sofort weitere Kommandos absetzen, hier eben nochmals die Funktion :, so daß diese sich immer weiter verdoppelt, ohne jemals aufzuhören, jedenfalls theoretisch. Praktisch geht das System natürlich irgendwann in die Knie und nichts geht mehr.
Ob dadurch Dateien beschädigt werden, ich weiss es nicht. Nimm dir einen alten Rechner, spiele Linux drauf und mach einen Selbstversuch :wink:
Das Ganze wird wahrscheinlich etwas durchsichtiger, wenn Du den Code etwas ausführlicher und weniger verschleierst aufschreibst:

f() {
 f | f&
}
f

Noch besser wird das Ganze hier erklärt:
http://de.wikipedia.org/wiki/Forkbomb

Viele Grüße
Marvin

Praktisch geht das System natürlich
irgendwann in die Knie und nichts geht mehr.

Das geht sehr schnell, weil das System irgendwann keine Prozess IDs mehr vergeben kann.

Huhu!

Danke für deine Erklärung. Ich habe mich nie mit Shell-Skripting-Befehlen beschäftigt, weil ich es nicht mußte, aber das ist ziemlich spannend.

Und sieht an sich ganz harmlos aus.

Einen alten PC mit Linux zu bespielen und es auszuprobieren scheitert am Mangel an alter Hardware, aber ich werde mal mit virtuellen Maschinen rumspielen, und schauen, was dabei rauskommt.

Viele Grüße!
Ph.

Hallo,
ich habe mir das auch mal angesehen und muss sagen, dass für alle Befehle das root-Passwort abgefragt wird (, sofern der Befehl überhaupt funktioniert). Ohne ein Win/Lin-Diskussion beginnen zu wollen, zeigte mir die Passwortabfrage die Sicherheit von Linux.

Zur Forkbomb:
bash: syntax error near unexpected token `{:’

„rm -rf /“ soll in neueren Distris nicht möglich sein:
„Cannot remove: Drive is busy.“ oder so ähnlich.
Naja, es wird schon möglich sein, aber man wird wohl noch etwas mehr machen müssen.

Hi,

„rm -rf /“ soll in neueren Distris nicht möglich sein:

kann ich mir ehrlich gesagt nicht vorstellen… Allerdings war(ist?) 'glaub bei den SUSEs früher ein ‚globales‘ Alias gesetzt worden…

Grüße,
J~

Hallo Ingo,

ich habe mir das auch mal angesehen und muss sagen, dass für
alle Befehle das root-Passwort abgefragt wird

Das ist richtig. Ich habe gerade keine Zeit, das alles auf meinem System auszuprobieren :wink: aber um halbwegs weit zu kommen, braucht man natürlich root-Rechte. Du kannst als normaler User ja z.B. keine Dateien löschen, für die Du nicht mal Schreibrechte hast.

Zur Forkbomb:
bash: syntax error near unexpected token `{:’

Da muss auf jeden Fall ein blank zwischen { und :
Aber es ist übersichtlicher, wenn Du nicht diese Form mit dem : benutzt und alles hintereinander, sondern die „normale“, die auch in der Wikipedia erwähnt wird, also

function f() {
 f | f&
 }
 f

Die Ergebnisse deiner Experimente würde mich schon mal interessieren :wink:

„rm -rf /“ soll in neueren Distris nicht möglich sein:
„Cannot remove: Drive is busy.“ oder so ähnlich.

In älteren auch nicht, jedenfalls nicht so gründlich, wie man sich das vorstellt, siehe dieses Experiment:
http://www.linux-user.de/ausgabe/2003/03/084-logout/…

Viele Grüße
Marvin

Korrektur zu rm
Hallo,
Meistens sollte man erst nachdenken und dann posten und nicht umgekehrt :wink:

Du kannst als
normaler User ja z.B. keine Dateien löschen, für die Du nicht
mal Schreibrechte hast.

Das habe ich leider Unsinn geschrieben. Mit rm ohne weiteren Parameter werde ich gefragt, ob ich die Datei tatsächlich löschen möchte und mit -f geht es wie’s Brezelbacken, weg ist die Datei, ohne Nachfrage und auch wenn ich weder Schreib- noch noch Leserechte besitze.

Viele Grüße
Marvin

Das habe ich leider Unsinn geschrieben. Mit rm ohne weiteren
Parameter werde ich gefragt, ob ich die Datei tatsächlich
löschen möchte und mit -f geht es wie’s Brezelbacken, weg ist
die Datei, ohne Nachfrage und auch wenn ich weder Schreib-
noch noch Leserechte besitze.

Um eine Datei zu löschen (eigentlich ihren Verzeichniseintrag!) braucht man Schreibrechte auf dem Verzeichnis, nicht auf der Datei.

Wenn das Verzeichnis dir nicht gehört, wird’s auch mit -f nichts.

Grüße,
Sebastian

kann ich mir ehrlich gesagt nicht vorstellen… Allerdings
war(ist?) 'glaub bei den SUSEs früher ein ‚globales‘ Alias
gesetzt worden

Das ist ein Fall von User too stupid. Im Studium haben wurde manchmal den erstsemestern erzählt rm -rf wäre ein Alias für ‚read mail real fast‘. Und das löscht tatsächlich alles im aktuellen Verzeichnis, wodrauf der ausführende Benutzer Schreibrechte hat ohne Sicherheitsabfrage und in allen Unterverzeichnissen. Gegen dumme Benutzer ist das beste Betriebssystem machtlos.

Hallo Sebastian,

Um eine Datei zu löschen (eigentlich ihren
Verzeichniseintrag!) braucht man Schreibrechte auf dem
Verzeichnis, nicht auf der Datei.

Ach, heut ist nicht mein Tag, ich geh lieber Schlittenfahren… Ich vergesse offenbar die einfachsten Sachen am schnellsten :wink:
Aber zum Glück gibt es ja hier immer jemanden, der einen korrigieren kann. Wo Du recht hast, hast Du natürlich recht…

Wenn das Verzeichnis dir nicht gehört, wird’s auch mit -f
nichts.

Aber immerhin zeigt uns dies, daß es für einen einfachen User ziemlich schwer ist, das System in die ewigen Jagdgründe zu schicken, was ja auch Ingo schon festgestellt hat.

Vielen Dank jedenfalls für die Korrektur zur falschen Korrektur.
Marvin