Nachdem ich über die neueste bash
Sicherheitsanfälligkeit gelesen hatte , fragte ich mich, wie der Exploit von Tavis Ormandy funktioniert. Wie funktioniert das (a)=>\
?
Er hat gepostet:
Das Bash-Patch scheint mir unvollständig zu sein, die Funktionsanalyse ist immer noch spröde. z.B
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
bash
shellshock
Wondernewbie
quelle
quelle
Antworten:
GNU Bash exportiert Shell-Funktionen in Umgebungsvariablen, die die Funktionsdefinitionen enthalten:
Wenn eine neue Bash-Instanz erzeugt wird, sucht sie nach Umgebungsvariablen, die einem bestimmten Muster entsprechen. Der Inhalt dieser Variablen wird automatisch als Shell-Funktionen importiert. Wie Stéphane Chazelas erklärt , erfolgte der Import von Funktionen seit Einführung dieser Funktion in Bash 1.03 einfach durch Ersetzen
=
des entsprechenden Eintrags im Array der Umgebungsvariablen und Interpretieren des Ergebnisses als Funktionsdefinition. Vor dem Patch , mit dem CVE-2014-6271 behoben wurde , wurde die Umgebungsvariable vollständig interpretiert, einschließlich aller Befehle, die dem eigentlichen Funktionskörper folgen. Der Patch führt zwei spezielle Modi in dieparse_and_execute()
Funktion ein,SEVAL_FUNCDEF
undSEVAL_ONECMD
. Wenn die Funktion mit aufgerufenSEVAL_FUNCDEF
wird, soll sie die Interpretation anderer Befehle als Funktionsdefinitionen verhindern. DasSEVAL_ONECMD
Flag soll verhindern, dass die Funktion mehr als einen einzelnen Befehl auswertet.Die speziell gestaltete Umgebungsvariable von Tavis Ormandy macht etwas subtil anderes. Es soll den Parser verwirren und den Puffer beschädigen, der zum Speichern der auszuwertenden Befehle verwendet wird. Reste der Umgebungsvariablen im Puffer ändern die Interpretation des nachfolgenden Befehls . Dieses verwandte Problem hat die CVE-Kennung CVE-2014-7169 erhalten .
Die Bestandteile der Definition von Umgebungsvariablen
X='() { (a)=>\'
sind:() {
Dies wird vom Parser als Beginn einer Funktionsdefinition interpretiert(a)=
soll den Parser verwirren und dazu führen, dass Reste der Umgebungsvariablen im Puffer verbleiben>\
ist die tatsächliche Nutzlast, die im Puffer verbleibtDer Zweck der Nutzdaten besteht darin, die Interpretation des Befehls zu ändern, der in der von aufgerufenen Subshell ausgeführt wird
sh -c "echo date";
. Dies setzt natürlich voraus, dass dies/bin/sh
eine symbolische Verbindung zu istbash
. Wenn die als Operand für angegebene Befehlszeichenfolge-c
in den Puffer gestellt wird, lautet der Inhalt des Puffers:Das
[0xA]
ist ein ASCII-Zeilenumbruchzeichen, das normalerweise als Befehlstrennzeichen fungiert, jetzt jedoch\
von der Nutzlast entfernt wird. Infolgedessen wird der Inhalt des Puffers als interpretiertDa mit Bash Umleitungsoperatoren Befehle vorangestellt werden können , entspricht dies
Dies führt einfach dazu, dass der
date
Befehl ausgeführt wird und seine Standardausgabe in eine aufgerufene Datei umgeleitet wirdecho
. Der Restcat echo
ist nicht Teil des Exploits, sondern zeigt nur, dass jetzt eine Datei namensecho
mit der Ausgabe vondate
existiert.In
(a)=
Bezug auf den Grund, warum die Zeichenfolge den Parser in diesem Fall verwirrt, scheint es, dass die damit verbundene Zeichenfolge als (fehlerhafte) verschachtelte Funktionsdefinition angezeigt wird. Die vereinfachte Variante des Exploits zeigt dies deutlicher:quelle
echo
wird nur aufgrund seiner Position im Befehl (bash) als Datei "(Name) behandelt. Inecho date
date wird ebenfalls nicht als Befehl behandelt. In>echo date
Echo ist jedoch der Name der Datei angegeben, in die die Ausgabe desdate
Befehls umgeleitet wird.dir>echo
ist es in Windows vollkommen gültig. Der einzige Unterschied besteht darin, dass Bash Umleitungsoperatoren erlaubt, einem Befehl vorauszugehen .echo
es als Outfile endet, ziemlich dunkel ist (und die Verwendung hier macht es noch verwirrender, aber das war es, was die Frage spezifizierte). Ich versuche nur darauf hinzuweisen, dass ich nicht glaube, dass dies wirklich daran liegt, dass " die Art und Weise, wie Linux erstellt wurde" , sondern nur daran, wie Bash die Verwendung von Umleitungsoperatoren ermöglicht. Trotzdem danke für deine Verbesserungen. Sie haben darauf hingewiesen, wo ich nicht klar war, und ich habe versucht, die Antwort genauer zu bearbeiten.