
Unsicheres Deserialisieren in e107 CMS install.php
Gemeldet: 18. September 2025
CVE zugewiesen: 9. Oktober 2025
Veröffentlicht: 2. Februar 2026
CVE-ID: CVE-2025-61505
Entdecker: Anas Abderrahman Benbarek
Im Installationsskript (install.php) von e107 CMS Version 2.3.3 wurde eine PHP-Objekteinjektions-Schwachstelle (CWE-502: Deserialisierung nicht vertrauenswürdiger Daten) entdeckt.
Die Schwachstelle ermöglicht es nicht authentifizierten Remote-Angreifern, bösartige serialisierte Daten zu erstellen, was je nach Vorhandensein ausnutzbarer Gadget-Klassen in der e107-Codebasis oder ihren Abhängigkeiten potenziell zu beliebiger Codeausführung, Datenmanipulation oder anderen schädlichen Aktionen führen kann.
Das Problem resultiert aus der unsicheren Anwendung der PHP-Funktion unserialize() auf benutzerkontrollierte Eingaben ohne jegliche Einschränkungen (wie etwa die Option allowed_classes). Auch wenn es auf die Installationsphase beschränkt ist, stellt es während der Einrichtung auf exponierten Servern ein erhebliches Risiko dar, da das Installationsprogramm sensible Vorgänge wie das Erstellen von Datenbanken und das Schreiben von Dateien übernimmt.
install.php)Der Installationsprozess von e107 CMS ist mehrstufig. Benutzereingaben (Sprache, Datenbankzugangsdaten, Administratorendaten usw.) werden über die Schritte hinweg mithilfe eines serialisierten Arrays gespeichert, das im POST-Parameter previous_steps abgelegt wird. Diese Daten werden für die Übertragung base64-kodiert und auf dem Server dekodiert/deserialisiert.
Das Kernproblem ist die direkte Übergabe dekodierter Benutzereingaben an unserialize() ohne Validierung, Bereinigung oder Klassen-Whitelisting. Dies geschieht an zwei Stellen:
if(isset($_POST['previous_steps']))
{
$tmp = unserialize(base64_decode($_POST['previous_steps']));
$override = (isset($tmp['paths']) && isset($tmp['paths']['hash'])) ? array('site_path'=>$tmp['paths']['hash']) : array();
unset($tmp);
}
Das Skript geht davon aus, dass previous_steps vertrauenswürdige serialisierte Daten aus früheren Formularschritten enthält. Da es sich jedoch um einen einfachen POST-Parameter handelt, kann ein Angreifer ihn vollständig kontrollieren. base64_decode() wandelt die Eingabe in Binärdaten um, und unserialize() rekonstruiert daraus PHP-Objekte oder Arrays. Enthält die Eingabe Objektnotation (beginnend mit O:), instanziiert PHP diese Klassen, sofern sie im aktuellen Gültigkeitsbereich existieren oder per Autoload geladen werden. Dies kann sofort __wakeup() oder andere magische Methoden auslösen und potenziell Nebenwirkungen wie Dateischreibvorgänge oder unerwartete Datenbankaufrufe verursachen, wenn Gadget-Ketten vorhanden sind.
Hinweis zur Ausnutzbarkeit: Der Erfolg hängt von den verfügbaren Gadget-Klassen ab. Ohne diese kann sich die Auswirkung auf Abstürze oder Datenkorruption beschränken.
PHPif(isset($_POST['previous_steps'])) { $this->previous_steps = unserialize(base64_decode($_POST['previous_steps'])); // ... (filtering and password restoration logic) unset($_POST['previous_steps']); }
Diese Instanz ist gefährlicher, da die deserialisierten Daten Teil des Objektzustands ($this->previous_steps) werden und spätere Installationsaktionen (MySQL-Einrichtung, Erstellung des Administrators, Erzeugung der Konfigurationsdatei) beeinflussen. Eine Objekteinjektion an dieser Stelle kann den gesamten Installationsprozess überdauern und Operationen mit hohen Privilegien beeinträchtigen. Auch hier bedeutet das Fehlen einer allowed_classes-Einschränkung, dass jede per Autoload geladene Klasse (Core, Handler, Plugins, Bibliotheken) instanziiert werden kann.
Hinweis zur Ausnutzbarkeit: Eine Ausnutzung in der Praxis erfordert in der Regel die Verkettung mehrerer Objekte (eine „Gadget-Kette"), um gefährliches Verhalten wie Codeausführung zu erreichen. Beispielsweise könnte das __wakeup() einer Klasse eine andere Methode aufrufen, die benutzerkontrollierte Zeichenfolgen auswertet. Ohne solche Ketten könnte sich die Auswirkung auf Denial-of-Service (z. B. Ressourcenerschöpfung in Destruktoren) beschränken. Der hochprivilegierte Kontext des Installationsprogramms (Schreiben von e107_config.php, Erstellen von Verzeichnissen) verstärkt die Risiken, aber das Entfernen des Skripts nach der Installation reduziert die langfristige Gefährdung.
Die Schwachstelle ist während jeder Einrichtungsphase über nicht authentifizierte HTTP-POST-Anfragen an /install.php erreichbar.
unserialize($data, ['allowed_classes' => false]);