Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

HTTPoxy - Conflit de nom de variable « HTTP_PROXY » avec CGI

Public Date:
Updated -
Status
Ongoing
Impact
Important

On a détecté une vulnérabilité dans la façon dont les scripts CGI sont utilisés par les produits Red Hat qui s'appuient sur PHP, Go, Python, et autres langages informatiques.


Plusieurs serveurs web, frameworks web et langages de programmation (surtout dans un environnement CGI) définieront la valeur de la variable d’environnement « HTTP_PROXY » sur la base de données provenant des demandes entrantes (p. ex. des données fournies par un utilisateur avec un en-tête de requête « Proxy »). La variable environnementale « HTTP_PROXY » est utilisée par de nombreux paquets de logiciels web client pour spécifier un serveur proxy à utiliser pour des requêtes HTTP, et dans certains cas, HTTPS. En conséquence, lorsqu’une application web s’exécute, il est possible pour un attaquant de spécifier un serveur proxy que l’application utilise pour les demandes sortantes qui suivent, permettant une attaque « Man-in-the-Middle ». Cette faille a reçu le nom de HTTPoxy .

Informations générales

CGI et variables d'environnement

Le serveur HTTP utilise un ensemble de variables d’environnement pour transmettre des informations au script CGI. Certaines de ces variables d’environnement sont utilisées pour communiquer certains aspects de la requête HTTP, comme le type de contenu, le port TCP, le nom d’hôte ou la méthode de requête (par exemple, GET ou POST). Il y a un ensemble de variables d’environnement différent, que RFC appelle « Meta-Variables spécifiques au protocole », qui servent à transmettre les valeurs d’en-têtes HTTP au script CGI. La mise en correspondance des en-têtes HTTP avec les variables d’environnement suit une procédure standard : le nom d’en-tête HTTP est converti en majuscules, « - » est remplacé par « _ », et « HTTP_ » est le préfixe.

Par exemple, l’en-tête « Cookie » est traité avec la variable d’environnement « HTTP_COOKIE » et l’en-tête « Proxy » est traité avec variable d’environnement « HTTP_PROXY ». Veuillez noter que l’en-tête « Proxy » n’est pas un en-tête standard officiel, ni ne se trouve dans le registre provisoire d'en-têtes. L’en-tête « Proxy » ne doit pas être utilisé par des clients ou applications conformes aux standards.

La variable d'environnement système « HTTP_PROXY »

Il y a une variable d’environnement de système commune appelée « HTTP_PROXY », qui peut être utilisée pour communiquer les paramètres de proxy HTTP (et parfois HTTPS) de proxy HTTP sortant à une application. Cette variable a un tout autre but et contexte que ceux de la variable de script du serveur HTTP. Des applications, bibliothèques de langue ou modules de scripts utilisent cette variable d’environnement pour configurer leur serveur proxy pour le trafic HTTP sortant ultérieur.

Standard CGI

