Wie vermeide ich Fluchtsequenzangriffe in Terminals?

29

Das Lesen der Details von CVE-2009-4487 (was die Gefahr von Escape-Sequenzen in Protokolldateien betrifft) überrascht mich ein bisschen.

CVE-2009-4487 zitieren :

nginx 0.7.64 schreibt Daten in eine Protokolldatei, ohne nicht druckbare Zeichen zu bereinigen. Dadurch können Angreifer über eine HTTP-Anforderung, die eine Escape-Sequenz für einen Terminalemulator enthält, den Titel eines Fensters ändern oder möglicherweise beliebige Befehle ausführen oder Dateien überschreiben.

Offensichtlich geht es hier nicht wirklich um eine Sicherheitslücke in Nginx, sondern um die Terminalemulatoren.

Sicher, vielleicht catpassiert es nur aus Versehen, eine Protokolldatei auf das Terminal zu laden, aber grepeine Protokolldatei ist durchaus üblich. lessVielleicht werden Escape-Sequenzen bereinigt, aber wer weiß, welche Shell-Befehle die Escape-Sequenzen nicht ändern ...

Ich stimme der Antwort von Varnish eher zu :

Die Weisheit von Terminal-Response-Escapes im Allgemeinen wurde in regelmäßigen Abständen in Frage gestellt, aber noch immer hat keines der großen Terminal-Emulationsprogramme es für angebracht gehalten, diese Sequenzen zu verwerfen, wahrscheinlich in einem fehlgeleiteten Versuch der Kompatibilität mit der nicht mehr verwendeten 1970er-Technologie. [..] Anstatt alle Programme zu beschuldigen, die Protokolldateien schreiben, wäre es sicherheitstechnisch viel produktiver, die Terminalemulationsprogramme dazu zu bringen, keine dummen Dinge mehr zu tun und dieses und andere Sicherheitsprobleme einmal zu beheben und für alle.

Also meine Fragen:

Wie kann ich mein xterm sichern, so dass es nicht mehr möglich ist, Befehle auszuführen oder Dateien über Escape-Sequenzen zu überschreiben?

Welche Terminalemulatoren für X sind gegen diesen Angriff gesichert?

maxschlepzig
quelle
4
Viele Escape-Sequenzen machen legitime Dinge (benennen Sie ein xterm um / ändern Sie die Größe usw.). Aber kann jemand Escape-Sequenzen identifizieren, die Befehle ausführen oder Dateien überschreiben ?
Krubo
Ähnliches Problem in Bezug auf Angriffe durch Einfügen von Steuerzeichen aus dem Webbrowser auf Security SE: Wie kann ich mich vor dieser Art von Missbrauch der Zwischenablage schützen? tl; dr: Wenn Sie ein xterm / vte-basiertes Terminal verwenden, das nach 2013/2015 veröffentlicht wurde, sind Sie dagegen geschützt, da standardmäßig Steuerzeichen herausgefiltert werden.
Maxschlepzig

Antworten:

27

