Artikel vom 20. Februar 2009

WordPress-Wurm treibt sein Unwesen: Blogger als Sicherheitsrisiko

WordPress

Offenbar reicht es heutzutage nicht aus, allein das Betriebsystem des heimischen Computers gegen Viren und Hacker zu schützen. Denn, aktuell macht sich ein Wurm im internationalen Raum breit, der explizit auf WordPress-Blogs abgesehen hat und sich im Template des verwendeten Theme einnistet. Seine Absichten: Ausgehende Links zu einschlägigen Seiten wie Online Casinos auf die Blogroll zu setzen. Etwa eine Sicherheitslücke? Wenn schwache Passwörter eine sind, dann ja.

Der unsichtbare Schädling
Im letzten Monat heuften sich auch im deutschsprachigen Raum die Fälle, wo Anwender über neu hinzugekommene, wie von der Geisterhand angelegte Links innerhalb der Blogroll berichteten. So auch heute in der WordPress-Gruppe bei XING. Ich durfte den außergewöhnlichen Fall inspizieren, protokollieren und analysieren.

Der Hintergrund in ausführlicher Form: Über Nacht wurde die Linkssammlung (auch Blogroll genannt) um einen oder mehrere Links erweitert – allerdings nicht vom Inhaber des Blog, vielmehr ungewollt und unkontrolliert. Die Löschung des überflüssigen Link im Administrationsbereich der WordPress-Installation brachte keine gewünschte Wirkung: Die Verknüpfung war spätestens beim nächsten Aufruf der Blogseite wieder sichtbar und linkte auf das hinterlegte Ziel.

Eins steht jetzt fest: Es war kein Versehen! Der “böse” Link muss von einem Script manipuliert und überwacht sein. Erfinderisch: Scheinbar prüft ein eingeschmuggeltes Script bei jedem Aufruf des Blog auf die Existenz des gesetzten Link. Wurde dieser händisch aus der Blogroll entfernt, so wird prompt ein neuer angelegt. Zack! Schnell entsteht daraus eine “The NeverEnding Story”.

Der Link bleibt also hartnäckig und lässt sich nicht entfernen – was tun? Man begibt sich auf die Suche nach dem Beschützer-Script, welches das Dasein der zu eliminierenden Verknüpfung steuert und deckt. Meine erste Vermutung war die functions.php, die eigentlich für nachträglich hinzugefügte Funktionen gedacht ist und solch ein Codeschnipsel dort bestens aufgehoben wäre. Pustekuchen!

Der Wolf im Schafspelz
Zunächst kommen Templates in den Verdacht, den böswilligen Code implantiert bekommen zu haben. In der Tat! Das Template header.php wurde mit einem PHP-Code infiziert: Gleich nach dem <body>-Tag versucht sich ein überdurchschnittlich langer Befehl in Form einer kodierten Zeile zu verstecken. Geschickte Platzierung und perfekte Wahl der Template-Datei sorgen für den seitenweiten Befehlsaufruf und permanente Überwachung der Linkssammlung.

Warum sind die Funktionsaufrufe eigentlich kodiert?

Weshalb wurde ein Template und keine Core-Datei infiziert?

Infiziertes Header-Template mit ausführbarem Code
Header-Template mit einem Teil des Befehls

Weiter schlimmer…
Nun ist der Übeltäter gefasst, Ende der spannenden Odyssee? Natürlich nicht. Aus Neugier verschaffen wir uns den Einblick in den kodierten Code des Schädlings. Dekodierter Kokon beinhaltet in sich eine smarte Anwendung, die bösartiger ist als vermutet:

  1. Es wird eine ausgehende Verbindung zum Server im Internet aufgebaut. Je nach Erreichbarkeit steht ein zusätzlicher Server zur Verfügung, um gestellte Anfragen bzw. Requests sorgfältig und zeitnah verarbeiten zu können.
  2. Beim Verbindungsaufbau werden Daten des Blog übermittelt.
  3. Vom entfernten Server bekommt das eingenistete Script einen PHP-Code als Antwort übersendet.
  4. Der empfangene PHP-Code wird im Blog ausgeführt.

