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 cat
passiert es nur aus Versehen, eine Protokolldatei auf das Terminal zu laden, aber grep
eine Protokolldatei ist durchaus üblich. less
Vielleicht 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?
quelle
Antworten:
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):
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 wiexterm
oderscreen
. Auf meinem System (Debian squeeze) gibt xterm standardmäßig den leeren String zurück (dies wird von deranswerbackString
Ressource gesteuert ).ESC [ c
und "Freunde". Das Terminal antwortet mitESC [ … 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).ESC P
).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\eP
es sich um einen gültigen Schlüssel handelt ( Alt+Shift +P ) handelt.ESC P + p …
undESC P + q …
, um Termcap-Zeichenfolgen abzurufen und festzulegen. Aus der Beschreibung kann dies verwendet werden, um zumindest die Wirkung von Funktionstasten zu ändern.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 BerichtESC [ 6 n
hat die Form woESC [ x ; y R
x
undy
sind Ziffernfolgen, und dies könnte F3mit einigen Modifikatoren aussehen .ESC [ … t
.ESC [ 2 0 t
undESC [ 2 1 t
umfassen das Terminal - Fenster das Symbol Label und Titel sind und der Angreifer diese wählen können.allowWindowOps
Ressource oder selektiv durch diedisallowedWindowOps
Ressource aktiviert werden . Gnome-Terminal unter Ubuntu 10.04 implementiert standardmäßig sogar die Titelantworten. Ich habe keine anderen Terminals oder Versionen überprüft.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).
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
ioctl
Aufrufe 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 ,
less
ohne-r
oder-R
Option, oder sehen Sie es durchcat -v
.quelle
So einfach ist das nicht. Viele Leute haben Code, um den
xterm
Titel als Teil der Eingabeaufforderung oder aus sehr guten Gründen festzulegenshutdown
. 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.)
quelle