Translated message

A translation of this page exists in English.

HTTPoxy - CGI "HTTP_PROXY" Variablenname kollidiert

Public Date: July 18, 2016, 12:00 am
Updated -
Ongoing Status
Important Impact

Eine Schwachstelle wurde festgestellt hinsichtlich der Verwendung von CGI-Skripten durch Red Hat Produkte, die PHP, Go, Python und andere Skriptsprachen verwenden.


Mehrere Web-Server, Web-Frameworks und Programmiersprachen (gewöhnlich in einer CGI-Umgebung) bestimmen die Umgebungsvariable “HTTP_PROXY”, basierend auf den Daten eingehender Anfragen (z.B ein Anfrage-Header namens “Proxy” mit Daten, die vom Benutzer angegeben wurden). Die Umgebungsvariable “HTTP_PROXY” wird von zahlreichen Web-Client Software-Paketen für die Bestimmung eines entfernten Proxy-Servers verwendet, der für HTTP und in manchen Fällen auch HTTPS-Anfragen verwendet wird. Als Folge kann ein Angreifer, wenn eine Web-Anwendung läuft, möglicherweise einen Proxy-Server festlegen, den die Anwendung für anschließende ausgehende Anfragen verwendet. Dies ermöglicht einen "Man-in-the-Middle" Angriff. Dieser Fehler wird bezeichnet als HTTPoxy .

Hintergrundinformationen

CGI und Umgebungsvariablen

Für die Übergabe von Informationen an das CGI-Skript verwendet der HTTP-Server ein Set von Umgebungsvariablen. Einige dieser Umgebungsvariablen werden für die Kommunikation bestimmte Aspekt der HTTP-Anfrage verwendet, wie Inhaltstyp, TCP-Port, Hostname, oder Anforderungsmethode (zum Beispiel GET oder POST). Es gibt ein anderes Set von Umgebungsvariablen, das der RFC als "Protocol-Specific Meta-Variables" bezeichnet. Diese werden für die Übergabe von Werten der HTTP-Header an das CGI-Skript verwendet. Die Zuweisung von HTTP-Headern zu Umgebungsvariablen folgt einem Standard-Verfahren: Der Name des HTTP-Headers wird auf Großbuchstaben geändert, "-" wird ersetzt durch "_" und "HTTP_" wird als Präfix angehängt.

Der Header "Cookie" wird beispielsweise als Umgebungsvariable "HTTP_COOKIE" übergeben und der Header "Proxy" als Umgebungsvariable "HTTP_PROXY". Bitte beachten Sie, dass der Header "Proxy" weder ein offizieller Standard-Header ist, noch im Registry für vorläufige Header eingetragen ist. Der Header "Proxy" sollte von standardkonformen Anwendungen oder Clients nicht verwendet werden.

Die HTTP_PROXY "system" Umgebungsvariable

Es gibt eine allgemeine System-Umgebungsvariable namens "HTTP_PROXY", die verwendet werden kann, um die Proxy-Einstellungen von HTTP (und manchmal HTTPS) für einen ausgehenden HTTP-Proxy an eine Anwendung zu übermitteln. Diese Variable hat einen völlig anderen Zweck und Kontext als die HTTP Server-Skript Variable. Anwendungen, Sprachbibliotheken oder Skripting-Module verwenden diese Umgebungsvariable zur Konfiguration Ihres Proxys für nachfolgenden, ausgehenden HTTP-Datenverkehr.

CGI-Standard

Das Common Gateway Interface ist ein Standard, der entworfen wurde, um HTTP Web-Servern wie Apache oder nginx eine Verknüpfung mit ausführbaren Skripten oder Binärdateien für die Erzeugung dynamischer Webseiten zu erlauben. Dieser Standard ist dokumentiert in RFC 3875 . CGI-Skripte können in verschiedenen Skripting-Sprachen geschrieben sein, wie PHP, Python, Perl, Ruby oder golang, es können aber ebenso kompilierte Binärdateien sein.

Der HTTP-Server und CGI-Skript interagieren folgendermaßen:

1. Der HTTP-Server empfängt und analysiert eine HTTP-Anfrage und konfiguriert die nötigen Umgebungsvariablen.
2. Der HTTP-Server ruft das CGI-Skript auf und übergibt die Anfragedaten über die Standardeingabe des Skripts.
3.Das CGI-Skript verarbeitet die Umgebungsvariablen und die Eingabe, und sendet mittels Standardausgabe des Skripts eine Antwort an den HTTP-Server zurück.
4. Der HTTP-Server sendet die vom CGI-Skript erstellte Antwort zurück an den Client.

Das Problem: HTTP_PROXY Variablenname kollidiert

Ein CGI-Skript kann nicht zwischen der "Protocol-Specific Meta-Variable" des CGI, die den Wert des "Proxy" Headers des HTTP-Requests enthält, und der "system" Umgebungsvariable HTTP_PROXY, die die Einstellungen des HTTP-Proxys enthält, unterscheiden. Ein CGI-Skript, ein Modul oder eine Bibliothek liest die Umgebungsvariable "HTTP_PROXY" und setzt voraus, dass diese die "system" Einstellungen des HTTP-Proxys enthält. Der fehlinterpretierte Wert verändert dann, wie neue HTTP-Anfragen vom CGI-Skript (und anderen aufgerufenen Skripten und Programmen) behandelt werden, die während der Verarbeitung der aktuellen HTTP-Anfrage eingehen.

Maßnahmen

Allen Red Hat Kunden, die CGI-Skripte mit PHP, Go oder Python verwenden, wird nachdrücklich empfohlen, entsprechende Vorbeugungen auf ihren Systemen anzuwenden. Informationen zu betroffenen Paketen und Image-Versionen sowie empfohlene Vorbeugungsmaßnahmen finden Sie auf dem Tab Lösungen.

