Direkt zum Inhalt
11.04.2012 - Fachbeitrag

Drupal-Hack zerstört MySQL-Replikation

Seit einiger Zeit wird die Drupal Community von einer leichten Unruhe geplagt - das weit verbreitete Content Management System steht im Visier der Script-Kiddies. Das besonders bemerkenswerte jedoch ist, dass die durch den Hack angelegten Drupal-Accounts tatsächlich eine Replikation zwischen zwei MySQL-Servern stoppen und zerstören können. Nicht nur Drupal hat hier also ein Problem -- auch MySQL.

Drupal-Accounts "veneamin1984" und "hisopolko166"

Überall auf der Welt werden Benutzerregistrierungen für die Benutzernamen "veneamin1984" und "hisopolko166" verzeichnet [1]. Eine Suche auf Google nach einem der Benutzernamen listet unzählige Profile von den verschiedensten Drupal Webseiten auf [2][3], selbst wenn überhaupt keine offensichtliche Möglichkeit der Registrierung im Frontend angeboten wird. Die Löschung der Benutzerprofile im eigenen Drupal CMS führt nur zeitweise zum gewünschten Ergebnis, denn bereits nach wenigen Stunden sind die Profile wieder in der Datenbank zu finden. Die Drupal Community ist ratlos und auch der Drupal IRC Kanal antwortet auf dieses Thema nur mit ratlosem Schweigen. Ein unerklärlich wiederkehrender Fehler in der MySQL Replikation unserer Shared-Hosting Infrastruktur lenkte unsere Aufmerksamkeit erstmals am 2. April 2012 auf das Phänomen. Ein Blick auf den Status des Slaves offenbarte einen "Duplicate Entry" Fehler:

Auszug der Ausgabe von:
mysql -Bse "SHOW SLAVE STATUS\G"
Last_Error: Error 'Duplicate entry '103' for key 1' on query.
Default database: 'drupal-7.12_database'.
Query: 'INSERT INTO users (name, mail, timezone, pass, init,
status, created) VALUES ('veneamin1984', 'veneamin1984@mail.ru',
7200, 'ddd640856db2fb81aa35554521b9352d', 'veneamin1984@mail.ru',
1, 1333270067)'

Bei dem Verursacher handelt es sich um einen Datensatz für ein Benutzerprofil innerhalb einer Drupal Kundendatenbank - der Name des Benutzers lautet "veneamin1984".

Und die MySQL-Replikation stirbt

Unsere ersten Recherchen führten uns zu einer Diskussion auf Drupal.org, wo sich bereits andere Drupal Betreiber über die seltsamen Benutzerprofile erkundigten. Der allgemeine Konsens lautet, dass offenbar ein Crawler-Script weltweit auf allen gefundenen Drupal Webseiten fadenscheinige Benutzerprofile registriert. Unklar ist, ob es sich hierbei um Angriffe unter Ausnutzung eines Exploits handelt oder um schlichten Spam. Es werden scheinbar keine weiteren Manipulationen an der Datenbank durchgeführt, nachdem das Profil registriert wurde, allerdings sehen die MySQL Binary Logs von der Registrierung selbst bei genauerem Hinsehen verdächtig aus und lassen auf eine SQL-Injection schliessen. Wer selbst von diesem Phänomen betroffen ist kann sich in seinen Logs ganz einfach einen eigenen Eindruck verschaffen:

# mysqlbinlog -d <database> /pfad/zu/mysql/binlogs | grep "veneamin1984

Unsere Entwickler beschäftigen sich bereits mit den ausgeführten SQL-Queries und überprüfen eine Verbindung zu CVE-2007-6752. Unklar war (und ist es auch noch) warum das SQL auf dem MySQL-Master ausgeführt wird, auf dem MySQL-Slave jedoch zu einem "Duplicate Entry" Fehler führt und somit die Replikation zerstört. So ganz unglücklich sind wir über diesen Umstand im Nachhinein allerdings nicht, denn sonst wäre der Spuk wohl garnicht erst aufgefogen.

Hotfix:

Unser Studium über die Binary Logs brachte uns sehr schnell zu der Erkenntnis, dass alle Queries immer und auch bei bisher allen anderen Betroffenen von ein und der selben Source-IP ausgeführt wurden. Wer auch von diesem Phänomen betroffen ist und sich gerne gegen diesen Account-Spam schützen möchte, der kann sich somit ganz einfach einen vorläufigen Hotfix basteln:

# iptables -A INPUT -s 188.143.235.62 -j DROP

Das funktioniert selbstverständlich nur solange, bis unser Script-Kiddy sich entscheidet, seine Queries von einer anderen IP loszufeuern. Es bleibt bis auf Weiteres wohl nichts Anderes übrig, als regelmässig die Datenbanken nach verdächtigen Benutzerprofilen zu durchsuchen und gegebenenfalls die neue Source-IP aus den MySQL Binlogs zu grep'en und in den Netfilter-Stack zu werfen. Dank und Gruss an Oli Sennhauser von FromDual.com, dessen Unterstützung uns in allen MySQL- und Drupal-Belangen massgeblich voran gebracht hat.

Nachtrag:

Unsere MySQL Binlogs lassen auf ein (möglicherweise) weiteres Script schliessen, welches versucht Passwörter von Drupal Benutzerprofilen mit den Namen "veneamin1984" zu hacken.