Es gibt Dinge, die schiebt man vor sich her. Die Steuererklärung. Den Zahnarzttermin. Und die eigene Website.
basis42.de lief bis vor ein paar Tagen auf WordPress 4.9. Für alle, die nicht nachrechnen wollen: Das ist eine Version aus einer Zeit, in der man noch ernsthaft über Fidget Spinner gesprochen hat. Die Seite lief. Sie lief zuverlässig. Sie lief vor allem deshalb, weil ich sie nicht angefasst habe. Never touch a running system – das war jahrelang meine komplette Wartungsstrategie.
Dann kam der 21. Oktober
Am 21. Oktober 2026 wurden zwei kritische Lücken im PHP-Kern öffentlich, inzwischen unter dem griffigen Namen PHP2Shell bekannt (CVE-2026-109618 und CVE-2026-109619). Kurz zusammengefasst:
- Ein Angreifer braucht keinen Login.
- Ein passend gebauter Request reicht.
- Das Ganze passiert, bevor überhaupt WordPress, ein Plugin oder sonst irgendein Code von mir zum Zug kommt.
- CVSS 9.2. Also die Sorte Zahl, bei der man den Kaffee kurz abstellt.
Die PHP-Leute haben schnell Patches nachgeschoben. Was natürlich voraussetzt, dass man eine PHP-Version betreibt, für die es noch Patches gibt. Und dass die alte WordPress-Installation den Sprung auf eine aktuelle PHP-Version überlebt. Ich habe mir diese beiden Fragen gestellt und dann sehr lange aus dem Fenster geschaut.
Die Erkenntnis
Mein Blog braucht kein PHP. Er braucht kein PHP seit ungefähr zehn Jahren. Ich schreibe Texte, ab und zu kommt ein Bild dazu, fertig. Dafür lief da eine Datenbank, ein Interpreter, ein Admin-Login, ein Sack Plugins und eine Kommentarfunktion, die hauptsächlich von Bots mit Interesse an Potenzmitteln genutzt wurde.
Das ist so, als würde man für den Weg zum Briefkasten einen Bagger mieten. Und dann vergessen, den Bagger abzuschließen.
Also: Hugo
Statt also WordPress, PHP und mich selbst gleichzeitig upzugraden, habe ich die Gelegenheit genutzt und den ganzen Stack in Rente geschickt. Der neue Unterbau ist Hugo, ein Static-Site-Generator:
- Datenbank-Dump gezogen, die alten Beiträge nach Markdown konvertiert. Archäologie inklusive – manche Posts hatten HTML-Konstrukte, deren Herkunft ich lieber nicht ergründen möchte.
- Das alte Theme nachgebaut, damit sich die Seite weiterhin nach basis42 anfühlt. Ihr merkt optisch also hoffentlich: nicht viel.
- Hugo baut daraus reines HTML, und genau das liegt jetzt auf dem Server.
Kein PHP, das Requests parst. Keine Datenbank. Kein
wp-login.php, an dem sich die halbe Botnetz-Welt die Finger wund klopft.
Ich war nicht allein
Ganz ehrlich: Alleine hätte ich dafür vermutlich wieder ein paar Jahre gebraucht. Bei der Migration hat mir eine KI geholfen, konkret Claude, und zwar nicht als Textgenerator, sondern als ziemlich geduldiger Kollege am Terminal. Gemeinsam haben wir:
- die alten WordPress-Inhalte nach Markdown überführt und das Theme in Hugo nachgebaut,
- anhand des Web-Archivs herausgesucht, unter welchen URLs die alten Beiträge früher erreichbar waren, und dafür Weiterleitungen angelegt – damit alte Links nicht ins Leere laufen,
- tote externe Links auf Snapshots im Web-Archiv umgebogen,
- alten Ballast wie Amazon-Partnerlinks und Tracking-Pixel entfernt,
- Beschreibungen, Canonical-Links und Open-Graph-Daten ergänzt
- und ein kleines Deploy-Script gebaut, das die fertige Seite per FTP hochlädt – erst als Vorschau, dann auf Kommando.
Die Arbeitsteilung war dabei ziemlich klar: Die KI hat gesucht, sortiert,
gebaut und vorgeschlagen. Ich habe entschieden, was davon live geht, und
jede Änderung vor dem Upload angeschaut. Das fühlte sich weniger nach
„Maschine macht alles“ an, sondern eher nach Pair-Programming mit jemandem,
der nie müde wird und sich auch beim dritten .htaccess-Versuch nicht
beschwert.
Neue Beiträge schreibe ich jetzt als Markdown-Datei, hugo drüberlaufen
lassen, hochladen. Dieser Post hier ist übrigens der erste, der so entstanden
ist. Ihr lest gerade den Beweis, dass es funktioniert. (Oder dass ich es
zumindest einmal geschafft habe.)
Was PHP2Shell mir also gebracht hat
- Eine Website, die nicht mehr angreifbar ist durch Lücken in Software, die gar nicht mehr läuft.
- Eine Seite, die schneller lädt, weil der Server einfach nur Dateien ausliefert.
- Alle Inhalte als Textdateien, versionierbar, durchsuchbar, unkaputtbar.
- Die Erkenntnis, dass so eine Migration mit KI-Unterstützung kein Wochenendprojekt mehr ist, sondern eher ein langer Nachmittag.
- Und das gute Gefühl, eine Aufgabe erledigt zu haben, die seit Jahren auf meiner Liste stand – nur dass mich diesmal kein schlechtes Gewissen angeschoben hat, sondern ein CVE.
Manchmal braucht es eben eine globale Sicherheitslücke, damit man endlich mal aufräumt. Danke, PHP2Shell. Ich hoffe, wir sehen uns nie wieder.
PS: Falls ihr selbst noch irgendwo PHP am Netz habt – patcht. Jetzt. Die gefixten Versionen sind 8.5.12, 8.4.27, 8.3.36 und 8.2.35. Alles darunter gehört aktualisiert oder abgeschaltet. Dieser Blog ist hier, ich warte so lange.