Kritische Sicherheitslücke in CGI-Umgebungen (Apache, IIS, ...)

18. Juli 2016

Es wurde ein Designfehler in diversen Implementationen des CGI Standards gefunden, der schwerwiegende Folgen für die Sicherheit der Webserver haben kann. CERT.at bittet daher um Beachtung der folgenden Hinweise.

Beschreibung

CGI ist ein Standard, mit dem Webseiten dynamisch mit Hilfe von Scripten serverseitig erstellt werden können. Dazu werden die Informationen über den Client und zur Anfrage in Umgebungsvariablen an das Script übergeben.

Enthält der HTTP-Request einen Header "Proxy:", dann wird der Inhalt dieses Headers in die Umgebungsvariable HTTP_PROXY geschrieben. Setzt nun seinerseits das Script einen Webrequest (etwa an ein Backend-System) ab, dann kann ein gesetztes HTTP_PROXY dazu führen, dass dieser Proxy benutzt wird.

Auswirkungen

Ein Angreifer kann einem Webserver eine Proxy-Konfiguration vorgeben und so einen Man-in-the-Middle Angriff durchführen. Mögliche Szenarien sind etwa:
  • Information Disclosure der Daten, die von Frontend-Webservern an das Backend übermittelt werden
  • Information Injection: der angegebene Proxy kann Daten liefern, die Fehlverhalten im Webserver auslöst

Betroffene Systeme

Eine vollständige Liste aller betroffenen Systeme liegt noch nicht vor. Es ist daher bis zum Beweis des Gegenteils davon auszugehen, dass jede CGI Umgebung betroffen ist.

Details werden auf der eigens dafür angelegten Webseite zu httpoxy angegeben.

Ob ein gesetztes HTTP_PROXY eine Wirkung auf das ausgeführte Script hat, variiert je nach Programmiersprache (PHP, Python, Perl, Go, ...) und hängt auch davon ab welche weiteren Programme (etwa "wget") aufgerufen werden.

Abhilfe

Als erste Notmaßnahme sollten folgende HTTP Header nicht mehr an Scripte weitergegeben werden:
  • Proxy
  • Proxy_Host
  • Proxy_Port
  • Proxy_User
  • Proxy_Pass
  • Proxy_Password

Apache

Mittels des Moduls mod_headers können die kritischen Header leicht ausgefiltert werden:
RequestHeader unset Proxy
RequestHeader unset Proxy_Host
RequestHeader unset Proxy_Port
RequestHeader unset Proxy_User
RequestHeader unset Proxy_Pass
RequestHeader unset Proxy_Password

Nginx/FastCGI

fastcgi_param HTTP_PROXY "";

HAProxy

http-request del-header Proxy
http-request del-header Proxy_Host
http-request del-header Proxy_Port
http-request del-header Proxy_User
http-request del-header Proxy_Pass
http-request del-header Proxy_Password

IS/FastCGI component for IIS 6.0 and IIS 7.0

Folgende Regeln in apphost.config sollte die Umgebungsvariable ausfiltern:
<system.webServer>
    <rewrite>
        <rules>
            <rule name="Erase HTTP_PROXY" patternSyntax="Wildcard">
                <match url="*.*" />
                <serverVariables>
                    <set name="HTTP_PROXY" value="" />
                </serverVariables>
                <action type="None" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Hinweis

Generell empfiehlt CERT.at, wo möglich die "automatisches Update"-Features von Software zu nutzen, für alle Arten von Browser-Plugins (Flash, Java, ...) auf die "Click-to-play"-Funktionalitäten von Internet-Browsern zurückzugreifen, sowie parallel Firewall-Software aktiv und den Virenschutz aktuell zu halten.
Informationsquelle(n):

httpoxy Webseite
https://httpoxy.org/
Apache-Dev Archiv von 2015
http://www.gossamer-threads.com/lists/apache/dev/443863
Apache Advisory
https://www.apache.org/security/asf-httpoxy-response.txt