Jetzt könnte ich zwei Wochen Urlaub gebrauchen, aber den werde ich nicht bekommen. Dabei habe ich gerade einen harten Angriff auf die Webseite des Ohrfunks mit abgewehrt, einen Angriff, wie ich ihn noch nicht erlebt hatte.
Seit mitte April hat der Ohrfunk eine neue Seite. Sie wurde von der Agentur Medienzauber aufgesetzt, die für viele soziale Projekte arbeitet, und basiert auf WordPress. WordPress war mir wichtig, weil ich damit besser arbeiten konnte als mit Drupal, das wir vorher nutzten. Außerdem habe ich meinen Chef auch mit dem Spruch überredet: Mit WordPress kenne ich mich aus, und alles ist kinderleicht. Ich musste leider feststellen, dass das zwar auf die meisten Dinge zutrifft, aber einiges ist auch schwieriger geworden. So war es zum Beispiel unter Drupal kein Problem, eine Sendung bestimmten Teammitgliedern zuzuordnen, also auf der Seite des Teammitglieds die Sendungen, die es moderiert, aufzuzeigen, und auf der Sendungsseite die Seiten der Teammitglieder zu verlinken, die die Sendung moderierten. Es gab zwar für all dies in WordPress Plugins, aber nicht alle waren barrierefrei. Also haben die Medienzauberer nicht nur für den Ohrfunk ein eigenes Theme mit Barrierefreiheitsfunktionen entworfen, sondern auch am Plugin für das Team herumgeschraubt, damit ich es bedienen konnte. Das Plugin, das wir verwendeten, hieß „Ultimate Member“.
So weit, so gut. Normalerweise halte ich meine WordPress-Installationen immer auf dem neuesten Stand, damit Sicherheitslücken früh geschlossen werden können. Das war mir bei Ultimate Member nicht möglich. Weil das Plugin speziell für uns überarbeitet worden war, Wir wussten, dass wir so schnell wie möglich daran arbeiten mussten, aber es dauerte eben doch ein wenig zu lang. Anfang August wurden die WordPress-Installationen, die Ultimate Member verwendeten, Opfer eines Angriffs, der eine Sicherheitslücke im Plugin ausnutzte.
Um den 15. September fiel mir erstmals auf, dass irgend etwas mit der Ohrfunkseite nicht stimmen konnte. Ich gab die Ohrfunkadresse ein und landete auf einer Einkaufsseite mit Werbung. Ich dachte, ich hätte mich vertippt, gab die Adresse noch einmal ein, und alles war in Ordnung. Einige Tage dachte ich mir nichts dabei, bis wir von einer Hörerin darauf aufmerksam gemacht wurden, dass diese Weiterleitung fast immer geschah, und dass es immer unterschiedliche Seiten waren. Dabei waren die Ergebnisse verschiedener Tests immer uneindeutig: Mal wurde ich weitergeleitet, dann aber lange nicht mehr, während mein Chef fast immer weitergeleitet wurde, auch unterschiedliche Browser verhielten sich unterschiedlich. Zunächst versuchte ich es mit Plugin-Updates, weil ich hoffte, damit werde ein Fehler behoben, aber das funktionierte nicht. Dann schaute ich nach, ob irgendwelche Dateien in letzter Zeit verändert worden waren, doch auch das war nicht der Fall. Die letzten Änderungen waren Anfang August erfolgt, das war für mich die Zeit, in der WordPress ein Update vorgenommen hatte. Wie ich heute weiß, hätte ich dem mehr aufmerksamkeit schenken müssen. Jedenfalls fand ich nichts und musste mich an unsere Agentur Medienzauber wenden. Dort fand man schädlichen Code auf der Startseite, ein Javascript wurde ausgeführt, das die Weiterleitung vornahm. Wir hatten zu diesem Zeitpunkt keine Ahnung wo es her kam, aber es wurde entfernt, und von der Startseite aus fand keine Weiterleitung mehr statt.
Am Abend des 20. September klickte ein Hörer auf den Link zum Stream und wurde plötzlich wieder weitergeleitet. Das war ein Schock für mich, also setzte ich mich hin und suchte mehrere Stunden nach der Ursache. Wieder durchforstete ich Dateien, vertiefte mich in ihre gegenseitige Verknüpfung, soweit ich sie verstand. Ich kann PHP nur begrenzt begreifen. Bei den wichtigen Dateien der WordPress-Installation fand ich nichts und ging nachts um drei todmüde ins Bett, nachdem ich Medienzauber per Mail um Hilfe gebeten hatte.
Für den Ohrfunk ist es wirklich nicht leicht, ein solches Problem zu lösen. Wir sind ein kleiner Verein mit sehr wenigen Mitgliedern, und wenn wir eine Web-Agentur um Hilfe bitten müssen, kommt uns das ganz schön teuer, so entgegenkommend und billig man auch für uns gern ist. Wir mussten die Arbeit der Medienzauberer also so gut es ging beschränken, aber trotzdem unsere gemeinsame Aufgabe lösen.
Am nächsten Morgen stellten unsere IT-Experten fest, dass in jedem Beitrag und in jeder Seite der Schadcode enthalten war, es waren zwei Javascripte dort zu finden. Dazu muss man wissen, dass die eigentlichen Texte der Seite nicht in Dateien stehen, sondern in einer Datenbank. Die Texte werden vom Programmcode in den Dateien aufgerufen und dargestellt. Früher, als man noch HTML-Seiten schrieb, waren sie nichts anderes als der lesbare Text mit ein paar Zusatzbefehlen und Verweisen oder Darstellungsanweisungen. Heute stehen die eigentlichen Texte in einer Datenbank, die selbst dann noch okay ist, wenn die Dateien kaputt gehen sollten. Und in diese Datenbankbeiträge waren nun die schädlichen Javascript-Codes eingefügt worden. Alle Einträge von hand zu entfernen hätte sehr lange gedauert, also fragte mich mein Betreuer bei Medienzauber, ob ich es nicht selbst per Datenbanktool probieren wolle. Ich hatte das noch nie gemacht, entschloss mich aber, ins kalte Wasser zu springen. Er gab mir die Code-Schnipsel, nach denen ich suchen sollte, und ich machte mich an die Arbeit. Ich rief php-my-admin auf, öffnete die Datenbank und suchte nach dem Schadcode. Schließlich erhielt ich 55 Treffer. Daneben fand ich den Link „Löschen“. Ich dachte mir, dass das ja besonders einfach war und betätigte den Löschbefehl. Und plötzlich, oh Wunder, war unsere gesamte Seite leer. Es gab keine Beiträge mehr. Der Löschbefehl war dazu da, um alle Beiträge, die die gesuchte Zeichenkette enthielten, vollständig zu löschen. Ich hatte mit einem Schlag unsere Seite zerstört.
Es war dann am Ende nicht ganz so schlimm, weil es eine Sicherungskopie gab, die drei Tage alt war. Da ich seither an der Datenbank nichts verändert hatte, konnten wir diese Version wieder einspielen. Allerdings musste ich die Medienzauberer bitten, die Datenbank zu reinigen, was sie dann auch taten. Danach wurde niemand mehr weitergeleitet, die Probleme schienen behoben. Abends empfahl mir einer unserer Redakteure, der auch mit WordPress arbeitet, ich solle doch ein oder zwei Sicherheits- und Malware-Abwehr-Plugins installieren. Er schlug mir unter Anderem Sucuri vor, das alle Geschehnisse auf dem Server kontrolliert, sofort warnt, wenn eine Attacke von Außen stattfindet, und das einige Sicherheitseinstellungen besitzt. Ich sah es mir an, es war gut bedienbar, also installierte ich es.
Das war schon alles recht aufregend und intensiv gewesen, und während der Arbeit an der Webseite musste ich einige Tätigkeiten, die ich normalerweise für den Ohrfunk erledigte, verschieben. Zum Beispiel die herausgabe des wöchentlichen Newsletters, der immer auf die neuesten Einträge auf unserer Seite verweist. Am Freitagnachmittag war ich endlich der Meinung, alles überstanden zu haben und ging ins Wochenende.
Meine Euphorie und Erleichterung hielt genau bis 2 Minuten vor 22 Uhr am Sonntagabend. Bevor meine wöchentliche Sendung Candlelight begann, meldete sich ein Hörer, der den Ohrfunk hören wollte und erneut auf eine andere Seite weitergeleitet wurde. Das war ein echter Schock, denn ich dachte ja, wir hätten alles Menschen mögliche getan, um das Problem tatsächlich aus der Welt zu schaffen. Ich hatte auch keine Idee mehr, wo ich noch nach Fehlern suchen sollte. Während die Sendung lief, schaute ich nach den Aufzeichnungen des Sicherheitstools und stellte fest, dass einige Dateien modifiziert worden waren. Sucuri bot mir an, sämtliche WordPress-Dateien noch einmal herunterzuladen und die beschädigten oder Kompromittierten zu ersetzen. Das war eine tolle Sache, so konnte ich sicher sein, dass das Kernsystem von WordPress in Ordnung war. Das galt aber nicht für die Dateien der Plugins, auch nicht für von Plugins angelegte Scripte und einige Dateien, die von WordPress selbst angelegt wurden und benötigte Informationen für den laufenden Betrieb enthielten. Als das Kernsystem wieder sicher war, wurde ich selbst nicht weitergeleitet, andere aber schon. Das Sicherheitsplugin zählte mir einige Javascript-Dateien auf, die noch beschädigt waren. Da ich selbst kein Javascript kann, konnte ich nicht feststellen, was zu WordPress gehörte und was nicht. Aber ich recherchierte endlich einmal gründlich, ob das Plugin, das ich nicht updaten konnte, in letzter Zeit Angriffspunkt einer Attacke geworden war, und es stellte sich heraus, dass dem tatsächlich so war. Ultimate Member war Anfang August massenhaft verseucht worden.
Ich hatte eine kurze Nacht. Um 2 Uhr gab ich auf, um 5 klingelte mein Wecker. nachdem meine Liebste zur Arbeit gefahren war, setzte ich mich wieder an den Rechner und benachrichtigte die Medienzauberer. Mein Lieblingsfeind war nun Ultimate Member. Das Plugin Sucuri hatte mir nämlich versichert, dass es keine Einbruchsversuche gegeben habe, keine Versuche, ein Passwort zu raten oder herauszufinden, um sich bei uns einloggen zu können. Unsere Agentur sah das auch so, das Plugin wurde deaktiviert und gelöscht. Damit verloren wir zwar unsere Teamseite, aber der Inhalt der Seite war wenigstens gesichert. Allerdings bestand die Weiterleitung immer noch.
Jetzt blieb uns nur noch eine tiefgreifende Lösung, denn wir standen auch unter Zeitdruck. Hörerinnen und Hörer waren mehrfach weitergeleitet worden, irgendwann würde unsere Seite als unsicher markiert werden und in Suchmaschinen mit Warnhinweisen auftauchen, und Facebook hatte schon gesperrt, dass man auf die Seite verlinken konnte. Was also war zu tun? Der Angriff auf das Plugin ultimate Member war Anfang August erfolgt. Wir hatten eine Sicherung vom 1. August. Es wäre also möglich gewesen, die Seite auf den Stand vom 1. August zurückzusetzen. Allerdings mussten wir nach den ersten Vorbereitungen feststellen, dass wir von diesem zeitpunkt keine Datenbanksicherung hatten. Die letzte Datenbanksicherung stammte vom 7. Mai. Die Frage war nun, ob alle Texte, die danach noch auf die Seite gestellt wurden, noch in Kopie vorhanden waren. Am Ende verfielen wir aber darauf, an dieser Stelle die Datenbank zu sichern und die Texte wieder einzuspielen. Denn nach der Bereinigung der Datenbank war dort kein Schadcode mehr.
Seit dem 7. Mai war einiges auf unserer Seite geschehen: Die DSGVO war in Kraft getreten, einige Änderungen am Programm waren vorgenommen worden, wir hatten unseren Newsletter eingerichtet. All das mussten wir nach der Zurücksetzung wiederholen. Wir teilten uns die Arbeit auf: Die Medienzauberer kümmerten sich um die Plugins und den Newsletter, ich machte mich daran, die inhaltliche Wiederherstellung zu bewerkstelligen.
Nach einem sehr langen Tag wussten wir gegen 18 Uhr, dass alles lief, und dass es keine Weiterleitungen mehr gab. In diesem Bericht habe ich die Dramatik weitgehend außenvor gelassen, die es immer wieder gab, gerade während des Montags. Wir standen zweimal an dem Punkt, die gesamte Seite neu aufsetzen zu müssen. Das hätte der Ohrfunk sich finanziell überhaupt nicht leisten können. Ich bin sehr froh, dass wir andere Lösungen fanden, auch wenn diese sehr arbeitsintensiv waren.
Zwei Dinge sind jetzt noch nicht zufriedenstellend geregelt. Erstens weiß ich immer noch nicht, welche Datei wann gehackt worden war und von wo aus die Verseuchung der Seite ausging. Das werden wir auch nicht mehr herausfinden können. Wir hatten im Laufe unserer Arbeit nahezu alle wichtigen Dateien ausgetauscht, andere Bearbeitet und von Schadcode gesäubert. Trotzdem haben wir den Bösewicht nicht gefunden, auch nicht unser Sicherheitsplugin, aber vermutlich deshalb, weil es erst während der Krise installiert wurde. Zweitens haben wir jetzt für eine Weile keine Teamseite, und wir wissen auch noch nicht, wie wir kostengünstig eine neue bekommen sollen. Entweder wir vertrauen dem Plugin in seiner neueren, offiziell sichereren Fassung noch einmal, dann hätten wir aber beim nächsten Update dasselbe Problem, oder wir bauen ein neues auf. Vielleicht können wir die Teamseite auch ganz klassisch als Kategorie mit einer Kategorieseite und einem Beitrag für jedes Teammitglied organisieren. Dann fehlt leider die Auflistung der Moderatoren auf der Sendungsseite. Doch vielleicht wäre das gar nicht so problematisch. Es sieht ohnehin so aus, dass die Besucher zwar aufs Programm schauen, aber fast nie auf Seiten von Teammitgliedern oder Sendungen. Und auf die Seite des entsprechenden Teammitgliedes ließen sich die Sendungen ja schreiben. Wie wir es letztlich machen, weiß ich noch nicht. Erst einmal bin ich ziemlich erschöpft und erleichtert, dass wir es geschafft haben. Die meiste Arbeit hat die Mitarbeiterin von Medienzauber geleistet, ich habe mir zum Teil Arbeit gemacht, und ich musste die Seite halt wieder auf den jetzigen Stand bringen.
Ich hoffe wirklich, dass diese Sache endgültig überstanden ist.
Von Plugins, die seit mehreren Monaten keine Updates hatten, lasse ich grundsätzlich die Finger. Ebenso von Plugins, hinter der keine „echte“ Firma steht. Es wird leider eine Menge für WordPress programmiert, was nicht sicher ist und man denkt, dass die Erfahrungen in der Softwareentwicklung seit 20 Jahren an einigen Leuten vorbeigegangen sind. Ich betreue insgesamt vier WordPress-Sites, davon zwei beruflich. Bisher hatte ich solche Probleme nicht, aber ich bin auch sehr restriktiv, was Plugins angeht. Habe jedoch den Vorteil, dass ich selbst aus der Softwareentwicklung komme und so Einiges selbst machen kann.
Grüße,
Rainer
@Rainer: Das Plugin ist ja professionell entwickelt und hatte ein Update. Nur wir konnten es nicht einspielen, weil das Plugin für uns wegen der Barrierefreiheit verändert worden war. Das hatte die Agentur extra gemacht, um es für uns nutzbar zu machen, aber jedes Update erfordert eben neue Arbeit an einem solchen Plugin, das geht dann in die Tausende.