Zusammenfassung
- CGI konnte einen entfernten HTTP-Header in eine Unix-Umgebungsvariable überführen; verwundbares Bash erkannte darin eine Funktion und verarbeitete Text hinter ihrem Ende als Befehl.
- Eine Fernangriffsfläche setzte den vollständigen Aufrufpfad voraus: fremdsteuerbare Daten mussten die Umgebung erreichen, bevor Bash direkt oder indirekt startete.
- Der erste Fix war unvollständig. Dauerhafte Schließung verlangte spätere Pakete, weniger Umgebungsvererbung, weniger unnötige Shell-Übergänge und den Nachweis erneuerter Laufzeitprozesse.
Ein HTTP-Header beschreibt eine Anfrage. Eine Umgebungsvariable beschreibt den Kontext eines Prozesses. Eine Funktionsdefinition ist Code. Shellshock legte diese drei Bedeutungen so übereinander, dass Beschreibung unbemerkt zur Erlaubnis wurde.
Der erste Übergang war in RFC 3875 vorgesehen. CGI kann HTTP-Header als Metavariablen mit dem Präfix HTTP_ bereitstellen. Unter Unix gelangen diese Metavariablen als gleichnamige Umgebungsvariablen zum Skript. Diese Schnittstelle transportierte Daten; allein führte sie nichts aus.
Bash ergänzte den gefährlichen Übergang. Um Funktionen an eine neue Bash-Instanz zu exportieren, legte der alte Mechanismus ihre Definition in der Umgebung ab. Verwundbare Versionen erkannten beim Start die Funktionsform, beendeten die Auswertung aber nicht zuverlässig am Ende der Definition. Nachfolgender Text konnte zum Kommando werden.
Die Kette lautete: entfernter Header, CGI-Metavariable, geerbte Umgebung, Bash-Start, Funktionsimport, Ausführung. Fehlt ein Glied, besteht dieser Fernpfad nicht. Deshalb war „Bash installiert“ keine ausreichende Risikoklasse. CERT/CC und Red Hat nannten CGI, bestimmte SSH-Konfigurationen mit beschränkten Kommandos und einige DHCP-Client-Abläufe als Beispiele.
CVE-2014-6271 wurde am 24. September 2014 öffentlich. CERT/CC veröffentlichte am folgenden Tag seine Schwachstellennotiz und vermerkte aktive Ausnutzung. Am 26. September erklärte Red Hat den ersten Fix für unvollständig; CVE-2014-7169 erfasste verbleibendes Verhalten, weitere verwandte Parserprobleme erhielten eigene Kennungen. „Gepatcht“ war ohne genaue Paketversion und Pfadtest keine belastbare Aussage.
Die stärkere Reparatur verengte den Importvertrag. Korrigierte Pakete verschoben exportierte Funktionen in einen erkennbaren Namensraum wie BASH_FUNC_name(). Das brachte Kompatibilitätskosten, trennte aber gewöhnliche Umgebungsdaten deutlicher von ausführbaren Definitionen. Es war eine Verringerung impliziter Autorität, nicht nur eine Signatur gegen eine bekannte Zeichenfolge.
Eine aktualisierte Datei auf der Platte erneuerte nicht automatisch den lebenden Zustand. Red Hat empfahl Neustarts betroffener Dienste; Benutzer konnten sich neu anmelden müssen, und screen- oder tmux-Sitzungen konnten alte Definitionen bewahren. Das Paketverzeichnis beantwortete nicht, welches Programm ein langlebiger Prozess tatsächlich aufrief.
Eine belastbare Reaktion begann daher mit dem Aufrufgraphen. Welcher öffentliche Dienst baut die Umgebung? Welcher Helfer startet Bash? Mit welchem Konto? Welcher Elternprozess lebt seit vor dem Update? Bis zur Paketverteilung musste ein lokaler Verantwortlicher den CGI-Handler abschalten, die Umgebung an der Vertrauensgrenze bereinigen oder einen Shell-Wrapper durch direkten Aufruf ersetzen können.
Shellshock beweist nicht, dass Umgebungsvariablen grundsätzlich falsch sind. Es beweist, dass die Herkunft eines Feldes seine Befugnis beim Empfänger nicht begrenzt. Der Augenblick, in dem Daten neue Verben erhalten, muss ausdrücklich sichtbar sein.
Quellen
Mitgliederbriefing
Detaillierter Profilkontext
Melden Sie sich mit der richtigen Mitgliedschaftsstufe an, um das vollständige Briefing und die Quellennotizen freizuschalten.
Nur für Strategic Circle
Strategic Circle
Offen für alle Leser. Schalten Sie Profil-Briefings nach Beitritt und Anmeldung frei.
Strategic Circle beitretenNur für Leadership Alliance
Leadership Alliance
Für qualifizierte Inhaber von IP-Assets und Management; melden Sie sich an, um Leadership-Alliance-Briefings freizuschalten.
Leadership Alliance beitreten