Schutz vor der load-(scripts|styles).php-DoS-Attacke (CVE-2018-6389)
Veröffentlicht: – Kommentar hinterlassen Letzte Aktualisierung:
Bereits vor etwas einem Monat wurde ein möglicher DoS-Angriffsvektor (CVE-2018-6389) mit der auf WordPress-Websites bekannt, der bis heute von WordPress nicht mit notwendigen Patches versorgt wurde. Dabei nutzt man eine Funktion, die eigentlich nur unter /wp-admin/
genutzt wird. Und zwar werden dort standardmäßig zwei PHP-Dateien namens load-scripts.php
und load-styles.php
aufgerufen, mit welchen man über Parameter verschiedene JavaScript- und CSS-Dateien abrufen kann, ohne diese einzeln einzubinden.
Problematisch ist dabei, dass diese Funktion auch unter /wp-login.php
zur Verfügung steht und durch keine gesonderten Rechte geschützt ist. Da WordPress sehr viele JavaScript-Dateien bereits von Haus aus mitliefert, können diese auch alle über einen einzigen Aufruf abgerufen werden. Macht man dies nun mehrmals pro Sekunde, kann man mit verhältnismäßig wenig Aufwand viel Last auf dem Server erzeugen, was irgendwann in einem vollständigen Absturz des Webservers münden kann.
Bereits geschützt?
Jeder kann im Voraus testen, ob sein Webhoster vielleicht bereits serverseitig eine entsprechende Blockierung vorgenommen hat. Dann ist keine Handlung mehr notwendig. Andernfalls führt folgender Aufruf dazu, dass jQuery UI ausgegeben wird:https://www.domain.tld/wp-admin/load-scripts.php?c=1&load%5B%5D=jquery-ui-core&ver=4.9.1
Angriffsvektor entfernen
Es gibt mehrere Möglichkeiten, diesen Angriffsvektor zu entfernen, ich werde jedoch nur eine davon hier vorstellen. Diese hat zum Ergebnis, dass die beiden besagten Dateien load-scripts.php
und load-styles.php
nicht mehr funktionstüchtig sind. Das ist jedoch in Zeiten von HTTP/2 auch gar nicht mehr notwendig, da das einzelne Aufruf kleinerer Dateien via HTTP/2 wesentlich schneller ist als der Aufruf einer großen Datei.
wp-config.php anpassen
Als erstes müssen wir die wp-config.php anpassen. Dort müssen wir folgende Zeile hinterlegen, damit die Skript-/CSS-Dateien nicht mehr standardmäßig in eine einzelne Datei zusammengefügt und dann ausgegeben werden, sondern einzeln.
define( 'CONCATENATE_SCRIPTS', false );
Code-Sprache: PHP (php)
Zugriff verweigern
Dennoch kann man nun die load-scripts.php
und load-styles.php
nach wie vor manuell aufrufen. Um das nun ebenfalls zu verhindern, muss das serverseitig blockiert werden.
Apache2
Unter Apache2 müssen folgende Zeilen in die .htaccess im Hautverzeichnis von WordPress eingefügt werden:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule /wp-admin/load-(scripts|styles).php - [F]
</IfModule>
Code-Sprache: Apache (apache)
nginx
Unter nginx muss die vHost-Konfigurationsdatei um folgende Zeilen erweitert werden:
location ~ \/wp-admin\/load\-(scripts|styles)\.php {
deny all;
}
Code-Sprache: Nginx (nginx)
Eventuell notwendige Pfadanpassung, wenn WordPress nicht im Wurzelverzeichnis der Domain liegt, müsst ihr noch selbst vornehmen.
Damit wird überprüft, ob man die besagten Dateien aufruft und wenn ja, wird einfach ein „403 – Forbidden“-Fehler zurückgegeben. Die beiden PHP-Dateien werden also nie aufgerufen.
Fazit
Ich persönlich finde es schade, dass dieser Angriffsvektor vermutlich in WordPress bestehen bleibt, da laut der Entwickler so etwas auf Server- oder Netzwerkebene entschärft werden sollte, nicht auf Anwendungsebene. So zumindest schrieb Barak Tawily in sein Blog:
This kind of thing should really be mitigated at the server or network level rather than the application level, which is outside of WordPress’s control.
WordPress Bug Bounty Team via Barak Tawily
So muss man nun selbst aktiv werden – und man sollte das definitiv absichern, um nicht Gefahr in einen solchen DoS-Angriff zu geraten. 💥