VT100-Terminals (die alle modernen Terminalemulatoren in gewissem Maße emulieren) unterstützten eine Reihe problematischer Befehle, moderne Emulatoren oder Distributionen deaktivieren jedoch die problematischeren und weniger nützlichen. Hier ist eine nicht vollständige Liste der potenziell riskanten Escape-Sequenzen (ohne diejenigen, die die Anzeige lediglich in irgendeiner Weise unleserlich machen):

  • Die Befehle für beliebige Protokolldateien in rxvt und Eterm von HD Moore gemeldeten . Dies sind in der Tat große Fehler, die zum Glück lange behoben wurden.
  • Der Rückantwortbefehl, auch als Return Terminal Status bezeichnet, wird aufgerufen von ENQ(Ctrl+E ) . Dadurch wird Text in das Terminal eingefügt, als hätte der Benutzer ihn eingegeben. Dieser Text unterliegt jedoch nicht der Kontrolle des Angreifers: Es handelt sich um den Namen des Terminals, normalerweise so etwas wie xtermoder screen. Auf meinem System (Debian squeeze) gibt xterm standardmäßig den leeren String zurück (dies wird von der answerbackStringRessource gesteuert ).
  • Die Befehle Geräteattribute senden, ESC [ c und "Freunde". Das Terminal antwortet mit ESC [ … c(wobei das nur Ziffern und ASCII-Satzzeichen enthalten kann). Auf diese Weise können einige Terminalfunktionen abgefragt werden, die meist veraltet sind, aber möglicherweise von alten Anwendungen verwendet werden. Auch hier ist die Reaktion des Terminals nicht von Benutzereingaben zu unterscheiden, sie wird jedoch nicht vom Angreifer gesteuert. Die Steuersequenz sieht möglicherweise wie eine Funktionstaste aus, aber nur, wenn der Benutzer eine ungewöhnliche Konfiguration hat (keine der üblichen Einstellungen, auf die ich gestoßen bin, hat eine gültige Funktionstasten-Escape-Sequenz, die ein Präfix der Terminalantwort ist).
  • Die verschiedenen Funktionen zur Gerätesteuerung (DCS, beginnend mit ESC P ).
    • Ich weiß nicht, durch was Schaden angerichtet werden kann DECUDK ein typischer Terminalemulator (benutzerdefinierte Schlüssel setzen).
    • DECRQSS(Request Status String) ist ein weiterer Befehl, auf den das Terminal mit einer Escape-Sequenz antwortet, diesmal beginnend mit \eP; Dies kann problematisch sein, da \ePes sich um einen gültigen Schlüssel handelt ( Alt+Shift +P ) handelt.
    • Xterm bietet zwei weitere experimentelle Funktionen: ESC P + p …und ESC P + q …, um Termcap-Zeichenfolgen abzurufen und festzulegen. Aus der Beschreibung kann dies verwendet werden, um zumindest die Wirkung von Funktionstasten zu ändern.
  • Mehrere Statusberichtsbefehle: ESC [ … n(Gerätestatusbericht). Das Terminal antwortet mit einer Escape-Sequenz. Die meisten dieser Escape-Sequenzen entsprechen nicht den Escape-Sequenzen der Funktionstasten. Man sieht problematisch aus: Der Bericht ESC [ 6 nhat die Form woESC [ x ; y Rx undy sind Ziffernfolgen, und dies könnte F3mit einigen Modifikatoren aussehen .
  • Befehle zur Fensterbearbeitung ESC [ … t .
    • In einigen Fällen kann die Größe des xterm-Fensters geändert, ein Symbol angezeigt usw. werden, was störend ist.
    • Einige von diesen führen dazu, dass das Terminal mit einer Escape-Sequenz antwortet. Die meisten dieser Escape-Sequenzen sehen risikoarm aus, es gibt jedoch zwei gefährliche Befehle: die Antworten auf ESC [ 2 0 tundESC [ 2 1 t umfassen das Terminal - Fenster das Symbol Label und Titel sind und der Angreifer diese wählen können.
    • Zumindest unter Debian Squeeze ignoriert xterm diese Befehle standardmäßig. Sie können durch Festlegen der allowWindowOpsRessource oder selektiv durch die disallowedWindowOpsRessource aktiviert werden . Gnome-Terminal unter Ubuntu 10.04 implementiert standardmäßig sogar die Titelantworten. Ich habe keine anderen Terminals oder Versionen überprüft.
  • Befehle zum Festlegen des Terminaltitels oder des Symbolnamens. Unter xterm und den meisten anderen X-Terminals ist dies der Fall . Unter Bildschirm lautet die Escape-Sequenz . Ich finde die Besorgnis über diese Befehle überbewertet. Während sie ein gewisses Maß an Unfug zulassen, hat jede Webseite das gleiche Problem. Wenn Sie in einem Fenster nur nach dem Titel und nicht nach der Klasse des Fensters handeln, öffnen Sie eine Datei, deren Name Sie von einer nicht vertrauenswürdigen Partei erhalten haben, oder Sie zitieren keine variable Erweiterung in einem Shell-Skript oder tupfen einen tollwütigen Hund auf die Nase - Beschweren Sie sich nicht, wenn Sie gebissen werden.ESC ] digit ; title ESC \ESC k title ESC \

Ich finde Varnishs Reaktion unaufrichtig. Es fühlt sich so an, als würde man versuchen, die Schuld zu ändern, oder im Sicherheits-Nazi-Modus (jede Sicherheitsbedenken, ob echt oder nicht, rechtfertigen das Blackballing einer Funktion).

Die Weisheit von Terminal-Response-Escapes im Allgemeinen wurde in regelmäßigen Abständen in Frage gestellt, aber noch immer hat keines der großen Terminal-Emulationsprogramme es für angebracht gehalten, diese Sequenzen zu verwerfen, wahrscheinlich in einem fehlgeleiteten Versuch der Kompatibilität mit der nicht mehr verwendeten 1970er-Technologie. (…)
Anstatt alle Programme zu beschuldigen, die Protokolldateien schreiben, wäre es sicherheitstechnisch viel produktiver, die Terminalemulationsprogramme dazu zu bringen, keine dummen Dinge mehr zu tun und dieses und andere Sicherheitsprobleme ein für alle Mal zu beheben für alle.

Viele der Rückantworten sind nützliche Funktionen: Eine Anwendung muss Dinge wie die Cursorposition und die Fenstergröße kennen. Das Einstellen des Fenstertitels ist ebenfalls sehr nützlich. Es wäre möglich, sich vollständig auf ioctlAufrufe für diese zu verlassen, dies hätte jedoch zusätzlichen Code und Dienstprogramme erforderlich gemacht, um diese zu erstellenioctl Aufrufe tätigen und sie in Text im Unix-Stil zu übertragen, der Dateideskriptoren weitergibt. Das Ändern dieser Schnittstellen würde jetzt viel Arbeit bedeuten und wenig Nutzen bringen.

Textdateien dürfen keine nicht druckbaren Zeichen wie Steuerzeichen enthalten. Protokolldateien werden im Allgemeinen als Textdateien erwartet. Protokolldateien sollten keine Steuerzeichen enthalten.

Wenn Sie besorgt , dass eine Datei Escape - Sequenzen enthalten können, öffnen Sie sie in einem Editor, oder sehen Sie es mit , lessohne -roder -ROption, oder sehen Sie es durch cat -v.

Gilles 'SO - hör auf böse zu sein'
quelle
2
"Es wäre möglich, sich vollständig auf ioctl-Anrufe für diese zu verlassen." Aber was ist, wenn es wirklich ein serielles Kabel zwischen der App und dem Terminal gibt?
MMV-Ru
5

So einfach ist das nicht. Viele Leute haben Code, um den xtermTitel als Teil der Eingabeaufforderung oder aus sehr guten Gründen festzulegen shutdown. Eine ordnungsgemäße Behebung erfordert daher die Einführung von Sicherheitskontexten und damit eine ernsthafte Komplikation der Interaktion zwischen Shells und Terminalemulatoren sowie wahrscheinlich auch der Punktedateien von Personen. Oder Sie können sich für die kostengünstige Lösung entscheiden, alles zu bereinigen, was in einem Terminal angezeigt wird. Dies reduziert sich größtenteils auf das Entweichen von Steuerzeichen, was wahrscheinlich sowieso getan werden sollte, um sie hervorzuheben (da sie in einer Protokolldatei auf jemanden hinweisen können, der versucht, Shellcode zu injizieren).

(Abgesehen davon ist Punycode ein schwerwiegenderes Beispiel für die gleiche Art von Problem - und wurde dennoch zum offiziellen Standard erklärt. Manchmal besteht die Sicherheit darin, unsichere Designs zu mindern, die außerhalb der Kontrolle des Benutzers liegen.)

Geekosaurier
quelle
1
Ein x-Term kann das Ändern des Titels über Escape-Sequenzen ermöglichen, erlaubt jedoch nicht das Überschreiben von Dateien und das Ausführen von beliebigen Befehlen über Escape-Sequenzen. Das wäre doch ein Fortschritt, oder?
Maxschlepzig
1
Die direkten Wege dazu sind seit Jahren gesperrt. Indirekte Wege bleiben bestehen, obwohl sie zumindest einen zusätzlichen Schritt erfordern (z. B. Social-Engineering-Angriff, um den Benutzer zum Aufrufen einer umprogrammierten Funktionstaste zu veranlassen). Die Titelleiste wurde im CVE jedoch speziell hervorgehoben, vermutlich als Teil eines Angriffs, der einen Benutzer dazu verleitet, etwas an der falschen Stelle zu tun. Die größte moderne Sorge ist etwas, das so programmiert werden kann, dass beliebiger Text an eine Shell gesendet wird, und Rückantworten, mit denen ein Angreifer herausfindet, was der Terminalemulator tun kann ...
Geekosaurier
... aber das, Tempo Lack, ist nach wie vor an Sicherheit grenzender Wahrscheinlichkeit in großen kommerziellen Umgebungen eingesetzt , in denen die Software minimal portiert ist und es dauert viel mehr als nur Zähne ziehen die entsprechenden Änderungen vorgenommen zu bekommen.
Geekosaurier