Posted on Schreib einen Kommentar

Schutz vor der load-(scripts|styles).php-DoS-Attacke (CVE-2018-6389)

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 );

Zugriff verweigern

Dennoch kann man nun die load-scripts.php und load-styles.phpnach 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>

nginx

Unter nginx muss die vHost-Konfigurationsdatei um folgende Zeilen erweitert werden:

location ~ \/wp-admin\/load\-(scripts|styles)\.php {
	deny all;
}

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. 💥

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.