Der letzte Listenpunkt lässt jeden Blogger zittern! Denn es ist in der Tat so, wie es klingt: Ein beliebiger Code wird von außerhalb in den Blog eingeschleust und zum Laufen gebracht. Wie die Geschichte endet, entscheidet ganz alleine der Virus und die dahinterstehende Zielsetzung. Denkbar wären eine komplette Leerung der lokalen Datenbank, Übermittlung der Daten aus den WordPress-Tabellen an den entfernten Server oder Missbrauch der Hardware für weitere Angriffe. Katastrophale Folgen bringt eine derartige Infizierung mit sich.

Ausschnitt aus dem dekodierten Code des WordPress-Wurms
Ausschnitt aus dem dekodierten Code des WordPress-Wurms

Wenn man sich die Domains der aus dem Script angesprochenen Server anschaut, wird schnell klar: Diese Server haben die alleinige Aufgabe, den nach Hause funkenden Wurm zuverlässig und performant mit entsprechender Antwort zu beliefern. Dank übermittelten Blogdaten sind die Server der Angreifer in der Lage, jedem befallenen Blog abhängig von seinen Eigenschaften unterschiedlichen Code zur Ausführung zurückzusenden.

Directory Listing Denied beim Zugriff auf Hacker-Server
“Directory Listing Denied” beim Zugriff auf Hacker-Server

An der Tür geklopft und eingebrochen
Nach der Bloßstellung des Sündenbocks gilt nun herauszufinden, auf welchem Weg das Script ins Template des Blog geschrieben wurde. Da es sich um die neuste WP-Version handelte, sind bereits bekannte Sicherheitslücken z.B. in der Snoopy-Class ausgeschlossen. Massenweise Access- und FTP-Logs wurden von mir ausgewertet, ich bin der festen Überzeugung, dass die für eine Injektion notwendige Änderung via FTP erfolgt hatte. Die scheinbar sehr zügig erratenen Zugangsdaten werden vom Roboter zwecks weiteren Schreibversuchen gemerkt und zur Verifizierung beim FTP-Server benutzt.

Übrigens, nach der Aktualisierung der Templatedatei setzt der Bot das Änderungsdatum zurück und vermeidet somit, dass die Datei durch das Datum unnötig auffällt. Die Krönung des Konzepts: Im FTP-Protokoll lässt sich wunderbar sehen, dass der gleiche Roboter den FTP-Server mit befallenem Blog in bestimmten Zeitintervallen aufsucht, um nachzuschauen ob das Script im Template seine Arbeit fleißig verrichtet. Wurde der Betrug rechtzeitig erkannt und das Script aus dem Template eliminiert, wird der bereinigte Code in header.php vom Bot immer wieder aufs Neue verseucht.

Erkenntnis und Lösung
WordPress trägt in diesem Fall keine Schuld. Weder Sicherheitslücken noch frei zugängliche Schnittstellen sind für die Infizierung verantwortlich. Blogger und die zu einfach gewählten Eintrittsdaten stellen ein enormes Sicherheitsrisiko dar und verhelfen aktiv der Verbreitung des Wurms.

Also? Die Zugangsdaten zum FTP-Server schärfen stellen – nicht erst nach einem Virusbefall (auch wenn es jetzt keine Epidemie ist), vielmehr spätestens nach der Inbetriebnahme des Blog. Das Passwort muss mindestens 7 Zeichen lang sein und ein Sonderzeichen enthalten.

Mehr Tipps und Tools zur Absicherung des Blog:

Nachgefragt
Jemand unter euch davon betroffen (gewesen)? Schon mal etwas vom Phänomen “Woher kommt dieser Link in meiner Blogroll?” gehört? Wie lange ist das Passwort in eurem Blog bzw. auf dem FTP?

Sergej Müller

[Der Autor] Sergej Müller ist enthusiastischer Software Engineer mit Schwerpunkten Webentwicklung und WordPress. Seit 2007 programmiert und vertreibt er wpSEO, das weltberühmte und patentierte SEO-Plugin für WordPress-Blogs.

Social Werkzeuge

36 Kommentare zum Artikel

