Ich verstehe den ursprünglichen Test für CVE-2014-6271, der war:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Der aktualisierte Test und die entsprechende Ausgabe für CVE-2014-7169 verwirren mich jedoch:
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST
Könnte jemand kurz erklären, was hier passiert und wie der Patch für CVE-2014-6271 umgangen wird?
Antworten:
Ich habe ein bisschen in den Webseiten gebuddelt, seit ich diese Frage zum ersten Mal gestellt habe.
Laut dem ursprünglichen Entdecker des Fehlers hat bash vor dem Patch CVE-2014-6271 eine Funktion wie die folgende importiert:
durch Ersetzen des Gleichheitszeichens durch ein Leerzeichen und Interpretieren ... was bedeutete, dass eine Interpretation über die Funktionsdefinition hinaus möglich war.
Mit dem Patch für CVE-2014-6271 wurde ein spezieller Modus der Funktion parse_and_execute () eingeführt , um die Auswertung auf die Funktionsdefinition und nicht darüber hinaus zu beschränken.
Wie in diesem Thread erläutert , wurde die speziell gestaltete Umgebungsvariable des CVE-2014-7169-Schwachstellentests entwickelt, um 1) den Parser zu Tode zu verwirren 2) Reste im Puffer zu belassen 3) vollständig zu ändern, was der ursprüngliche Befehl bash wann tut es verbindet sich mit den bereits im Puffer befindlichen Abfällen.
So zerlegen Sie die Umgebungsvariable:
X='() { (a)=>\'
() { (a)=>\
. Beachten Sie, dass dies\
Teil der Zeichenfolge ist. es entgeht nicht dem nachfolgenden einfachen Anführungszeichen.() {
(a)=
>\
>\[NEWLINE]
sh
Ausführung des Befehls wird eine neue Zeile in den Puffer eingefügt.>\[NEWLINE]echo date
sh
es aufgerufen wird (was in diesem Fall wahrscheinlich ein Symlink zu bash ist), fügt es seine Befehlsargumenteecho date
zu den bereits im Puffer vorhandenen Zeichen hinzu.>echo date
>echo date
, was den gleichen Effekt hat wiedate > echo
. Eine Datei mit dem Namenecho
wird erstellt und die Standardausgabe desdate
Befehls wird in diese umgeleitet.; cat echo
quelle
Es gibt Ihnen keine schöne saubere Ausgabe, aber es zeigt den Fehler.
Ohne Fehler sollte die Umgebungsvariable
X
ignoriert werden, bash sollte ausgeführtecho date
werden und cat sollte sich beschweren, dass es keine Datei namens echo gibt. Überlegen Sie beispielsweise, wie sich der Strich verhält:Ich werde die Ausgabe, die Sie in Ihrer Frage zeigen, nicht wiederholen und ich werde nicht so tun, als würde ich verstehen, wie es funktioniert, aber bash wird ausgeführt
date
und die Ausgabe in eine Datei namens "echo" gestellt. Sie können mit Alternativen spielen,date
um sich davon zu überzeugen, dass dies brauchbar und gefährlich ist.quelle