mynethome.de

2. August 2007 um 11:30 Uhr

WP XSS Wurm doch nicht soo freundlich?

Achtung, liebe Leser, es wird technisch :)

Vorgestern wurde der erste WordPress Wurm veröffentlicht, der eine Cross Site Scripting (XSS) – Lücke ausnutzt. Zum Glück ist er prinzipiell freundlich und will WordPress-Nutzern dabei helfen, diese direkt zu schließen. Dieses Ansinnen ist sehr ehrenwert von dem Autor – leider erfüllt der Wurm es anscheinend nicht.

Während ich versucht habe, dieses gerade auf WordPress migrierte Blog zu schützen, sind mir 2 Dinge aufgefallen:

  1. Das Patchen funktioniert nur, wenn der Webserver-Prozess auch Schreibrechte auf die zu patchenden Dateien hat. ist das nicht der Fall, wird der „Wizard“ dennoch durchlaufen und Erfolg gemeldet – obwohl die Lücke nicht geschlossen ist. Im Prinzip gibt es durch die fehlende Schreibberechtigung auch die Lücke nicht in der beschriebenen Form, dennoch wäre es schöner, den Nutzer zu informieren.
  2. Der Patch patcht nicht nur da wo er soll. Ein Diff der Worpressdateien – nach dem Setzen der Berechtigungen und einem Durchlauf des Wurm-Patch-Wizards – ergibt:
    Index: upload.php
    ===================================================================
    --- upload.php  (revision 15)
    +++ upload.php  (working copy)
    @@ -11,6 +11,12 @@
     // IDs should be integers
     $ID = (int) $ID;
     $post_id = (int) $post_id;
    +/*
    +Security Patch added by the Secure WordPress Worm
    +by Benjamin Flesch http://mybeni.rootzilla.de/mybeNi/
    +*/
    +$style = preg_replace('/[^A-Za-z]/', '', $style);
    +/* end of patch */ // Require an ID for the edit screen
     if ( $action == 'edit' && !$ID )
    Index: link-import.php
    ===================================================================
    --- link-import.php     (revision 15)
    +++ link-import.php     (working copy)
    @@ -73,7 +73,13 @@
    -               $cat_id = $_POST['cat_id'];
    +
    +/*
    +Security Patch added by the Secure WordPress Worm
    +by Benjamin Flesch http://mybeni.rootzilla.de/mybeNi/
    +*/
    +$cat_id = preg_replace("/[^0-9]/","",$_POST['cat_id']);
    +/* end of patch */
                    if ( $cat_id == '' || $cat_id == 0 )
                            $cat_id  = 1;
    @@ -102,7 +108,7 @@
                            include_once('link-parse-opml.php');
    
                            $link_count = count($names);
    -                       for ( $i = 0; $i < $link_count; $i++ ) {
    +                       for ( $i = 0; $i < $link_count; $i   ) {
                                    if ('Last' == substr($titles[$i], 0, 4))
                                            $titles[$i] = '';
                                    if ( 'http' == substr($titles[$i], 0, 4) )
    Index: options.php
    ===================================================================
    --- options.php (revision 15)
    +++ options.php (working copy)
    @@ -88,6 +88,14 @@
    check_admin_referer('update-options');
    +/*
    +Security Patch added by the Secure WordPress Worm
    +by Benjamin Flesch http://mybeni.rootzilla.de/mybeNi/
    +*/
    +if ( preg_match("/['\"<>]/", $_POST['page_options']) )
    +      wp_die(__('Cheatin, uh?'));
    +/* end of patch */
    +
            if ( !$_POST['page_options'] ) {
                    foreach ( (array) $_POST as $key => $value) {
                            if ( !in_array($key, array('_wpnonce', '_wp_http_referer
    ')) )
    @@ -108,7 +116,7 @@
    $referred = remove_query_arg('updated' , wp_get_referer());
            $goback = add_query_arg('updated', 'true', wp_get_referer());
    -       $goback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $goback);
    +       $goback = preg_replace('|[^a-z0-9-~ _.?#=&;,/:]|i', '', $goback);
            wp_redirect($goback);
         break;

    Wie man sehen kann, gehen in der Datei link-import.php und options.php +-Zeichen verloren.
    Entweder, es liegt an meinem System, es ist gewollt und nicht markiert, oder es ist noch keinem anderen aufgefallen. Ich hoffe, auf die erste Variante, denn die letzten beiden wären meinem Gefühl nach nicht sehr erfreulich.

Was lernen wir daraus? Auch gutmütigen Würmern sollte man nicht blind vertrauen :) (und Berechtigungen auf dem Dateisystem sind dafür da, restriktiv zu sein, und böswillige Schreib-Aktionen im Kern zu ersticken ;-) )

Mal sehen, vielleicht bekomme ich ja Feedback von Beni, dem ich trotz des kleinen Problems sehr herzlich dafür Danken möchte, mir den ersten Wurm zu zeigen, der in seiner Intention gutmütig ist :)

Update / Fazit

Ich habe noch ein paar weitere Testläufe durchgeführt, so dass ich den Wurm jetzt auf verschiedenen Server Systemen

  • Ubuntu, 64 bit, Apache 2.0, PHP 5.1.2
  • Debian, 32 bit, Apache 2.0, PHP 5.2.0
  • Windows XP, XAMMP, Apache 2.0, PHP 5.2.2

und mit verschiedenen Browsern (Firefox, Internet Explorer, Safari) ausprobiert habe. Im Internet Explorer (Version 6.0.29) hagelte es Javascriptfehler – deswegen ist der aussen vor.

Alle weiteren Tests haben aber meine Behauptung von oben, das der Wurm nicht nur die angegbenen Codestellen verändert, bestätigt. Es gehen, wie oben im Diff dargestellt, an 2 Stellen +-Zeichen verloren, so dass aus der for Schleife eine Endlosschleife wird und der reguläre Ausdruck nicht mehr das macht, was er soll.
Es ist also dringend davon abzuraten, dem Wurm zu vertrauen. Patcht lieber von Hand, oder kontrolliert zumindest, was der Wurm verändert.

Mich erschreckt wirklich, wieviele dem Wurm vertrauen und nicht genau nachsehen, was er verändert. Wäre beNi der Wolf im Schafspelz gewesen, gäbe es dort draussen nun unzählige kompromittierte WordPress-Installationen.

Vielleicht nehm ich mir später noch den Sourcecode des Wurms zur Brust, um zu sehen, warum und wo die +-Zeichen verloren gehen.

Update 2

beNi hat den Fehler gefunden und behoben. :-)

19 Reaktionen zu “WP XSS Wurm doch nicht soo freundlich?”

  1. Gravatar Icon mybeNi websecurity

    hä, ich verstehe euer Probleme nicht? :)
    Der diff zeigt doch jetzt nur an das die dateien upload.php, link-import.php und options.php gepatcht wurden, oder?

    Und die zeile
    – $goback = preg_replace(‚|[^a-z0-9-~+_.?#=&;,/:]|i‘, “, $goback);
    + $goback = preg_replace(‚|[^a-z0-9-~ _.?#=&;,/:]|i‘, “, $goback);
    ist ja nonsense.

    Gruß benjamin

  2. Gravatar Icon Markus

    Unabhängig von dem Sinn der Zeile wollte ich herausstellen, das der Wurm mehr als die erwarteten Stellen verändert hat.
    Tritt das Problem denn nirgendwo sonst auf? Hat das mal jemand nachgeschaut? :)

  3. Gravatar Icon KRiZZi

    Moin Markus!

    Erstmal vielen Dank für den Hinweis. Leider reichen meine PHP- (und generell coding-) Skills nicht aus, um das nachzuvollziehen – geschweige denn, eine Konsequenz daraus abzuleiten. Aber eben genau diese würde mich natürlich (und ich denke, da bin ich nicht der Einzige) interessieren.

    Aber gerade dadurch, dass ich aktiv nicht wirklich was zu dem Thema beitragen kann, bin ich auf weitere Meinungen natürlich umso gespannter. ;)

    Gruss
    Sascha

  4. Gravatar Icon BloggingTom

    Ohne den „Wurm“ selber getestet zu haben, kann ich das im Moment auch nicht nachvollziehen. Das Script wird doch nicht „+“ und „-“ vor den geänderten php-Zeilen einfügen, oder?
    Wär das so, dann wär das nicht nur kompletter Nonsens, sondern die Scripts würden wohl auch nicht mehr funktionieren…

  5. Gravatar Icon flu

    @BloggingTom Nein, das Script wird keine „+“ und „-“ einfügen. Diese Zeichen stehen für die Ausgabe des Befehls diff und zeigen, was sich an der Datei verändert hat…
    – = Zeile entfernt
    + = Zeile hinzugefügt

  6. Gravatar Icon WordPress-Wurm im Umlauf : fob marketing

    […] gutartig ist, jedoch leider auch einige Code-Bestandteile des WordPress-Systems verändert, deren Änderung wahrscheinlich nicht gewünscht […]

  7. Gravatar Icon Markus

    Genau, bzw welche Zeilen. Und in den Zeilen sieht man dann, das dort je ein + Zeichen fehlt – einmmal hinter dem i und einmal in dem regulären Ausdruck :)

  8. Gravatar Icon BloggingTom

    @flu: Das ist mir (eigentlich) klar ;-) Allerdings fällt mir doch auf, dass ich den Beitrag erst falsch interpretiert habe und davon ausging, dass Markus genau das Einfügen der „+“ und „-„-Zeichen monierte. Tja, manchmal sollte ich das Hirn einschalten bevor ich kommentiere :-)

    @beNi:

    Und die zeile

    - $goback = preg_replace(’|[^a-z0-9-~+_.?#=&;,/:]|i’, ”, $goback);
    + $goback = preg_replace(’|[^a-z0-9-~ _.?#=&;,/:]|i’, ”, $goback);

    ist ja nonsense.

    Zumindest bei der zweiten (also der gepatchten) Zeile wird aber gemäss Markus das +-Zeichen im Pattern entfernt.

    Wie gesagt, ob das zutrifft kann ich nicht sagen, da ich das Script bei mir nicht rangelassen habe…

    Das

  9. Gravatar Icon inside GIGALinux // Weblog // Würmer sind immer böse

    […] Jedoch bei mynethome.de sorgen, ob der Wurm doch böse ist. Vertrauen ist gut, Kontrolle ist besser. Deshalb rate ich dazu nicht via Wurm zu patchen, sondern sich die aktuellen Files aus dem SVN von WordPress zuholen. Da jetzt vielen der Begriff Subversion nichts sagt, hab ich ein ZIP-File mit den zupatchenden Datei gemacht. Ich versichere das ich dort nichts eingebaut habe und es 1:1 die gleichen aus dem SVN sind. Einfach die alten Datei, mit den neuen überschreiben. […]

  10. Gravatar Icon Webrocker

    aus
    (snip) +_.? (snap)

    wird
    (snip) _.? (snap)

    in den oben angegeben Zeilen. Damit verändert der Wurm den Code, genauso wie etwas weiter oben aus
    (snip) $i++ (snap)
    ein
    (snip) $i (snap)
    wird.

    So zumindestens verstehe ich die +/- Zeilen aus dem diff.
    ?

  11. Gravatar Icon Dimension 2k : Blog Archive : Fünf neue Lücken in Wordpress?

    […] dann helfen soll, diese direkt zu schließen. Markus Schlichting von mynethome.de hat den Wurm getestet und analysiert und rät: […] Es ist also dringend davon abzuraten, dem Wurm zu vertrauen. Patcht lieber […]

  12. Gravatar Icon Christian Schmidt

    Ich habe das Update bei mir manuell gemacht, mal gucken wann das offizielle kommt.

  13. Gravatar Icon Some bugs ~ mybeNi websecurity

    […] “Symantec Security Blog” talks about these Bugs (the Norton guys *wurks*), but Markus Schlichting is the first one who mentioned this concerns. Thank […]

  14. Gravatar Icon mybeNi websecurity

    Hey, bin grad zurückgekommen.
    Puh, das ist ja nett das ich das jetzt auchma bemerke!
    Hab in das würmchen jetzt noch ein
    newcontent=escape(newcontent).replace("+","%2B");
    eingebaut, damit sollte alles laufen.

    Entschuldigt die unannehmlichkeiten ;)

    PS: sehe grad das die bugs echt total minor sind, im normalen Blogalltag würde man die doch garnicht bemerken. Hab jedenfalls mal nen Post drüber gemacht und den Wurm gepatcht, das alles war ein Doofer Konzentrationsfehler, sorry

    Gruß Benjamin

  15. Gravatar Icon KRiZZi's BLOG

    Wurm fixt Sicherheitslücken in WordPress…

    beNi hat einen Wurm! veröffentlicht, der eine Sicherheitslücke in vermutlich allen WordPress-Versionen (auch der aktuellen 2.2.1) schliesst.
    Diese ‘etwas andere Art von Patch’ funktioniert so genial wie einfach:
    Schreibt in eurem …

  16. Gravatar Icon bloodys Blog » Blog Archive » Der erste Weblog-Wurm

    […] Es gibt natürlich Leute, die auch Kritik an dem Wurm verüben, z.B. bei mynethome.de […]

  17. Gravatar Icon Neue WordPress-Versionen 2.2.2 und 2.0.11 aufgrund Sicherheitslücken — Software Guide

    […] unter Ausnutzung der Sicherheitslücken selbst beheben soll. Allerdings enthielt dieser Wurm noch 2 Bugs, die gestern behoben […]

  18. Gravatar Icon Pet Smart

    Moin Markus!

    Erstmal vielen Dank für den Hinweis. Leider reichen meine PHP- (und generell coding-) Skills nicht aus, um das nachzuvollziehen – geschweige denn, eine Konsequenz daraus abzuleiten. Aber eben genau diese würde mich natürlich (und ich denke, da bin ich nicht der Einzige) interessieren.

    Aber gerade dadurch, dass ich aktiv nicht wirklich was zu dem Thema beitragen kann, bin ich auf weitere Meinungen natürlich umso gespannter.

    Gruss
    Sascha

  19. Gravatar Icon Webjunkie » Artikel » XSS - Was ist das?

    […] (2.3.1) geschlossen wurde. Wer noch die Version 2.2.1 verwendet sollte sich dies und das anschauen. Vorsicht ist auch geboten bei den Plugins, lieber selber […]

Einen Kommentar schreiben


Gravatar unterstützt

mynethome.de wird erstellt mit WordPress
Beiträge (RSS) und Kommentare (RSS)

(c) 2005 - 2023 Markus Schlichting - Mastodon