526 Tage zuvor | #1 mr.gene

Klingt ja mal äußerst spannend…so kommt man auch an massig Backlinks ;-P

Nee im Ernst: Das ist ja mal ganz schöner scheiss…ich hoffe mal, dass meine Passwörter sicher genug sind, deine 10 Schritte zur Sicherheit werd ich mir aber morgen trotzdem nochmal intensiv anschauen ;)

mr.gene
526 Tage zuvor | #2 flöschen

Uhhh… Sehr beängstigend. Danke für die sehr genaue Analyse und Erklärung dieses Schädlings.

flöschen
525 Tage zuvor | #3 solar22

Oha..mir ist ein Schauer über den Rücken gelaufen bei der Schlagzeile…
Aber zum GLück ist nicht WP schuld, ich denke mein Zufallsgeneriertes PW mit Zahlten und Buchstaben (Groß und Klein) errät das Teil nicht so schnell vor allem weil Benutzername und PW vom FTP nichts mit den Daten vom Blog gemeinsam haben :D

solar22
525 Tage zuvor | #4 CyMotion (Sven)

Wer mit aus Faulheit und Bequemlichkeit resultierenden Standardpasswörtern hantiert der brauch sich nicht wundern… Ich hab trotzdem mal meine Links und die Templatedateien gecheckt obwohl ich mir recht sicher bin ein gutes Passwort gewählt zu haben aber wenn man dieses im Browser bzw Computer gespeichert lässt ist es schon wieder nicht sooo sicher ^^ Ich benutze inzwischen ein USB Stick + Passwortverwaltungsprogramm um solche Daten nicht permanent angreifbar zu halten.

CyMotion (Sven)
525 Tage zuvor | #5 solar22

Kannst du mal den ganzen php code veröfentlichen der dann da steht, dann kann man nen Gegencode schreiben :)

solar22
525 Tage zuvor | #6 Sergej Müller

Ist schon ungewöhnlich und unerwartet einen Wurm für WordPress zu sichten und entschärfen zu müssen. Gott sei Dank nicht in meinem eigenen Blog.

Ich will gar nicht wissen, welcher Unsinn noch mit der dynamischen Auslieferung des ausführbaren Code getrieben wird. Ich meine, sie hätten den Code für die Vervollständigung der Blogroll um eigene Links auch direkt im Script positionieren können, ohne ausgehende Verbindungen herstellen zu müssen. Aber nein, sie legen den Server offen, dafür können Sie jederzeit den Code im infizierten Blog frei und zeitlich steuern. Schachmatt.

Sergej
525 Tage zuvor | #7 Sergej Müller

@solar22
Wenn du willst, kann ich dir den dekodierten Code zusenden, öffentlich legen würde ich den ungern.

Sergej
525 Tage zuvor | #8 solar22

@Sergej:
Das wäre nett, meine Mailadresse hab ich ja mit meinen Kommentaren hinterlegt :)

solar22
525 Tage zuvor | #9 Sergej Müller

Hab ich dir geschickt, aber keinen Unsinn damit treiben ;)

Sergej
525 Tage zuvor | #10 solar22

Nene, sowas hab ich nicht nötig ^^
Ich werd mal versuchen das Script auszutricksen :D

solar22
525 Tage zuvor | #11 Sergej Müller

Aber hast du nicht oben gesagt, deine Passwörter seien sicher?

Sergej
525 Tage zuvor | #12 solar22

RIchtig, ich möchte mal versuchen ein Script zu schreiben, welches dieses Script unschädlich macht.

Was wohl passiert wenn man den body Tag löscht ?

solar22
525 Tage zuvor | #13 Sergej Müller

Zugegeben verstehe ich noch nicht, wie du das Script “unschädlich” machen willst? Noch bevor es eingeschleust wird oder danach?

Sergej
525 Tage zuvor | #14 solar22

Wie genau weis ich auch nich nicht ^.^
Ich werd mir mal ein WP lokal aufsetzen und ein wenig experimentieren.
Vllt find ich ja einen Weg…^^

PS: Bis jetzt ist keine Mail angekommen

