Was bedeutet dieser kryptische Bash-Befehl?

23

Ich habe die Warnung des Ubuntu-Forums über böswillige Befehle gelesen und dieses interessante Juwel gefunden:

:(){ :|:& };:

WARNUNG: Der obige Code führt zu einem Absturz Ihres Computers, sofern keine strengen Prozessbeschränkungen festgelegt wurden (die Sie wahrscheinlich nicht beachten), die einen harten Neustart erforderlich machen.

Betrachten Sie diesen Code als ähnlich wie ausgeführt sudo rm -rf / .

Aber was heißt das? Trotz meiner Programmiererfahrung habe ich noch nie einen so kryptischen Befehl gesehen, der keine Assemblersprache ist.

TheLQ
quelle
16
Ein weiterer Punkt: Dies ist wirklich in keiner Weise ähnlich sudo rm -rf /. Dieser Befehl löscht alle Ihre Dateien. Dieser verstopft nur die Ressourcen Ihres Computers, bis er unbrauchbar wird und Sie neu starten müssen.
Jtbandes
@jtban: Dann bearbeite es. Beide Codeteile sind meiner Meinung nach "gefährlich". Ja sudo rm -rf /ist mehr als gefährlich , aber ich habe Leute auf Remote - Servern ausführen gesehen „wollten nur sehen , was es getan hat“ , wo Sie haben eine harte Zeit zu einem Bedienfeld ohne Zugang neu zu starten.
Josh K
7
Es ist eine Emotibomb: P
RCIX
Beachten Sie, dass es sein könnte arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name. Der Name :macht diesen Befehl nicht nur kurz und kryptisch, sondern macht aus einem :eingebauten Befehl, der nichts bewirkt, eine Funktion, die viel bewirkt . Wenn Sie die Definition :(){ :|:& }in die Umgebung einer anderen Person einschleichen und sie dort belassen, schlägt sie zu, wenn das Opfer sie am wenigsten erwartet .
Kamil Maciorowski

Antworten:

40

Es ist, wie Sie sagten, eine Gabelbombe. Es definiert eine Funktion und ruft sie dann auf. Die Funktion wird aufgerufen: .

Nennen forkbombwir es, damit wir besser sehen können, was los ist:

forkbomb(){ forkbomb|forkbomb& };forkbomb

Wie Sie sehen und wahrscheinlich aufgrund Ihrer Programmiererfahrung erraten können, ist der erste Teil die Funktionsdefinition ( forkbomb(){ ... }) und der allerletzte: ist der Ort, an dem die Funktion aufgerufen wird (die ;einfach getrennten Anweisungen in Bash).

Was macht diese Funktion nun? Wenn Sie mit Bash vertraut sind, wissen Sie, dass das |Zeichen die Standardausgabe eines Befehls / Programms an die Standardeingabe eines anderen Befehls / Programms weiterleitet. Also im Grunde :|:startet zwei Instanzen der Funktion gestartet (hier wird "gegabelt").

Und dann die Magie: Die &stellt diese Befehle in den Hintergrund und ermöglicht die Rückkehr der ursprünglichen Funktion, während sich jede Instanz gabelt, bis die Kühe im Hintergrund nach Hause kommen, wodurch alle Ressourcen aufgebraucht und das System heruntergefahren werden (sofern es keine Einschränkungen gibt) auferlegt).

jtbandes
quelle
1
Gute Antwort! Ich wusste nicht, dass Sie Folgendes verwenden können: als Funktionsname. Das Umbenennen hilft. Akzeptiert in 3 Minuten.
TheLQ
1
+1 Cool ... Tolle Erklärung. Dies ist wie ein Stapelüberlauf für den Taskswitcher des Betriebssystems. Bringt es den Kernel zum Absturz oder verschlingt es nur Ressourcen, bis es zu unerträglich wird, um es zu verwenden?
Evan Plaice
Ich glaube nicht, dass es den Kernel wirklich zum Absturz bringt, zumindest nicht direkt. Es werden immer mehr Prozesse erstellt, die jeweils CPU und Speicher beanspruchen. Wenn der Prozessor versucht, alle Prozesse zu verarbeiten, ist die Verwendung unmöglich. Es kann sein, dass der Kernel unter der Last abstürzt (da bin ich mir nicht sicher), aber vorher wird er unbrauchbar.
Jtbandes
3
Vergessen Sie nicht, das Finale zu erklären :, das die Funktion tatsächlich ausführt!
Phoshi
@Phoshi: Dachte ich habe, aber ich werde bearbeiten, um zu klären!
Jtbandes
9

Entnommen aus dem Wikipedia-Artikel Forkbomb :

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.
James T
quelle
7

Heruntergebrochen:

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

Wechseln :zu bombund Sie haben:

bomb(){ bomb|bomb& };bomb

Es ist wirklich sehr elegant.

Josh K
quelle