“Cryptographic Splicing” bei Authentisierungs-Cookies

LWN schreibt über eine Si­cher­heits­lü­cke in Word­press, mit deren Hilfe man das Au­then­ti­sie­rungs­sys­tem vie­ler Word­press-In­stal­la­tio­nen um­ge­hen kann, sprich: Der An­grei­fer kann sich als be­lie­bi­ger Be­nut­zer an­mel­den. Si­cher­heits­pro­ble­me bei Word­press sind ja (lei­der) keine Sel­ten­heit, doch die­ser An­griff ist eine so nette Art des Um-die-Ecke-Den­kens, daß ich sie hier näher be­schrei­ben will; da diese Falle für Pro­gram­mie­rer von Web­an­wen­dun­gen nicht of­fen­sicht­lich ist, ist dies si­cher auch für ent­spre­chen­de Ent­wi­cker von In­ter­es­se.

Um einen an­ge­mel­de­ten Be­nut­zer wie­der­zu­er­ken­nen, be­nut­zen fast alle Web­an­wen­dun­gen Coo­kies. Word­press (in Ver­si­on 2.5; Ver­si­on 2.5.1 be­sei­tigt das Pro­blem) spei­chert in die­sem Coo­kie fol­gen­de Daten (das Plus­zei­chen re­prä­sen­tiert das An­ein­an­der­hän­gen von Strings):

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

Zur Über­prü­fung der Gül­tig­keit eines sol­chen Coo­kies geht Word­press fol­gen­der­ma­ßen vor:

  • Zer­le­gen des Strings an den "|"-Zei­chen
  • Be­rech­nung von MD5(User­na­me + Ab­lauf­da­tum + Ser­ver­se­cret), Ver­gleich mit dem drit­ten Teil­string

Die­ses Ver­fah­ren er­laubt es der Web­an­wen­dung, die Gül­tig­keit des Coo­kies zu prü­fen, ohne auf die Da­ten­bank zu­grei­fen zu müs­sen; Da­ten­bank­zu­grif­fe sind lang­sam und daher ein Fla­schen­hals in Sys­te­men mit hoher Ver­kehrs­dich­te.
Das Pro­blem ist das Feh­len von Se­pa­ra­tor­zei­chen in­ner­halb der Hash­be­rech­nung. Diese Schwach­stel­le kann aus­ge­nutzt wer­den, wenn das Blog das An­le­gen neuer Be­nut­zer er­laubt (was recht häu­fig der Fall ist). An­ge­nom­men, der Name des an­zu­grei­fen­den Be­nut­zers wäre "root". Der An­grei­fer er­zeugt nun auf dem Blog einen Neuen Be­nut­zer, des­sen User­na­me mit "root" be­ginnt - bei­spiels­wei­se "root­me". Nach der er­folg­rei­chen An­mel­dung (das Pass­wort sei­nes selbst er­zeug­ten Users kennt der An­grei­fer ja) er­hält die­ser ein Au­then­ti­sie­rungs­coo­kie mit fol­gen­dem In­halt:

rootme|20080601|hashwert

Nun mo­di­fi­ziert der An­grei­fer die Daten wie folgt (dank kom­for­ta­bler Fi­re­fox-Add-Ons wie z.B. Tam­per Data kann dies sogar im Brow­ser selbst ge­sche­hen):

root|me20080601|hashwert

Be­folgt man nun den obi­gen Al­go­rith­mus, er­kennt man leicht, daß dies das selbe Has­h­er­geb­nis lie­fert - denn "root­me"+"20080601" er­gibt nun­mal den­sel­ben String wie "root"+"me20080601". In letz­te­rem Fall ak­zep­tiert Word­press aber den ers­ten Teil­string - näm­lich "root" - als au­then­ti­sier­ten Be­nut­zer, und dies gänz­lich ohne müh­sa­mes Kna­cken von Pass­wör­tern oder ähn­li­chem.

Die­ses Pro­blem bei zu­sam­men­ge­setz­ten Strings nennt man "Cryp­to­gra­phic Spli­cing". Um das Pro­blem zu um­ge­hen, müs­sen in­ner­halb der Hash-Funk­ti­on eben­falls Trenn­zei­chen ver­wen­det wer­den. Au­ßer­dem soll­te beim Er­zeu­gen von Ac­counts si­cher­ge­stellt wer­den, daß der Be­nut­zer­na­me das Trenn­zei­chen nicht ent­hält.

Auf die­ses und wei­te­re Pro­ble­me bei der Webau­then­ti­sie­rung weist Ste­ven Mur­doch in sei­nem Paper Dos and Don'ts of Cli­ent Au­then­ti­ca­ti­on on the Web hin.

(danke an Schabi für den Link)