solar22
525 Tage zuvor | #15 Sergej Müller

Die E-Mail ist mit Sicherheit bei dir angekommen und der Virus hat sich im Hintergrund installiert und die E-Mail anschliessend gelöscht ;)

Nein, Scherz. An die E-Mail-Adresse aus deinen Kommentaren hab ich vor ein paar Minuten geschickt.

Sergej
525 Tage zuvor | #16 solar22

Komisch die Blogmails kommen immer sofort an…

ah…gefunden :D
Du bist im Spamordner gelandet, und zwar der spamordner der nur in der webmailsichtbar ist…

solar22
525 Tage zuvor | #17 Sergej Müller

Naja, im Body der E-Mail ist auch böswilliger Code ;)

Sergej
525 Tage zuvor | #18 solar22

Das kann natürlich sein, das der Virenscanner Alarm geschlagen hat…

solar22
525 Tage zuvor | #19 Sergej Müller

Genau, wir brauchen einen Virenscanner für WordPress ;)

Sergej
525 Tage zuvor | #20 solar22

Das wär’s doch :o)
Wäre aber ne gute Sache, einen AVScanner für Webapplikationen…

solar22
525 Tage zuvor | #21 Nick

Also ich denke mit einem Antivirusprogramm für WordPress kann man viel Geld verdienen..was sich automatisch updatet :)

Sergej….für den Vorschlag will ich eine lebenslange Lizenz dafür haben ;)

Grüße

Nick
525 Tage zuvor | #22 Sergej Müller

@Nick
Aber das hatte ich doch gestern solar22 vorgeschlagen ;)

Sergej
525 Tage zuvor | #23 Julian

Das beste Passwort bringt auch nichts, wenn man FTP und nicht FTPS (FTP in verschlüsselt) oder SFTP (über SSH) benutzt, weil das Passwort sonst eh unverschlüsselt durch das halbe Internet übertragen wird.

Julian
525 Tage zuvor | #24 Sergej Müller

@Julian
Gebe dir generell Recht, macht aber der Hoster nicht immer mit. Meiner zum Beispiel stellt auch kein SFTP zur Verfügung. Daher bin ich auch doppelt so vorsichtig und lasse meine Passwörter einmal im Monat neu generieren. Aufwändig, dafür aber nachhaltig sicherer.

Sergej
525 Tage zuvor | #25 Sergej Müller

FYI:
Der Artikel wurde um die Listen “Warum sind die Funktionsaufrufe eigentlich kodiert?” und “Weshalb wurde ein Template und keine Core-Datei infiziert?” vervollständigt.

Sergej
524 Tage zuvor | #26 secco

Interessante Analyse, jedoch fehlen mir folgende wichtigen Infos:

1. Welche WP Version war betroffen?
2. Liegen Informationen zu Grunde, wie der Hacker in das Blog kam?

Übrigens kann man solche Hacker-initiierten Skriptänderungen sehr schön mit dem Plugin File Hash Trace verfolgen.

secco
524 Tage zuvor | #27 Sergej Müller

@secco

  • WordPress 2.7 war installiert (hab den Artikel um den Hinweis erweitert).
  • Wie ins Blog kam? Der Bot hat die Templatedatei per FTP infiziert. Oder was meinst du?
Sergej
524 Tage zuvor | #28 Nirak

Wurde der Wurm bei WordPress.org oder WP.com gesichtet, oder trifft er beide? Ich “twitter” den Artikel auf jeden Fall mal. Danke und Liebe Grüße

Nirak
523 Tage zuvor | #29 Sergej Müller

@Nirak
Es sind nur eigengehostete Blogs betroffen.

Sergej
523 Tage zuvor | #30 Peter

Wie haben zwar noch keinen aktiven Befall, werden aber sofort alle Vorsichtsmaßnahmen ergreifen.

Für uns sind aber im Moment auch die Massen von “Pharma-Referenten” lästig, die unseren Blog mit Trackbacks plagen und sich immer wieder als User in unserem Blog http://www.stuttgart-aktiv.de anmelden.

Peter
523 Tage zuvor | #31 Sergej Müller

