Mautic campaign import, theme template, API ownership, and Focus SSRF boundaries¶
Signal: GitHub Security Advisories published a July 2 Mautic wave covering campaign import path traversal, theme-template SSTI, API v2 owner-scope authorization drift, and Focus component SSRF.
Advisories covered¶
| Advisory | Boundary | Fixed versions |
|---|---|---|
| GHSA-6r9h-4h75-7q4x / CVE-2026-9559 | ZIP campaign import paths escape the intended temporary extraction root and can write PHP-capable files when the user has campaign:imports:create. | mautic/core 7.1.2 |
| GHSA-9fx4-7cmj-47vg / CVE-2026-9558 | Uploaded theme Twig templates render without a sandbox or strict function restrictions, crossing from theme authoring into server-side execution. | 7.1.2, 6.0.9, 5.2.11; 4.4.20 via ELTS |
| GHSA-2jrw-c95w-h43g / CVE-2026-9808 | API Platform v2 endpoints fail to enforce owner-scoped roles such as viewown / editown, allowing access to another user's resources. | 7.1.2 |
| GHSA-jmv8-8j9j-rcpc / CVE-2026-9557 | Focus component URL handling can trigger server-originated requests to attacker-chosen destinations. | 7.1.2, 6.0.9, 5.2.11; 4.4.20 via ELTS |
Adjacent Mautic stored-XSS advisories (GHSA-5hvg-w58j-545m, GHSA-7h65-whp7-rgqf) are useful supporting context but are not the primary operator pattern here.
Why this is durable¶
Marketing automation platforms combine privileged content builders, ZIP/theme importers, URL-fetching widgets, and CRM-style owner scopes. This wave gives bug hunters a reusable checklist for import-to-filesystem, template-author-to-runtime, API owner-scope, and server-side fetch boundaries in any low-code or campaign-management product.
Safe validation workflow¶
Use only an owned lab or an explicitly authorized customer test tenant. Seed canaries; do not use web shells, real campaign assets, customer contacts, production credentials, or internal services.
1. Establish role and version preconditions¶
- Record Mautic version and branch.
- Create two disposable users:
attackerwith only the minimum permission under test.victimowning synthetic contacts, companies, reports, campaigns, and assets.- Capture the exact permission matrix: campaign import, theme create/upload, Focus component access, API credentials, and owner-scoped
viewown/editowngrants.
2. Campaign import path traversal canary¶
Evidence should prove whether archive entry names stay confined to the import temp root.
- Build a ZIP with harmless marker files only.
- Include one normal campaign export member and one traversal-looking member targeting a disposable canary path in a lab scratch directory.
- Import as the low-privilege
attackeruser withcampaign:imports:create. - Positive evidence is a marker write outside the intended extraction directory or an application log showing the unsafe destination path.
- Stop at marker files. Do not place PHP payloads in web roots, overwrite config/cache files, or attempt command execution.
3. Theme-template execution boundary¶
Evidence should show whether template authoring reaches unsandboxed Twig capabilities.
- Upload a minimal theme containing a benign Twig expression that renders a static canary value.
- If the lab permits, test only inert function/filter availability that proves sandbox absence without reading files or executing commands.
- Record the template filename, rendered canary, user permission, and fixed-version negative control.
- Do not publish or run command-execution templates, file-read probes, or environment-variable dumps.
4. API v2 owner-scope drift¶
Evidence should distinguish owner-only access from cross-owner access.
- As
victim, create synthetic contacts, companies, and reports with distinctive canary names. - As
attacker, authenticate through API v2 with a role limited toviewownoreditown. - Request or update resources by known victim IDs.
- Positive evidence is a response or mutation for a victim-owned object that the UI or legacy API correctly denies.
- Keep proof to canary objects and redacted response fields; never dump real contacts, companies, reports, or lead histories.
5. Focus component SSRF boundary¶
Evidence should prove server-side fetch behavior without touching internal networks.
- Point Focus URL fields at an owned callback host that records method, path, source IP, and headers.
- Test parser edge cases only against owned domains and loopback services inside a disposable lab.
- Positive evidence is a callback from the Mautic server or a deterministic error difference showing outbound fetch attempts.
- Do not probe metadata services, RFC1918 production ranges, localhost admin panels, or third-party internal hosts.
Report framing¶
Lead with the crossed boundary, not with generic advisory language:
- Campaign import archive member -> outside extraction root file write
- Theme author permission -> unsandboxed Twig runtime capability
- Owner-scoped API credential -> cross-owner object read/write
- Focus URL field -> server-originated callback
Strong reports include affected version, exact role grants, route or feature path, canary-only request/response evidence, before/after object ownership, callback logs for SSRF, and a fixed-version negative control.