Am 18. Februar wurde mein Wiki Tooltip Plugin leider aus dem WordPress Repository entfernt. Grund war eine Sicherheitslücke. Ich brauchte knapp 6 Monate, um das Problem zu lösen. Das WordPress Plugins Team nicht einmal zwei Tage, um mir die neuerliche Freigabe zu erteilen!
Was war passiert?
Bereits Ende Januar hatte ein Entwickler des Teams von Wordfence Kontakt mit mir auf, weil sie angeblich keine Sicherheitslücke in meinem Plugin gefunden hätten. Ich ignorierte die Meldung erst einmal gekonnt, weil einfach mal wieder keine Zeit für die privaten Hobbies war und ich zugegebenermaßen die Lücke nicht als solche anerkannte. Das mein Plugin allerdings zu einer Meldung von Wordfence führte, machte mich schon irgendwie stolz 😉
Leider führte meine Nicht-Reaktion aber zum Ausschluss auf dem WordPress Plugin Verzeichnis! Mitte Februar erhielt ich eine Nachricht vom Plugins Team, dass sie das Plugin aus dem Repro nehmen. Das steigerte meinen Willen der Behebung natürlich ungemein, doch die verfügbare Zeit wuchs irgendwie nicht linear mit.
Das Problem im Detail
Der genaue Wortlaut der Meldung lautete:
The WP Wiki Tooltip plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the plugin’s ‚wiki‘ shortcode in all versions up to, and including, 2.0.2 due to insufficient input sanitization and output escaping on user supplied attributes. This makes it possible for authenticated attackers, with contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.
Begründung des WordPress Plugin Review Team zur Sperrung meines Plugins
Übersetz heißt das, dass ein Angreifer, der am WordPress CMS angemeldet ist und mindestens „Contributor“-Level besitzt, die Möglichkeit hat, schädlichen JavaScript über den Shortcode des Plugins auf einer Seite einzuschleusen!
Leider war die Meldung vollkommen richtig, auch wenn man trefflich darüber diskutieren könnte, ob der Fehler nicht an einer anderen Stelle liegt, wenn ein solcher User so etwas tut!? Aber was soll’s, das hätte mein aktuelles Problem nicht gelöst.
Die Lösung
Wie so oft ist die Lösung recht trivial, wenn man sich doch einfach einmal die Zeit dafür nimm 😎 WordPress stellt für die Bereinigung von und den Schutz vor Benutzereingaben ein reiches Set an Funktionen bereit. Unter den Stichworten „Sanitization“, „Validation“ und „Escaping“ findet man auf den offiziellen Entwicklungsseiten zahlreiche Tipps und Best-Practices, wie man Probleme wie das meinige Lösen kann.
Und wenn ich schon einmal dabei war, erinnerte ich mich an eine Nachricht von Bernhard, die er mir kurz nach Veröffentlich der ersten Version meines Plugins geschrieben hatte. Ihm war beim Check des Quellcodes aufgefallen, dass es mehr als 100 Warnungen gab. Eine Prüfung mit dem „Plugin Check“ Plugin ergab, dass es immer noch Warnungen in etwa diesem Umfang gab. Also nahm ich mir auch noch das Thema „Nonces“ vor, lernte wieder einmal eine neue Sicht auf die Security-Dinge und konnte die Liste der Meldungen auf sage und schreibe drei (!!!) Warnungen senken 😀
Da es sich bei diesen letzten drei um Trademark Warnungen aufgrund des Namens mit dem enthaltenen „WP“ handelt, kann ich damit nun aber gut leben.
Am Samstagabend konnte ich die neue Version ins Repro hochladen und nur 48 Stunden später ist es wieder online. Was ein toller Support vom Review Team!
Mein Fazit
Was habe ich nun aus diesem Vorfall gelernt? Eine ganze Menge:
- Meldungen von den vielen fleißigen Helfern in der WordPress Community sollte man sofort Ernst nehmen! Wenn ich den Statistiken glauben kann, hat die Sperrung rund 400 aktive Installationen gekostet. Ich hoffe – glaube es aber kaum – dass sie irgendwann wieder zurückkommen!
- Die Robustheit eines jeden Plugins ist ein wesentlicher Baustein für die Stabilität des Gesamtsystems! Natürlich müssen wir Pluginentwickelnden diese Verantwortung sehr Ernst nehmen und ihr eine entsprechende Priorität einräumen. Ich für meinen Teil werden beim nächsten Mal (das es hoffentlich nicht geben wird) auf jeden Fall schneller reagieren!
- Und ganz nebenbei konnte ich das JavaScript für mein Gutenberg Addon verbessern, die Übersetzung optimieren, habe meine lokale Entwicklungsumgebung auf PHP 8 aktualisiert und die eine oder andere Optimierung für meine Dev-Pipeline gefunden.
Was will ich also mehr? Euch allen viel Spaß mit der neuen Version!