it-swarm.com.de

Ist die Verwendung von "Echo" zur Anzeige von vom Angreifer kontrollierten Daten auf dem Terminal gefährlich?

Stellen Sie sich den folgenden Code vor:

ATTACKERDATA="$(cat attackerControlledFile.txt)"
echo "${ATTACKERDATA}"

Ein Angreifer kann durch einen beliebigen Prozess den Inhalt von attackerControlledFile.txt Nach Belieben ändern. Der Inhalt kann ASCII, UTF-8, Binär usw. sein. Alles ist in Ordnung. Das Gerät geht auch davon aus, dass es unendlich schnell ist, sodass selbst eine extrem große Datei mit mehreren Terrabyte sofort gelesen und gedruckt werden kann.

Ist es einem Angreifer möglich, unabhängig davon, wie unwahrscheinlich es wäre, dies irgendwie auszunutzen, indem er den Inhalt von attackerControlledFile.txt Ändert? "Irgendwie" bezieht sich auf Dinge wie:

  • Dieser Code funktioniert nur in bash
  • Für diesen Code muss die Ausgabe auf einen bestimmten Terminalemulator gedruckt werden
  • Usw.

Alles andere setzt ein einigermaßen vernünftiges System voraus. Dies bedeutet, dass Antworten wie "Wenn echo eine vom Angreifer kontrollierte Binärdatei ist, die tatsächlich Malware ist" nicht zählen, da das Vorhandensein von Malware nicht genau "vernünftig" ist. Antworten, für die eine bestimmte Software oder Version dieser Software vorhanden sein muss , zählen , solange diese Software nicht zum Zweck der Ausnutzung erstellt wurde.


Eine ähnliche Frage lautet Ist es möglich, den Linux-Befehl "echo" böswillig zu verwenden? , aber die akzeptierte Antwort bezieht sich tatsächlich auf einen Fehler im Design einer Webanwendung. Außerdem muss der Angreifer in der Lage sein, Weiterleitungen durchzuführen, was meines Wissens dieses Konstrukt meines Wissens nicht kann.

47
MechMK1

Ist es einem Angreifer möglich, unabhängig davon, wie unwahrscheinlich es ist, dies irgendwie auszunutzen, indem er den Inhalt von attackerControlledFile.txt ändert? "Irgendwie" bezieht sich auf Dinge wie:

Für diesen Code muss die Ausgabe auf einen bestimmten Terminalemulator gedruckt werden

In der Tat ja. Alte Terminals wie vt100 können ANSI-Escape-Sequenzen verwenden, um spezielle Dinge wie Ausführungsbefehle auszuführen. Die folgende Seite dokumentiert diese Fähigkeit mit einem einfachen Echo, wie Sie es beschreiben.

https://www.proteansec.com/linux/blast-past-executing-code-terminal-emulators-via-escape-sequences/

Der Artikel enthält ausführliche Anweisungen zum Ausnutzen, aber die allgemeine Idee kann aus diesem Auszug auf der Website zusammengefasst werden:

Gefährliche Fluchtsequenzen Terminalemulatoren unterstützen mehrere Funktionen, wie unten beschrieben [8]:

  • Screen Dumping: Eine Screen Dump Escape-Sequenz öffnet eine beliebige Datei und schreibt den aktuellen Inhalt des Terminals in die Datei. Einige Terminalemulatoren schreiben nicht in vorhandene Dateien, sondern nur in neue Dateien, während andere die Datei einfach mit dem neuen Inhalt überschreiben. Ein Angreifer kann diese Funktion verwenden, um eine neue Backdoor-Datei PHP) im DocumentRoot des Webservers zu erstellen, mit der später beliebige Befehle ausgeführt werden können.

  • Fenstertitel: Zum Festlegen des Fenstertitels ist eine Escape-Sequenz vorhanden, mit der die Fenstertitelzeichenfolge geändert wird. Diese Funktion kann zusammen mit einer anderen Escape-Sequenz verwendet werden, die den aktuellen Fenstertitel liest und in die aktuelle Befehlszeile druckt. Da ein Wagenrücklaufzeichen im Fenstertitel verboten ist, kann ein Angreifer den Befehl in einem Fenstertitel speichern und in der aktuellen Befehlszeile drucken. Ein Benutzer muss jedoch weiterhin die Eingabetaste drücken, um ihn auszuführen. Es gibt Techniken, um den Befehl unsichtbar zu machen, z. B. das Festlegen der Textfarbe auf dieselbe Farbe wie der Hintergrund, wodurch sich die Änderungen des Benutzers erhöhen, der die Eingabetaste drückt.

  • Befehlsausführung: Einige Terminalemulatoren können sogar die direkte Ausführung des Befehls mithilfe einer Escape-Sequenz ermöglichen.

Wie in den Kommentaren ausgeführt, wurde dieser besondere Exploit vor Jahrzehnten auf modernen Terminalemulatoren behoben. Dies war zufällig ein einfaches Beispiel dafür, dass eine 30-sekündige Google-Suche das Konzept deutlich machte, dass immer noch Software in Arbeit ist, die selbst in etwas so Einfachem wie dem Anzeigen einer Datei ausgenutzt werden kann.

Theoretisch könnte es bei modernen Terminalemulatoren (Pufferüberläufe?) Andere Probleme geben, die ausgenutzt werden könnten.

48
Steve Sether

Wenn die Ausgabe an ein Terminal gesendet wird, treten möglicherweise andere Probleme auf (unabhängig davon, wie Sie sie drucken, es sei denn, Sie entfernen Sonderzeichen), wie in anderen Antworten angegeben.

