Offenbar gibt es eine Schwachstelle (CVE-2014-6271) in Bash:Bash-Attacke mit Code-Einschleusung von speziell gestalteten Umgebungsvariablen
Ich versuche herauszufinden, was passiert, aber ich bin mir nicht ganz sicher, ob ich es verstehe. Wie kann das echo
unverändert in einfachen Anführungszeichen ausgeführt werden?
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test
BEARBEITEN 1 :Ein gepatchtes System sieht so aus:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
BEARBEITEN 2 :Es gibt eine verwandte Schwachstelle / einen Patch:CVE-2014-7169, der einen etwas anderen Test verwendet:
$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
ungepatchte Ausgabe :
vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test
teilweise (frühe Version) gepatchte Ausgabe :
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
bash: error importing function definition for `BASH_FUNC_x()'
test
gepatchte Ausgabe bis einschließlich CVE-2014-7169:
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test
BEARBEITEN 3 :Die Geschichte geht weiter mit:
- CVE-2014-7186
- CVE-2014-7187
- CVE-2014-6277
Akzeptierte Antwort:
bash speichert exportierte Funktionsdefinitionen als Umgebungsvariablen. Exportierte Funktionen sehen so aus:
$ foo() { bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() { bar
}
Das heißt, die Umgebungsvariable foo
hat den wörtlichen Inhalt:
() { bar
}
Wenn eine neue Bash-Instanz gestartet wird, sucht sie nach diesen speziell gestalteten Umgebungsvariablen und interpretiert sie als Funktionsdefinitionen. Sie können sogar selbst eine schreiben und sehen, dass sie immer noch funktioniert:
$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function
Leider kann das Parsen von Funktionsdefinitionen aus Strings (den Umgebungsvariablen) weitreichendere Auswirkungen haben als beabsichtigt. In ungepatchten Versionen interpretiert es auch beliebige Befehle, die nach Beendigung der Funktionsdefinition auftreten. Dies liegt an unzureichenden Einschränkungen bei der Bestimmung akzeptabler funktionsähnlicher Zeichenfolgen in der Umgebung. Zum Beispiel:
$ export foo='() { echo "Inside function" ; }; echo "Executed echo"'
$ bash -c 'foo'
Executed echo
Inside function
Beachten Sie, dass das Echo außerhalb der Funktionsdefinition während des Bash-Starts unerwartet ausgeführt wurde. Die Funktionsdefinition ist nur ein Schritt, um die Auswertung und den Exploit durchzuführen, die Funktionsdefinition selbst und die verwendete Umgebungsvariable sind willkürlich. Die Shell sieht sich die Umgebungsvariablen an, siehe foo
, was so aussieht, als ob es die Einschränkungen erfüllt, die ihm bekannt sind, wie eine Funktionsdefinition aussieht, und es wertet die Zeile aus und führt unbeabsichtigt auch das Echo aus (das ein beliebiger Befehl sein kann, bösartig oder nicht).
Dies wird als unsicher angesehen, da es Variablen normalerweise nicht erlaubt oder erwartet wird, dass sie von sich aus den Aufruf von beliebigem Code, der in ihnen enthalten ist, direkt verursachen. Möglicherweise setzt Ihr Programm Umgebungsvariablen aus nicht vertrauenswürdigen Benutzereingaben. Es wäre höchst unerwartet, dass diese Umgebungsvariablen so manipuliert werden könnten, dass der Benutzer willkürliche Befehle ohne Ihre ausdrückliche Absicht ausführen könnte, indem er diese Umgebungsvariable aus einem solchen im Code deklarierten Grund verwendet.
Hier ist ein Beispiel für einen praktikablen Angriff. Sie betreiben einen Webserver, der im Laufe seiner Lebensdauer irgendwo eine verwundbare Shell ausführt. Dieser Webserver übergibt Umgebungsvariablen an ein Bash-Skript. Wenn Sie beispielsweise CGI verwenden, werden Informationen über die HTTP-Anforderung häufig als Umgebungsvariablen vom Webserver eingefügt. Beispiel:HTTP_USER_AGENT
möglicherweise auf den Inhalt Ihres Benutzeragenten eingestellt. Das bedeutet, wenn Sie Ihren Benutzeragenten so fälschen, dass er so etwas wie ‘() { :; }; echo foo’, wenn dieses Shell-Skript ausgeführt wird, echo foo
wird durchgeführt. Nochmals, echo foo
kann alles sein, bösartig oder nicht.