Curl und die Bibliothek Libcurl dienen zum Übertragen von Netzwerkdaten mit URL-Syntax, wobei eine große Zahl verschiedener Protokolle unterstützt wird – unter anderem auch das HTTP-Protokoll, in dessen GSS-Authentifikationscode eine Sicherheitslücke entdeckt worden ist.
Das HTTP-Protokoll bietet verschiedene Möglichkeiten zur Authentifizierung, wobei die einfachsten die in RFC 2617 spezifizierten Methoden “HTTP Basic” und “Digest Access Authentication” sind. Daneben existieren noch andere Verfahren wie beispielsweise die GSS-Authentifikation, welche das “Generic Security Service Application”-API verwendet. Dieses API bietet ein generisches Framework zur Implementierung von sicheren Netzwerkverbindungen, wobei das Framework selbst lediglich Schnittstellen-Funktionen anbietet, die der jeweilige Hersteller mit Funktionen füllt. Kerberos ist beispielsweise auf diese Weise implementiert. Zentrale Konzepte des GSS-API sind die Credentials, die die Identität von Client oder Server repräsentieren sowie die Tokens, die den eigentlichen Datenverkehr absichern.
Der Aufbau einer GSS-Verbindung sieht zunächst vor, dass der Client einen entsprechenden Sicherheitskontext mit “gss_init_sec_context()” initialisiert. An dieser Stelle kann der Client entscheiden, ob er Delegation seiner Credentials zulässt oder nicht. Entscheidet er sich für Delegation, so kann der andere Kommunikationspartner die Credentials des Clients weiterverwenden. Delegation ist in vielen Situationen sinnvoll, um Overhead bei der Authentifizierung zu vermeiden. Selbstverständlich muss Delegation aber mit Bedacht eingesetzt werden, weil der Kommunikationspartner mit den Credentials im Prinzip auch Unfug anstellen kann. Delegation wird mit dem Flag “GSS_C_DELEG_FLAG” als Parameter für “gss_init_sec_context()” aktiviert.
Auch das Programm Curl ruft “gss_init_sec_context()” auf, falls der Anwender HTTP-GSS-Authentifizierung verwenden möchte. Die entsprechende Implementierung ist in der Datei “lib/http_negotiate.c” untergebracht, wo sich auch der Aufruf der Funktion “gss_init_sec_context()” in “Curl_input_negotiate()” findet:
major_status = gss_init_sec_context(&minor_status, GSS_C_NO_CREDENTIAL, &neg_ctx->context, neg_ctx->server_name, GSS_C_NO_OID, GSS_C_DELEG_FLAG, 0, GSS_C_NO_CHANNEL_BINDINGS, &input_token, NULL, &output_token, NULL, NULL);
Allerdings initialisiert dieser Code den Kontext immer mit Delegation, das heißt, der Client sendet seine Credentials in jedem Fall an den Server. Befindet sich nun auf der anderen Seite ein Angreifer, so kann dieser die gesendeten Credentials missbrauchen, um sich als Client auszugeben.
Die Sicherheitslücke wurde einfach durch Entfernen des Delegationsflags aus dem Aufruf von “gss_init_sec_context()” gelöst. Der Fehler wurde erstmals am 6. Juni gemeldet, am 8. Juni gefixt, und die am 23. Juni erschienene Libcurl-Version 7.21.7 ist bereits korrigiert.