CGI (de l'anglais Common Gateway Interface) est un standard conçu pour permettre à des serveurs web HTTP, comme Apache ou nginx, d'entrer en interface avec les scripts exécutables ou des fichiers binaires en vue de générer des pages web dynamiques. Cette norme est documentée dans RFC 3875 . Les scripts CGI peuvent être écrits dans des langages de programmation variés comme PHP, Python, Perl, Ruby, ou golang, mais peuvent également être sous forme de fichiers biniares, compilés.

Le serveur HTTP et le script CGI communiquent ainsi :

1. le serveur HTTP reçoit et analyse une requête HTTP, puis configure les variables d’environnement nécessaires.
2. le serveur HTTP appelle le script CGI et passe les requêtes de données par l’entrée standard du script.
3. le script CGI traite les variables d’environnement et son entrée, et envoie une réponse au serveur HTTP en utilisant la sortie standard du script.
4. le serveur HTTP envoie la réponse générée par le script CGI au client.

Problème : Conflit de nom « HTTP_PROXY »

Un script CGI ne peut pas distinguer entre la « Meta-Variables spécifiques au protocole » de CGI, contenant la valeur de l’en-tête « Proxy » de la requête HTTP et la variable d’environnement HTTP_PROXY « système », contenant les paramètres de proxy HTTP. Un script CGI, module ou bibliothèque lit la variable d’environnement « HTTP_PROXY » et suppose qu'elle contient les paramètres de proxy HTTP « système ». La valeur mal interprétée change alors la façon dont les nouvelles requêtes HTTP sont traitées par le script CGI (et tout autre script ou programme pouvant être appelé) réalisé lors du traitement de la requête HTTP en cours.

Action

On conseille à tous les clients de Red Hat qui utilisent des scripts CGI avec PHP, Go, ou Python d’appliquer des mesures de prévention à leurs systèmes. Les détails à propos des paquets impactés et versions Image, ainsi que les mesures de mitigation recommandées se trouvent sous l’onglet Solution

Remerciements

Red Hat souhaite remercier Dominic Scheirlinck de VendHQ pour nous vous avoir fait part et aidé avec ce problème.

Red Hat Product Security a évalué l'impact de sécurité à un niveau Important .

Pour faire le diagnostique de cette vulnérabilité dans votre environnement, voir l'onglet Solution.

Produits concernés

  • 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

Description et impact de l'attaque

L'attaque

L’attaque est assez simple. Un attaquant envoie une requête HTTP spécialement conçue à destination d'un script CGI vulnérable. La requête contient un en-tête « Proxy » avec le nom d’hôte ou l’adresse IP, et le port d’un proxy sous contrôle de l'attaquant comme étant sa valeur. Le serveur HTTP reçoit la requête et, dans le cadre du traitement habituel, convertit l’en-tête « Proxy » et sa valeur en variable de métadonnées « HTTP_PROXY » avant de poursuivre en appelant le script CGI. Le script CGI lit ensuite la variable HTTP_PROXY, mais la confond avec la variable « système » utilisée pour communiquer les paramètres du proxy HTTP sortant et se configure automatiquement pour pouvoir utiliser le proxy spécifié. Si le script CGI effectue des requêtes HTTP, ces demandes sont ensuite envoyées par le proxy contrôlé par l'attaquant, permettant ainsi à l’attaquant d'ntercepter ou d'agir en tant que « Man-in-the-Middle » pour toutes les parties du trafic HTTP.

L'impact et sa sévérité

Les scripts CGI ne sont sensibles à cette vulnérabilité que s'ils ont mal interprété la variable HTTP_PROXY ET ont envoyé des requêtes HTTP (ou dans certains cas HTTPS). Le nombre de scripts faisant les deux représentera un sous-ensemble des scripts CGI généraux.

Il est difficile d'évaluer l’impact global et la sévérité, car cela dépend de la façon dont le script CGI se comporte. Un scénario particulièrement inquiétant est un script CGI qui effectue des tâches délicates (par exemple, l'authentification utilisant une API style REST). Dans ce cas, un attaquant pourrait réorienter toutes les parties du trafic HTTP allant du script CGI au serveur HTTP (style REST) via le proxy contrôlé par l’attaquant. Cela pourrait conduire à la divulgation d’informations confidentielles contenues à la fois dans la demande et la réponse envoyées entre le script CGI et le serveur HTTP.

De plus, l’attaquant pourrait manipuler le contenu de la demande et de la réponse. Si le script CGI envoie des requêtes à un serveur interne qui n’est pas joignable depuis l’internet extérieur, le proxy de l’attaquant ne pouvait pas communiquer avec le serveur interne et l’attaquant ne peut pas intercepter les réponses du serveur interne. Toutefois, l’attaquant peut toujours intercepter la requête du script CGI et renvoyer une fausse réponse.

Diagnostiquer

Pour diagnostiquer le problème, installez de façon temporaire ce qui suit comme script CGI dans votre serveur et rendez le exécutable :


test.cgi:

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

Vous pourrez alors appeler le script CGI avec un en-tête de requête « Proxy: » :

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

Si vous voyez la sortie suivante, votre serveur n'est pas affecté :

HTTP_PROXY="
													

Si vous voyez, à la place, la sortie suivante, ou toute autre sortie, votre serveur peut être affecté et vous devez appliquer une des solutions de contournement ci-dessous :

HTTP_PROXY='AFFECTED'
														

Prévention

Pour obtenir des informations sur la prévention, penchez-vous à nouveau sur l'article de Base de connaissances qui correspond à votre serveur concerné :

HTTPoxy - est-ce que mon JBoss/tomcat est affecté ?

HTTPoxy - est-ce que mon Apache mod_cgi est affecté ?

HTTPoxy - est-ce que mon nginx est affecté ?

HTTPoxy - est-ce que mon Apache mod_fcgid est affecté ?

HTTPoxy - est-ce que mon application PHP est affectée ?

HTTPoxy - est-ce que mon application Go est affectée ?

Mise à jour des produits concernés

Des correctifs sont sortis le 18 juillet 2016 pour tous les produits concernés.

Produit Paquet Alerte/Mise à jour
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 correctifs en attente
Red Hat Enterprise Web Server 2.x httpd correctifs en attente
Red Hat JBoss Web Server 3.x httpd correctifs en attente
Red Hat Software Collections httpd24 RHSA-2016:1420

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase of over 48,000 articles and solutions.

Current Customers and Partners

Log in for full access

Log In