Danksagung

Red Hat bedankt sich bei Dominic Scheirlinck von VendHQ für seine Meldung und Mitwirkung hinsichtlich dieses Problems.

Die Red Hat Product Security bewertet dieses Update als Sicherheitsauswirkung Wichtig .

Methoden zur Diagnose dieser Schwachstelle in Ihrer Umgebung finden Sie auf dem Tab Lösungen .

Betroffene Produkte

  • Red Hat Enterprise Linux 7.x
  • Red Hat Enterprise Application Platform 6.x

  • Red Hat Enterprise Web Server 2.x

  • Red Hat JBoss Web Server 3.x

  • Red Hat Satellite

Beschreibung und Auswirkung des Angriffs

Der Angriff

Der Angriff ist ziemlich geradlinig. Ein Angreifer sendet eine speziell entwickelte HTTP-Anfrage an ein anfälliges CGI-Skript. Die Anfrage enthält einen "Proxy"-Header mit Hostname oder IP-Adresse und Port eines vom Angreifer kontrollierten Proxys als ihren Wert. Der HTTP-Server empfängt die Anfrage und wandelt den "Proxy"-Header und seinen Wert als Teil der gewöhnlichen Verarbeitung zur "HTTP_PROXY" Metadaten-Variable um, bevor er das CGI-Skript aufruft. Das CGI-Skript liest dann die Variable HTTP_PROXY, verwechselt diese aber mit der "system"-Variable, die zur Übermittlung der Einstellungen für den ausgehenden HTTP-Proxy verwendet wird, und konfiguriert sich auf die Verwendung des angegebenen Proxys. Wenn das CGI-Skript eine HTTP-Anfrage ausführt, werden diese Anfragen über den vom Angreifer kontrollierten Proxy gesendet, und der Angreifer kann einen "Man-in-the-Middle"-Angriff auf alle Teile des HTTP-Datenverkehrs ausführen.

Auswirkung und Kritikalität der Bedrohung

CGI-Skripte sind für diese Schwachstelle nur empfänglich, wenn sie die Variable HTTP_PROXY fehlinterpretieren UND HTTP-Anfragen (oder in manchen Fällen HTTPS-Anfragen) senden. Die Anzahl von Skripts, auf die beides zutrifft, wird eine kleine Teilmenge der allgemeinen CGI-Skripte sein.

Eine Angabe von globaler Auswirkung und Kritikalität ist schwierig, da diese vom Verhalten des CGI-Skipts abhängen. Ein besonders schlechtes Szenario ist ein CGI-Skript, das vertrauliche Aufgaben ausführt (beispielsweise Authentifizierung über ein REST-style API). In diesem Fall könnte ein Angreifer alle Teile des HTTP-Datenverkehrs zwischen dem CGI-Skript und dem (REST-style) HTTP-Server über den vom Angreifer kontrollierten Proxy umleiten. Dies könnte zur Offenlegung von vertraulichen Informationen führen, die in Anfrage und Antwort zwischen dem CGI-Skript und dem HTTP-Server enthalten sind.

Zudem könnte der Angreifer den Inhalt von Anfrage und Antwort manipulieren. Wenn das CGI-Skript Anfragen an einen internen Server sendet, der vom Internet (außerhalb des internen Servers) nicht erreicht werden kann, dann könnte der Proxy des Angreifers nicht mit dem internen Server kommunizieren und der Angreifer könnte nicht die Antworten des internen Servers abhören. Der Angreifer könnt jedoch noch immer die Anfrage des CGI-Skripts abhören und eine falsche Antwort senden.

Diagnose

Um diesen Fehler zu diagnostizieren, können Sie vorübergehend Folgendes als CGI-Skript auf Ihrem Server installieren und ausführbar machen:


test.cgi:

#!/bin/sh
echo "Content-Type:text/plain"
​echo ""
echo "HTTP_PROXY='$HTTP_PROXY'"
											

Rufen Sie dann das CGI-Skript mit einem Header für “Proxy:”-Anfragen auf:

curl -H ‘Proxy: AFFECTED’ http://my-server-name/cgi-bin/test.cgi
												

Ihr System ist nicht betroffen, wenn Folgendes angezeigt wird:

HTTP_PROXY="
													

Sehen Sie allerdings folgende oder generell eine andere Ausgabe, dann kann Ihr Server betroffen sein, und Sie sollten eine der unten angeführten Maßnahmen zur Vorbeugung anwenden:

HTTP_PROXY='AFFECTED'
														

Vorbeugung

Details zur Vorbeugung finden Sie im entsprechenden Knowledgebase-Artikel zu Ihrem betroffenen Server:

HTTPoxy - Ist mein JBoss/tomcat betroffen?

HTTPoxy - Ist mein Apache mod_cgi betroffen?

HTTPoxy - Ist meine nginx betroffen?

HTTPoxy - Ist mein Apache mod_fcgid betroffen?

HTTPoxy - Ist meine PHP-Anwendung betroffen?

HTTPoxy - Ist meine Go-Anwendung betroffen?

Updates für betroffene Produkte

Fehlerbehebungen für alle betroffenen Produkte wurden am 18. Juli 2016 veröffentlicht.

Produkt Paket Advisory/Update
Red Hat Enterprise Linux 5.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 6.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 7.x httpd RHSA-2016:1422
Red Hat Enterprise Application Platform 6.x httpd ausstehende Patches
Red Hat Enterprise Web Server 2.x httpd ausstehende Patches
Red Hat JBoss Web Server 3.x httpd ausstehende Patches
Red Hat Software Collections httpd24 RHSA-2016:1420

Comments