Skip to main content

Injection CRLF détectée dans urllib3, une dépendance Python populaire

Écrit par
Headshot of Hayley Denbraver

Hayley Denbraver

15 mai 2019

0 minutes de lecture

Le 18 avril 2019, une vulnérabilité d’injection CRLF a été découverte dans la bibliothèque Python populaire urllib3. urllib3 est un client HTTP pour Python qui offre des fonctionnalités précieuses comme la sécurité des threads, le regroupement des connexions, la vérification SSL/TLS côté client, et bien plus. Cette bibliothèque est largement utilisée dans l’écosystème Python, notamment par requests, une autre bibliothèque populaire. En fait, urllib3 est utilisée par plus de 500 bibliothèques open source. Si vous avez un projet Python, il est très probable qu’urllib3 figure dans son arbre de dépendances.


Nous avons déjà ajouté cette vulnérabilité à notre base de données. Si votre projet est surveillé par Snyk et contient le package vulnérable, vous avez déjà reçu nos alertes habituelles. Sinon, vous pouvez tester gratuitement le dépôt de code de votre application pour vérifier s’il est affecté par la version vulnérable d’urllib3.

Si vous constatez que votre application Python utilise la bibliothèque vulnérable, agissez sans attendre et effectuez la mise à niveau vers la version corrigée la plus proche, comme indiqué par Snyk dans votre arbre de dépendances.


Vulnérabilité d’injection CRLF

CRLF signifie « Carriage Return, Line Feed » (retour chariot, saut de ligne) et désigne la fin d’une ligne. Une injection CRLF consiste à insérer une fin de ligne dans l’application. Dans le cas de la vulnérabilité d’urllib3, un attaquant qui contrôle le paramètre d’adresse de la requête peut manipuler un en-tête HTTP, puis attaquer un service interne.

La vulnérabilité a d’abord été évoquée dans un rapport du Python Bug Tracker portant sur un problème similaire dans urllib2/urllib (qui font respectivement partie des bibliothèques standard de Python 2 et Python 3). Le commentateur Alvin Chang (nom d’utilisateur alvinchang) a indiqué qu’il avait également réussi à reproduire l’exploit dans la bibliothèque urllib3.

Un problème a alors été signalé dans le dépôt GitHub d’urllib3, et un correctif a été publié pour les séries de versions 1.24.x et 1.25.x.

Voici la preuve de concept de la vulnérabilité, publiée dans le python bug tracker par l’utilisateur ragdoll, puis adaptée à la version d’urllib3 par alvinchang.

import urllib3

pool_manager = urllib3.PoolManager()

host = "localhost:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123"
url = "http://" + host + ":8080/test/?test=a"

try:
info = pool_manager.request('GET', url).info()
print(info)
except Exception:
pass

# nc -l localhost 7777
GET /?a=1 HTTP/1.1
X-injected: header
TEST: 123:8080/test/?test=a HTTP/1.1
Host: localhost:7777
Accept-Encoding: identity

Dans cet exemple, le serveur nc affiche la requête HTTP avec le contenu d’en-tête manipulé : X-injected:header, ce qui indique que l’injection de l’en-tête HTTP a réussi.

Mon projet est-il vulnérable ?

Vous souhaitez savoir si votre projet est vulnérable ? Créez un compte Snyk gratuit dès aujourd’hui et recherchez les vulnérabilités dans votre projet. Snyk vous fournira un rapport sur toutes les vulnérabilités connues de vos dépendances open source, y compris celle d’urllib3 si vous utilisez une version concernée.

Il est important de savoir que la bibliothèque urllib3 est souvent une dépendance indirecte et peut être installée dans votre projet sans que vous le sachiez. Certaines dépendances directes qui utilisent urllib3 ne font pas appel aux parties vulnérables de la bibliothèque. Par exemple, à l’heure actuelle, la bibliothèque requests (qui inclut urllib3 comme dépendance) ne semble pas vulnérable, mais ce n’est pas forcément le cas de tous les projets qui dépendent d’urllib3. Il est donc judicieux de vérifier si urllib3 figure dans votre arbre de dépendances.

Comment protéger mon projet ?

Si vous découvrez que votre projet utilise une version vulnérable d’urllib3, nous vous recommandons de passer à la version 1.24.3 ou ultérieure. Cette mise à niveau vous protégera également contre plusieurs autres vulnérabilités découvertes dans urllib3. Nous vous conseillons aussi de rechercher dans votre code les occurrences d’urllib2 ou d’urllib (pour les projets Python 2 et Python 3, respectivement). Les exploits visant ces vulnérabilités des bibliothèques standard n’ont pas encore été corrigés ; il est donc important d’évaluer votre niveau de risque en examinant votre code.

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis de capture du drapeau en regardant à la demande notre atelier virtuel d’initiation.