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:
- 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.
- 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
Am 2. August 2007 um 13:36 Uhr
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
Am 2. August 2007 um 14:23 Uhr
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?
Am 3. August 2007 um 06:38 Uhr
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
Am 3. August 2007 um 10:36 Uhr
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…
Am 3. August 2007 um 10:52 Uhr
@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
Am 3. August 2007 um 10:56 Uhr
[…] gutartig ist, jedoch leider auch einige Code-Bestandteile des WordPress-Systems verändert, deren Änderung wahrscheinlich nicht gewünscht […]
Am 3. August 2007 um 10:56 Uhr
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
Am 3. August 2007 um 11:04 Uhr
@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:
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
Am 3. August 2007 um 11:41 Uhr
[…] 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. […]
Am 3. August 2007 um 12:13 Uhr
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.
?
Am 3. August 2007 um 13:11 Uhr
[…] 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 […]
Am 3. August 2007 um 16:07 Uhr
Ich habe das Update bei mir manuell gemacht, mal gucken wann das offizielle kommt.
Am 3. August 2007 um 19:54 Uhr
[…] “Symantec Security Blog” talks about these Bugs (the Norton guys *wurks*), but Markus Schlichting is the first one who mentioned this concerns. Thank […]
Am 3. August 2007 um 20:07 Uhr
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
Am 3. August 2007 um 22:49 Uhr
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 …
Am 4. August 2007 um 17:53 Uhr
[…] Es gibt natürlich Leute, die auch Kritik an dem Wurm verüben, z.B. bei mynethome.de […]
Am 5. August 2007 um 10:43 Uhr
[…] unter Ausnutzung der Sicherheitslücken selbst beheben soll. Allerdings enthielt dieser Wurm noch 2 Bugs, die gestern behoben […]
Am 27. Februar 2008 um 11:45 Uhr
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
Am 30. August 2008 um 15:40 Uhr
[…] (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 […]