Ist das Verhalten hinter der Shellshock-Schwachstelle in Bash dokumentiert oder überhaupt gewollt?

Eine aktuelle Sicherheitslücke, CVE-2014-6271, wie Bash interpretiert Umgebungsvariablen bekannt war. Der exploit beruht auf der Bash Parsen einige environment-Variablen-Deklarationen, wie Funktionsdefinitionen, aber dann weiterhin das ausführen von code nach der definition:

$ x='() { echo i do nothing; }; echo vulnerable' bash -c ':'
vulnerable

Aber ich verstehe es nicht. Es gibt nichts, was ich in der Lage gewesen, zu finden in der Bash-Dokumentation über die Interpretation von environment-Variablen als Funktionen überhaupt (außer für Erben-Funktionen, das ist unterschiedlich). In der Tat, eine ordnungsgemäße benannte definition einer Funktion wird nur behandelt wie ein Wert:

$ x='y() { :; }' bash -c 'echo $x'
y() { :; }

Aber eine korrupte man druckt nichts:

$ x='() { :; }' bash -c 'echo $x'

$ # Nothing but newline

Den korrupten Funktion ist Unbenannt, und so kann ich nicht nur es nennen. Steht diese Sicherheitsanfälligkeit in einem reinen Umsetzung bug, oder ist es eine beabsichtigte Funktion hier, dass ich einfach nicht sehen kann?

Update

Pro Barmar Kommentar, habe ich die Hypothese aufgestellt der name der Funktion wurde der parameter name:

$ n='() { echo wat; }' bash -c 'n'
wat

Konnte ich schwöre, ich versuchte vor, aber ich denke, dass ich nicht hart genug versuchen. Es ist wiederholbar jetzt. Hier ist ein wenig mehr testen:

$ env n='() { echo wat; }; echo vuln' bash -c 'n'
vuln
wat
$ env n='() { echo wat; }; echo $1' bash -c 'n 2' 3 -- 4

wat

...also scheinbar die Argumente sind nicht festgelegt auf die Zeit der exploit ausgeführt wird.

Trotzdem, die grundsätzliche Antwort auf meine Frage ist, ja, das ist wie Bash implementiert geerbt Funktionen.

  • Wie denken Sie Erben funktioniert in den ersten Platz? Die einzige Art der Vererbung zwischen Prozessen ist die Umwelt. So exportierten Funktionen müssen codiert sein, die in der Umgebung irgendwie.
  • der Beispiel-code in den link, den Sie enthalten, beginnt mit env wie in env x='.... Nicht sicher, wie das einen Unterschied macht, entweder. FYI ksh emittiert keine Ergebnisse dieser tests nach dem ändern von Referenzen aus bash -c zu ksh -c.
  • Das dauerte bash 4.3.25-1 geschlossen wird die Ausführung des Befehls nach der seltsamen definition einer Funktion, aber die Funktion ist noch erhalten, definiert...
  • Es gibt eine neue Sicherheitslücke kommen unten das Rohr als auch access.redhat.com/security/cve/CVE-2014-7169
  • Definition einer Funktion auf diese Weise ist eine beabsichtigte Funktion; der bug ist mit dem extra-code nach der definition einer Funktion wird ausgeführt.
  • Zu get this straight, können wir immer noch dieses: export ls='(){ /bin/ls $@; echo "Caught you";}'?
  • Fast. Die Zeichenfolge beginnen muss explizit mit () { (beachten Sie das Leerzeichen). Ansonsten, ja, bash drehen, die in eine Funktion namens ls wenn er sieht, dass Strings in seiner Umgebung auf Start. Die schließende geschweifte Klammer, es stellt sich heraus, ist etwas optional.
  • in meiner Verteidigung, ich konnte ja nicht wissen, was Erben bedeutet. Bedenken Sie, dass Sie setzen x=3 und es in einer subshell: $(echo $x), aber das ist etwas anders vom Export x. Bis dieser bug zum Vorschein kam, wusste ich nicht einmal, Sie könnten export-Funktionen.
  • Siehe Was bedeutet env x='() { :;}; Befehl' bash zu tun und warum ist es unsicher?

InformationsquelleAutor kojiro | 2014-09-24
Schreibe einen Kommentar