Es gibt einen Ratschlag, den auch wir regelmässig geben: Halten Sie Ihre Erweiterungen aktuell. Er ist richtig. Dieser Fall zeigt, wo er aufhört zu genügen.
Mitte Juni wurden rund 1,2 Millionen WordPress-Websites mit Schadcode beliefert. Betroffen waren drei weit verbreitete Plugins desselben Herstellers: OptinMonster, TrustPulse und PushEngage. In keinem der drei steckte eine Sicherheitslücke.
Der Weg hinein führte über einen Server, der als unwichtig galt
Die Angreifer nahmen sich nicht die Plugins vor, sondern den Hersteller. Auf einem seiner Webserver — einem reinen Marketing-Auftritt — lief eine bekannte, nicht geschlossene Lücke im Plugin UpdraftPlus. Darüber kamen sie hinein.
Dieser Server war ausdrücklich nicht mit der Produktionsumgebung verbunden. Er enthielt keine Kundendaten. Aus Sicht des Betreibers war er unwichtig.
Er enthielt allerdings die Zugangsdaten zum Auslieferungsnetz des Unternehmens, dem CDN. Und über dieses Netz bekommen alle Kundenseiten ihre JavaScript-Dateien.
Das ist der Lehrsatz dieses Falls: «Unwichtiger Server» ist keine Eigenschaft eines Servers, sondern eine Annahme über ihn. Was auf ihm gespeichert ist, entscheidet — nicht, wofür er gedacht war.
Was dann passierte
Mit dem gestohlenen Schlüssel veränderten die Angreifer die JavaScript-Dateien, die das CDN an die Websites ausliefert. Wer eines der drei Plugins einsetzte, holte sich den Schadcode bei jedem Seitenaufruf ab — automatisch, ohne etwas installiert oder verpasst zu haben.
Der Code tat zunächst nichts. Er wartete auf einen angemeldeten Administrator. Sobald einer die Seite aufrief, nutzte er dessen laufende Sitzung, legte ein zusätzliches Administratorkonto an und installierte ein Plugin, das sich anschliessend vor der Übersicht versteckt. Die neuen Zugangsdaten gingen an einen Server der Angreifer — unter der Adresse `tidio.cc`, einer Nachahmung des echten Dienstes `tidio.com`.
Der zeitliche Ablauf zeigt, wie lange so etwas vorbereitet wird:
- 28. April: Die Angreifer registrieren ihre Domain.
- 12. Juni, 22:17 Uhr: OptinMonster und TrustPulse liefern Schadcode aus. Das Fenster ist nur 25 Minuten breit.
- 13. Juni: PushEngage liefert bis zum Abend weiter aus.
- 13. Juni, 13:28 Uhr: Die Sicherheitsfirma Sansec veröffentlicht ihre Warnung.
- 15. Juni: Der Hersteller bestätigt den Vorfall.
Von der Vorbereitung bis zum Angriff vergingen sechs Wochen. Der Angriff selbst dauerte Minuten.
Warum das jetzt noch zählt
Der Vorfall liegt zweieinhalb Monate zurück, und die Auslieferung wurde binnen Stunden gestoppt. Trotzdem gehört er nicht in die Ablage — aus einem Grund: Das nachinstallierte Plugin versteckt sich.
Es taucht in der Plugin-Übersicht nicht auf. Wer im Juni betroffen war und seither nur dort nachgesehen hat, hat nichts gefunden und weiss deshalb bis heute nicht, ob seine Website sauber ist. Ein zusätzliches Administratorkonto und eine funktionierende Hintertür können seit Wochen bestehen, ohne dass irgendetwas auffällt.
Woran Sie es erkennen
Wenn Sie eines der drei Plugins einsetzen oder im Juni eingesetzt haben, prüfen Sie zwei Dinge.
Erstens die Benutzerkonten. Unter *Benutzer* in der WordPress-Verwaltung: Steht dort ein Konto namens `developer_api1` oder eines nach dem Muster `dev_` gefolgt von sechs Zeichen? Beides sind dokumentierte Merkmale dieses Angriffs. Prüfen Sie generell, ob jedes Konto mit Administratorrechten zu einem Menschen gehört, den Sie kennen.
Zweitens das Dateisystem, nicht die Plugin-Liste. Weil sich die Hintertür vor der Übersicht versteckt, müssen Sie im Verzeichnis `wp-content/plugins/` nachsehen — über den Dateimanager Ihres Hostings oder per Zugang zum Server. Gesucht sind zwei Namen, die harmlos klingen sollen:
- «Content Delivery Helper»
- «Database Optimizer»
Beide sind erfunden. Ein Ordner, der in der Verwaltung nicht als Plugin auftaucht, aber im Dateisystem liegt, ist immer erklärungsbedürftig.
Was daraus folgt — über diesen Fall hinaus
Bleiben Sie nicht dauerhaft als Administrator angemeldet. Der Angriff brauchte eine offene Sitzung. Wer sich zum Arbeiten anmeldet und danach abmeldet, verkleinert dieses Zeitfenster erheblich. Das kostet nichts ausser einem Klick.
Fragen Sie bei Erweiterungen, woher deren Code kommt. Ein Plugin, das Dateien von einem fremden Server nachlädt, verlagert einen Teil Ihrer Sicherheit dorthin. Das kann sinnvoll sein — man sollte es nur wissen.
Und rechnen Sie damit, dass auch der Hersteller getroffen werden kann. Dieselbe Bauart hatten wir im August schon einmal, damals bei einem Angriff über npm-Pakete. Der Weg ist derselbe: nicht die Tür, die Sie abschliessen, sondern die Lieferung, die Sie hereinlassen.
Aktualisieren bleibt richtig. Es ist nur nicht alles.