WordPress 2.8.3: Admin password reset exploit – schwere Sicherheitslücke

wordpressbox80x80pixelGerade eben von meinem langjährigen Netzkollegen Alexander auf eine Sicherheitslücke in WordPress 2.8.3 aufmerksam gemacht worden. So ist es jedem möglich, dass Passwort des Administrators zurück zu setzen. Zwar kann man die Lücke nicht ausnutzen sofern man nicht auf das Mailkonto des Admins Zugriff hat, doch dieser kann sich auch erst einmal nicht einloggen, ohne vorher sein neues Passwort per Mail abzufragen. Um dies bis zur nächsten Version zu beheben, öffnet eure wp-login.php und ändert in Zeile 190 den Text von if ( empty( $key ) ) in if ( empty( $key ) || is_array( $key ) ).

Betroffen sind scheinbar nur die Versionen 2.8.x. Ich weiss wie der Exploit ausgeführt wird und habe ihn erfolgreich an zwei Blogs ausprobieren können. Allerdings werde ich den Aufruf hier logischerweise nicht veröffentlichen. Den ganzen Ärger kann man sich auch sparen, sofern man seinen Daten zusätzlich per .htaccess absichert.

Nachtrag: bitte eventuell auch diesen Kommentar beachten. Ausserdem findet ihr hier den technischen Hintergrund.

Gefällt dir der Artikel? Dann teile ihn mit deinen Freunden.

Hallo, ich bin Carsten! Baujahr 1977, Dortmunder im Norden, BVB-Getaufter und Gründer dieses Blogs. Auch zu finden bei Twitter, Google+, Facebook, Instagram und YouTube. PayPal-Kaffeespende. Mail: carsten@caschys.blog

