Fragen? Antworten! Siehe auch: Alternativlos
Vielen Dank an den Finder! Mal gucken, was das war.
Update: War glücklicherweise kein Fehler in der Blogsoftware oder dem LDAP-Server sondern eine verkackte ACL. Der ACL-Support in tinyldap entstand für das Blog. Das ist auch der Grund, wieso das Blog LDAP als Backend nimmt. Damit es Leidensdruck gab, in tinyldap mal Schreibsupport und ACLs einzubauen. Der Code entstand dann auf beiden Seiten quasi parallel. Die nullte Iteration hatte eine Erlaubnis dafür, dass man sich gegen einen Record anmelden kann. tinyldap verwendet dafür eine an chmod angelehnte Syntax, und ich habe a für Authentication vergeben. Dann fiel mir auf, dass es überhaupt keinen Sinn ergibt, einen Record mit Passwort zu haben, und den dann nicht für die Authentisierung zu erlauben. Dann nennt man das Passwortfeld halt anders oder so. Also flog das a für auth wieder raus aus der ACL-Syntax und das a wurde für add neu vergeben. In den ACLs für das Blog war aber noch eine Regel für Authentisieren drin, und die hat dann halt stattdessen Add erlaubt. Allerdings nur wenn man sich mit einem validen Account anmelden konnte.
In LDAP ist "Username und Passwort leer" eine gültige Anmeldung, die anonyme Anmeldung. Der LDAP-Server ist nicht exponiert, aber über das Web kommt man da ran (irgendwie muss ich ja meine Beiträge reinkippen). Wenn man da Username und Passwort leer eingab, kam bei der ACL raus, die Authentisierung erlauben wollte, aber tatsächlich add erlaubte. m(
Da sieht man mal, wie wichtig Testen ist. Mit falschen Credentials hatte ich natürlich getestet, aber beides leer nicht, weil ich in der Sekunde nicht daran dachte, dass das im Code ein anderer Pfad ist.
Man sieht aber an der Stelle auch, wie wichtig gute Datenstrukturen sind. Selbst mit den kaputten ACLs, und selbst wenn mir auch beim Ändern alter Einträge ein ähnlicher Bockschuss passiert wäre: tinyldap legt Daten sequentiell an. Da wird nichts gelöscht oder geändert sondern es wird ein Update-Record hinten angehängt. So konnten die Angreifer nur hinten anfügen und nicht z.B. alles löschen, und das Aufräumen war auch trivial. Einfach hinten den Müll abschneiden.
Update: Weil jetzt einige Hater herumspekulieren: Nein, das war kein Versehen, dass mein Code öffentlich ist. Die Idee war, Neugierige zu belohnen. Das heißt aber nicht, dass der Code GPL ist. Wer den jetzt anderswo veröffentlicht, begeht streng genommen eine Urheberrechtsverletzung. Nutzt den Code einfach dafür, wofür er gedacht war. Delektiert euch daran. Aber bitte privat, nicht für andere spoilern. Das ist eine seltene Freude im Leben, wenn man nicht gerade beruflich anderer Leute Code auditiert, also macht sie anderen nicht kaputt.