Wenn die Datei gigantisch sein kann, kann der Angreifer bash dazu bringen, viel RAM zu verwenden. Betrachten Sie head -c 100000 Anstelle von cat, um eine Obergrenze von 100 KB festzulegen. Oder head -c 10000 | cat -v (Nicht druckbare Zeichen als ^M Oder was auch immer anzeigen; UTF-8-Mehrbytezeichen können beschädigt werden).

Wenn Sie möchten, dass die Daten möglicherweise riesig sind, sollten Sie diesen Befehl direkt ausführen (nicht in einem var=$()-Capture), wobei die Ausgabe von cat direkt mit Ihrem Standard verbunden ist.


Da Sie die Daten in der Shell-Variablen haben und nicht eval in doppelten Anführungszeichen stehen, sind Sie vor einigen Dingen sicher.

z.B. Befehlsersetzung funktioniert nicht.

[email protected]:/tmp$ foo='$(touch bar)'
[email protected]:/tmp$ echo "${foo}"
$(touch bar)

Ein Angreifer kann die Ausgabe mithilfe der Zeichenfolge -n leicht verschieben, die echo stattdessen als Option interpretiert Literaldaten.

$ echo "-n"     # notice that this doesn't print a newline.
$ echo ""       # unlike a normal echo "" or echo with no args

$

Aber das eingebaute echo von bash behandelt "-n foo" Nicht als Option. es ist wörtlich gedruckt:

$ echo "-nabcd"
-nabcd

Da Sie die Shell-Variable in doppelte Anführungszeichen erweitern, kann sie nicht zu multiple Argumenten für Echo wie echo "-n" "leave the cursor at the end of this string" Werden.

Ebenso ist -e Nicht möglich und stellt ohnehin keine Gefahr dar, da Ihre Datei bereits beliebige Binärdaten enthalten kann.


/bin/echo Von GNU Coreutils unterstützt eine --version - Option. Wenn Sie also kein in Shell integriertes Echo verwenden, kann ein Angreifer Ihr Programm dazu bringen, die Softwareversion zu drucken info. Wenn diese Ausgabe in einem für Angreifer sichtbaren Bereich endet, werden einige Informationen zum Zielsystem angezeigt.


Aus diesen Gründen lautet die Empfehlung für portabel Drucken beliebiger Daten:

printf "%s\n" "${ATTACKERDATA}"

Funktioniert auf allen POSIX-Shells und unterliegt nicht den systemspezifischen Abweichungen von echo.

Beachten Sie jedoch, dass dies nichts für Terminal-Schwachstellen bedeutet. Es ist nur eine sichere Möglichkeit, Daten buchstäblich zu schreiben, ohne dass echo sie mungiert.

Und Binärdaten behandeln \0 (Ein Null-Byte) in den meisten Shells immer noch als Terminator, da bash intern C-Strings verwendet. Die OS-Schnittstelle execve verwendet ebenfalls C-Zeichenfolgen, aber Shell-Builds ermöglichen es Shells, diese für echo/printf zu umgehen, sodass ist möglich ist für zB zsh zum Echo/Drucken von Binärdaten, die null Bytes enthalten.


Und übrigens, in Bash brauchen Sie eigentlich nicht cat, um eine Datei zu lesen. Befehlsersetzung durch eine Umleitung bringt Bash dazu, das zu tun sich selbst lesen.

ATTACKERDATA="$(< attackerControlledFile.txt)"

Wenn Sie jedoch eine Verarbeitung wie head -c Und/oder cat -v Wünschen, sollten Sie einen echten Befehl verwenden.

11
Peter Cordes

Einige Terminals können den Inhalt des Bildschirms wie eingegeben wiedergeben.

Somit können Sie möglicherweise die "Eingabe" und damit die Befehlsausführung mit den richtigen Terminalbefehlen erzwingen. Ich habe dies auf physischen DEC VT62-t S getan. habe aber nicht versucht, es mit dem VT-52-Modus von X-term zu tun

dieser Exploit ist bekannt und wahrscheinlich der Grund, warum finger -l username alle Steuerzeichen (außer Zeilenumbruch und Tabulator) von ~username/.plan usw. entfernt

also ja, es ist gefährlich. um es sicher zu machen, leiten Sie es durch weniger oder mehr usw.

4
Jasen

Nein, das im obigen Beispiel verwendete Echo ist in Ordnung

Echo druckt einfach einen String in das Pipe-Standard (Standard).

per: https://superuser.com/a/699500/527937

Rohre können nicht überlaufen. Eine Pipe ist nur ein Puffer (eine bestimmte Speichermenge, höchstwahrscheinlich 64 KB auf einem aktuellen System) zwischen einem Produzenten und einem Konsumenten. Wenn der Produzent schneller produziert als der Konsument konsumiert, wird der Produzent blockiert (dh das Programm wird in den Ruhezustand versetzt), bis der Konsument durch Lesen aus dem Puffer wieder Platz im Puffer schafft.

Nebenbei bemerkt, wenn Sie eine große Datenmenge in einer Zeile haben ... cat kann eine enorme Menge an Systemspeicher hängen und/oder verbrauchen.

2

Der Angreifer kann einen Content-Injection-Angriff ausführen, insbesondere wenn er weiß, wie die Shell-Eingabeaufforderung aussieht.

Indem sie etwas in die Datei aufnehmen, das aussieht, als würde es von einem anderen Teil des Systems ausgegeben, können sie den Benutzer möglicherweise entmutigen und ihn dazu bringen, Maßnahmen zu ergreifen.

0
bdsl