72 Kommentare

  1. Danke für die Info, aber ich denke, dass du die „wp-login.php“ meinst, und nicht die „wp-admin.php“

  2. Danke schön!

  3. Danke für den Tipp! Habe die Datei sofort gefixt.

  4. Der Fix verrät eigentlich schon die Lücke :p

    Ist aber mal wieder ein Bug, den man einfach nicht beim ersten mal sieht.

  5. Danke dafür. Direkt gefixt.

  6. Gefixt und weiter publiziert. Danke für den Hinweis.

  7. Super, dankeschön – gleich behoben und retweetet 😉

  8. Behoben! vielen Dank!

  9. Ach du warst das also bei mir. Danke =D

  10. Vielen Dank für den Hinweis auf die Lücke! Ich habe den Fix direkt eingebaut und deinen Tweet gleich weitergereicht 😉

  11. Echt toll, dass du die Lücke so schön dokumentierst. Gerade das sollte man nicht machen und wurde auch beim letzten Bug nicht gemacht siehe WPD….

    Ich hoffe, ihr habt es auch dem Security Team von WP gemeldet….

  12. @super:

    jau, ist es wohl – und zudem hat auch Heise eine halbe Stunde nach meinem Text darüber berichtet.

  13. Na dann gibt es wohl in ein paar Tagen wieder ne neue Version von WordPress … da kommt man ja nicht mehr zum bloggen bei den ganzen Updates 😉

  14. Danke für den Hinweis, fixed.
    Ziemlich derber, simpler Fehler für ein offizielles Release.

  15. Danke für den Hinweis und die Fix.

  16. Schön und gut, aber der Fix reicht nicht wirklich aus und wurde auch schon wieder entfernt, siehe Changeset 11799. In der Timeline gibt es weitere Änderungen, siehe Changeset 18000 – 18004.

    Dies ist somit nur ein oberflächlicher Fix und sollte kein Grund sein, um nicht auf das nächste Sicherheitsrelease zu verzichten.

    Könnte man eventuell hinzufügen.
    Schönen Gruß.

  17. So schwer ist die Sicherheitslücke gar nicht. o.o
    Sie ist nur einfach auszunutzen…aber mal ehrlich, viel kann der Angreifer nicht machen…

  18. was is das denn fürn scheiß?
    du erklärst nicht WARUM es da ein fehler gibt, aber „jaja passt schon, nur das da ändern“

    du weißt schon, dass eine opensource entwicklung davon lebt, dass wenn was gefunden wird, auch alles dadrum dokumentiert wird?

    ich persönlich denke mir ich weiß warum, bin mir aber net komplett sicher aber hier solls ja auch nicht technisch werden.
    wie vielen gutmenschen könntest du auf diese art, nicht was für scheiß code einschleusen?? einfach nur weil von coding kein dunst haben und da alles reinkopieren würden! DAS ist die größte lücke am system. der user!

  19. @ed:
    WARUM es den Fehler gibt, weiss ich nicht, schließlich bin ich KEIN Coder. Wohl weiss ich aber, dass hier viele Blogger mitlesen, die den Scheiss erst einmal absichern wollen. Darum geht es. Des Weiteren weiss das WP-Team um diese Lücke. Aber deswegen gibt es hier auch keine Anleitung, wie man das ausführen kann…

  20. Danke für die Info! Hab meine Blogs direkt gefixt.

  21. Ich habe bei mir mal versucht, den Fehler etwas zu erläutern. Danke für den Hinweis, caschy.

  22. Danke, ich trage es mal nach 🙂

  23. Publiziert wurde das ganze von http://g-laurent.blogspot.com/2009/08/wordpress-283-remote-admin-reset.html.

    Irgendwie ist die 2.8er Version von WordPress besch…eiden

  24. Das funktioniert aber nur, wenn man gleichzeitig den/einen Benutzernamen des Admins kennt… richtig?
    Und wer unter WordPress noch „admin“ verwendet… na ja…

  25. Ok. Welche Änderungen müssen den nun durchgeführt werden? Beim Anschauen der TimeLine entsteht lediglich Verwirrung.

    Die Änderung bzgl. is_Array scheint nicht korrekt zu sein. Dort wird bereits eine Änderung, welche statt is_array !is_String nutzt.

    http://core.trac.wordpress.org/changeset/11799

    Außerdem sind noch weitere Änderungen unter dem Thema „Pass user login when resetting passwords. „

  26. @Marc

    Falsch, das funktioniert immer.
    Man führe sich bitte die Erklärung von Filzo zu Gemüte.
    Die Datenbankabfrage nach „SELECT * FROM $wpdb->users WHERE user_activation_key = %s“ liefert dann alle Benutzer aus wp_users zurück, deren Feld user_activation_key = “ ist.
    Da dabei automatisch nach dem Primärschlüssel (ID) sortiert wird und für gewöhnlich der Admin die ID = 1 hat, wird eben genau diese Zeile zurückgeliefert.

    Gruß, Perry

  27. @Marc,

    Das funktioniert aber nur, wenn man gleichzeitig den/einen Benutzernamen des Admins kennt… richtig?
    Und wer unter WordPress noch “admin” verwendet… na ja…

    es sind auch Leute betroffen, die schon seit Jahren admin als Login nicht mehr verwenden. So weit ich die Lücke verstanden habe, muss man den Nutzernamen nicht kennen.

  28. Hi Carsten,
    sehe ich das richtig, dass eine portable WordPress-Version kein Sinn macht, weil die auf den Server kommt? Ich kenne mich da nicht so aus.

  29. Es sei denn, du hast Vollzugriff auf deinen Windows-Server 😉

  30. Danke, direkt erledigt!

  31. Danke für den Hinweis. Ist Direkt gefixt. Freue mich aber schon auf Version 2.8.4 ;).

    MfG Oli

  32. @Gerrit
    Der endgültige Fix ist wohl Changeset 11804
    Aus diesem Grund einfach den Inhalt dieser Datei (Quelle) mit dem alten Inhalt der wp-login.php ersetzen. Dann solltest du wieder auf der sicheren Seite sein.

    Gruß

  33. Super…Danke Schön!…..Meine Fragen haben sich nur durch das lesen beantwortet!

  34. Laurent Gaffié hat die Schwachstelle gefunden. Ja, ich hab es gerade auch mal ausprobiert. =)

  35. Vielen Dank für den Hinweis!
    Habe die Datei sofort geändert. 😉

  36. @Perry

    Falsch, das funktioniert immer.
    Man führe sich bitte die Erklärung von Filzo zu Gemüte.
    Die Datenbankabfrage nach “SELECT * FROM $wpdb->users WHERE user_activation_key = %s” liefert dann alle Benutzer aus wp_users zurück, deren Feld user_activation_key = ” ist.
    Da dabei automatisch nach dem Primärschlüssel (ID) sortiert wird und für gewöhnlich der Admin die ID = 1 hat, wird eben genau diese Zeile zurückgeliefert.

    Gruß, Perry

    Mal im ernst, wer lässt die Adminid nach der Installation bei 1 das erste was ich Tat war die ID zu ändern und nein nicht auf 2 😉

    mfg

  37. „Allerdings werde ich den Aufruf hier logischerweise nicht veröffentlichen.“

    Geheimnis Geheimnis … das kriegt man in ca. 5 sec raus, wenn man google bedienen kann …

  38. WordPress 2.8.4 ist da. Download. Stay safe. 🙂

  39. Na, wenn schon das Paket von 2.8.3 auf 2.8.4:
    http://is.gd/2ddoQ

  40. Danke für den Hinweis. Super!

  41. Ich habe eben gelesen, dass die beta 2 von WordPress 3.0 ab sofort zu haben ist, falls jemand die testen will. Ein RC soll bald folgen und die finale Ausgabe soll voraussichtlich am 15.5.2010 erscheinen.

    Quelle: http://blog.wordpress-deutschland.org/2010/05/07/wordpress-3-0-hat-beta2-status-erreicht.html