GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was bedeutet Env X=() { :;}; Command’ Bash Do und warum ist es unsicher?

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).

Verwandte:Dd:mehrere Eingabedateien?

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.


Linux
  1. Wann soll in Bash ein Alias, wann ein Skript und wann eine Funktion geschrieben werden?

  2. Was macht „exec {fd}/watchdog“ in Bash?

  3. Warum stimmt [a-z] mit Kleinbuchstaben in Bash überein?

  4. Warum Deis und was ist das?

  5. Was ist der Unterschied zwischen #!/usr/bin/env bash und #!/usr/bin/bash?

Was ist ein Linux-Server und warum benötigt Ihr Unternehmen einen?

Was ist ein Webserver und wie funktioniert ein Webserver?

Was ist eine virtuelle Maschine und warum sollte man sie verwenden?

Was ist der Grep-Befehl unter Linux? Warum wird es verwendet und wie funktioniert es?

Manipulation der Bash-Funktion erklärt

Was macht 'set -e' und warum könnte es als gefährlich angesehen werden?