Peter, gegen Spam via Trackback kann ich dir mein Antispam-Plugin Antispam Bee empfehlen. Das mit der Registrierung ist so eine Sache, eine Abschaltung kommt in eurem Fall wohl nicht in Frage, gell?

Sergej
521 Tage zuvor | #32 SEO-Handbuch

Hallo Sergej, klasse Sache dein Tool :) Weiter so!

SEO-Handbuch
501 Tage zuvor | #33 Binary

Wegen Idee Virenscanner:
Ich kenn mich nicht genug mit WP aus, um Plugins zu schreiben. Aber als Gegenmaßnahme würde sich IMHO anbieten, über ein PlugIn bei einem Seitenaufruf die (aktuellen) Templatedateien zu hashen. Stimmt der Hashwert nicht mehr mit dem vorherigen überein, so wird eine Mail an den Admin verschickt…
Alternativ: Dateigröße – Die Datei muss ja bei gleicher Funktionalität größer werden.
Evtl. mit Begrenzung, dass dieser Check nur alle x Aufrufe, oder erst x Minuten nach dem letzten Check wieder läuft um das ganze performanter zu machen.
Nur: Wenn sich das Template ändert, muss natürlich ein neuer Vergleichswert in die DB – und das darf nicht so einfach durch den Virus erledigt werden können.

Binary
501 Tage zuvor | #34 Sergej Müller

@Binary
Ja, gar nicht so schlecht die Idee, jedoch müsste man das Plugin bei jeder gewollten Änderung der Templates aufrufen, um Bescheid zu geben, dass die getätigte Anpassung beabsichtlicher Natur war. Wenn man viel am Anpassen und Experimentieren ist, kann es schon nervig werden. Auch viele Plugins verlangen manuelle Eingriffe in die Templates, um dort die Funktionsaufrufe zu positionieren….

Da finde ich meine Technik doch schon pflegeleichter.

Sergej
489 Tage zuvor | #35 Experimentator

Hochinteressante Angelegenheit.
Prinzipiell besteht die Gefahr ja neben dem Knacken des FTP-Zugangs grundsätzlich auch in frei verfügbaren verseuchten Themes, die vom Benutzer selbst aus freiem Willen hochgeladen werden. Dürfte sich dann wohl in jedem Fall empfehlen, fremde Themes vorher nochmals (mit den AntiVirus-Plugin) zu checken. Gäbe es evtl. eine Möglichkeit das mit dem AntiVirus-Plugin vielleicht sogar schon zu machen, bevor das Theme als Standard aktiviert wird?

Experimentator
488 Tage zuvor | #36 Sergej Müller

@Experimentator
AntiVirus für WordPress scannt nur das aktuell aktive Theme durch – wenn man ein frisches Theme herunter geladen und im Backend aktiviert hat, spricht nichts dagegen das AntiVirus-Plugin gleich drüber laufen zu lassen.

Sergej

16 Verlinkungen auf den Artikel

› wemaflo.net » Schädling in Wordpress setzt Links in der B [...]

› Passwörter: Zeit zum Umdenken « Nicht spurlos

› bitbanausen » WordPress Wurm

› AntiVirus für WordPress installiert » Pottblog

› Viren in Wordpress? » blumenstrasse

› WordPress sicherer machen mit AntiVirus für WordPress - Code, T [...]

› AntiVirus Plugin für Wordpress | diro sports

› Wordpress Antivirus Plugin | Adrian Sauer

› Wordpress Wurm? | erfolgreich-bloggen.de

› Wurm greift WordPress an | Oberlehrer

› WordPress Top 50 » 1. Anti-Virus-Plugin für WordPress » Von R [...]

› Antivirus-Plugin für WordPress - WordPress-Wurm, Blogroll, Spam [...]

› AntiVirus-Plugin für WordPress | Schuschels Senf

› Kredit-Krise, WordPress-Virus, Zukunft 2019 und mehr > Allgem [...]

› der-Fechis-Blog » Ist Euer Blog sicher? Blog-Wurm aktiv!

› Das richtige Passwort - In letzter Zeit war viel die Rede über [...]

Kommentar verfassen