Dem besonders in großen Netzen oft verwendeten MIT Kerberos drohen zwei Denial-of-Service-Attacken, die beide auf Fehlern beim Dereferenzieren beruhen.
Kerberos ist ein verteilter Authentifizierungsdienst, an dem immer drei Parteien beteiligt sind: der Client, der Server und ein Kerberos-Server. Eine große Stärke von Kerberos ist es, Angriffe besonders zu erschweren, die auf passivem Sniffing beruhen (Spoofing, Wörterbuch-Attacken, Angriffe mit Replay). Auch Man-in-the-Middle-Attacken lassen sich auf diese Weise effizient unterbinden. Es existieren verschiedene Implementierungen des Kerberos-Protokolls, darunter MIT Kerberos, Heimdal Kerberos oder GNU Shishi. In einer dieser Implementierungen, nämlich der vom MIT, wurden nun zwei Sicherheitslücken entdeckt. Sie erlauben es einem entfernten Angreifer, Denial-of-Service-Attacken gegen den Dienst auszuführen.
Das erste Problem kann ein angemeldeter Angreifer ausnutzen, der dazu berechtigt ist, Password-Policies zu setzen. Dabei kommt ihm ein Null-Zeiger-Dereferenzfehler in der »krb5_ldap_get_password_policy_from_dn()« -Funktion zu Hilfe, um den Dienst zum Absturz zu bringen. Hierfür anfällig sind Systeme, bei denen der »kadmind« LDAP als KDC-Datenbank verwendet.
Das Patch für diese Schwachstelle fängt den Null-Zeiger durch eine korrigierte If()-Abfrage ab (Listing 1). Sollte der »ent« -Zeiger nun Null sein, so ist sichergestellt, dass die »populate_policy()« -Funktion nicht mehr aufgerufen wird, wodurch die Schwachstelle entfällt.
Listing 1
Gepatchte If-Abfrage
01 ent=ldap_first_entry(ld, result);
02 - if (ent != NULL) {
03 - if ((st = populate_policy(context, ld, ent, pol_name, *policy)) != 0)
04 - goto cleanup;
05 + if (ent == NULL) {
06 + st = KRB5_KDB_NOENTRY;
07 + goto cleanup;
08 }
09
10 + st = populate_policy(context, ld, ent, pol_name, *policy);
Beim zweiten Problem handelt es sich ebenfalls um einen Null-Zeiger-Dereferenzfehler. Der findet sich in der »krb5_encode_krbsecretkey()« -Funktion und kann ebenfalls von einem entfernten, angemeldeten Angreifer ausgenutzt werden, um DoS-Attacken durchzuführen. Er muss hierzu einen Principal Entry ohne Long-Term-Schlüssel in die Datenbank schreiben. Das ist beispielsweise mit folgenden Aufrufen möglich:
kadmin -q 'addprinc -nokey foo'
oder
kadmin -q 'purgekeys -all foo'
Auch diese zweite Sicherheitslücke führt zum Absturz des Dienstes. Das Problem im Programmcode tritt auf, wenn der Principal Entry von dem Database Abstraction Layer in das LDAP-Schema konvertiert wird. Der entsprechende Code in »krb5_encode_krbsecretkey()« ist nicht in der Lage, nicht vorhandene Schlüssel korrekt zu behandeln.
Statt eines erwarteten Null-terminierten Strings liefert die Funktion dann einfach einen Null-Zeiger zurück. Dieser Zeiger wird später an die »krb5_add_ber_mem_ldap_mod()« -Funktion weitergegeben, die ihn ohne zusätzliche Kontrollen einfach dereferenziert und damit die Attacke ermöglicht. Ein Patch korrigiert das Problem, indem es an der »krb5_encode_krbsecretkey()« -Funktion einige Modifikation vornimmt.
Die Tatsache, dass die beiden Lücken nur von angemeldeten Angreifern ausnutzbar sind, kann etwas beruhigen. Andererseits kommt MIT Kerberos gerade bei sehr großen Netzwerken (zum Beispiel von Universitäten) zum Einsatz, wo ein solcher Angriff die Arbeit vieler Benutzer stark beeinträchtigen würde.





