“Cryptographic Splicing” bei Authentisierungs-Cookies

LWN schreibt über eine Sicherheitslücke in Wordpress, mit deren Hilfe man das Authentisierungssystem vieler Wordpress-Installationen umgehen kann, sprich: Der Angreifer kann sich als beliebiger Benutzer anmelden. Sicherheitsprobleme bei Wordpress sind ja (leider) keine Seltenheit, doch dieser Angriff ist eine so nette Art des Um-die-Ecke-Denkens, daß ich sie hier näher beschreiben will; da diese Falle für Programmierer von Webanwendungen nicht offensichtlich ist, ist dies sicher auch für entsprechende Entwicker von Interesse.

Um einen angemeldeten Benutzer wiederzuerkennen, benutzen fast alle Webanwendungen Cookies. Wordpress (in Version 2.5; Version 2.5.1 beseitigt das Problem) speichert in diesem Cookie folgende Daten (das Pluszeichen repräsentiert das Aneinanderhängen von Strings):

Username + "|" + Ablaufdatum + "|" + MD5(Username + Ablaufdatum + Serversecret)

Zur Überprüfung der Gültigkeit eines solchen Cookies geht Wordpress folgendermaßen vor:

  • Zerlegen des Strings an den "|"-Zeichen
  • Berechnung von MD5(Username + Ablaufdatum + Serversecret), Vergleich mit dem dritten Teilstring

Dieses Verfahren erlaubt es der Webanwendung, die Gültigkeit des Cookies zu prüfen, ohne auf die Datenbank zugreifen zu müssen; Datenbankzugriffe sind langsam und daher ein Flaschenhals in Systemen mit hoher Verkehrsdichte.
Das Problem ist das Fehlen von Separatorzeichen innerhalb der Hashberechnung. Diese Schwachstelle kann ausgenutzt werden, wenn das Blog das Anlegen neuer Benutzer erlaubt (was recht häufig der Fall ist). Angenommen, der Name des anzugreifenden Benutzers wäre "root". Der Angreifer erzeugt nun auf dem Blog einen Neuen Benutzer, dessen Username mit "root" beginnt - beispielsweise "rootme". Nach der erfolgreichen Anmeldung (das Passwort seines selbst erzeugten Users kennt der Angreifer ja) erhält dieser ein Authentisierungscookie mit folgendem Inhalt:

rootme|20080601|hashwert

Nun modifiziert der Angreifer die Daten wie folgt (dank komfortabler Firefox-Add-Ons wie z.B. Tamper Data kann dies sogar im Browser selbst geschehen):

root|me20080601|hashwert

Befolgt man nun den obigen Algorithmus, erkennt man leicht, daß dies das selbe Hashergebnis liefert - denn "rootme"+"20080601" ergibt nunmal denselben String wie "root"+"me20080601". In letzterem Fall akzeptiert Wordpress aber den ersten Teilstring - nämlich "root" - als authentisierten Benutzer, und dies gänzlich ohne mühsames Knacken von Passwörtern oder ähnlichem.

Dieses Problem bei zusammengesetzten Strings nennt man "Cryptographic Splicing". Um das Problem zu umgehen, müssen innerhalb der Hash-Funktion ebenfalls Trennzeichen verwendet werden. Außerdem sollte beim Erzeugen von Accounts sichergestellt werden, daß der Benutzername das Trennzeichen nicht enthält.

Auf dieses und weitere Probleme bei der Webauthentisierung weist Steven Murdoch in seinem Paper Dos and Don'ts of Client Authentication on the Web hin.

(danke an Schabi für den Link)