ZeroHour

CVE-2026-79991

large

Cross-site write bypass in Craft CMS GraphQL entry mutations

CVSS 4.0
7.1 high
EPSS
<1%p22
Published
()
Modified
AI analysis

Craft CMS's GraphQL entry mutation resolvers (saveEntry, deleteEntry) read the siteId argument directly from $arguments without routing it through ArgumentManager::prepareArguments(), the function that enforces site-scope filtering via array_intersect against the schema's allowed sites; the weakness is classified as CWE-89 by the assigning CNA. An attacker holding a GraphQL token scoped to one site can invoke these mutations with an arbitrary siteId, allowing them to create, modify, or delete entries in other sites that the token should not be able to touch. The query path is unaffected because ElementResolver::prepareElementQuery correctly calls prepareArguments(), so only mutations (not queries) are exploitable, and a valid, authenticated token is required. Craft CMS deployments with multi-site configurations and GraphQL entry mutations available to site-scoped tokens are affected. There is no known public proof-of-concept, the issue is not in CISA KEV, and EPSS estimates only a 0.3% probability of exploitation within 30 days (22nd percentile), so no exploitation is currently known.

What to do: Update Craft CMS as soon as the vendor ships a release that routes mutation siteId arguments through ArgumentManager::prepareArguments(), and check vendor advisories for the exact fixed version. As interim mitigation, restrict GraphQL tokens to the scopes they need, disable or limit saveEntry/deleteEntry mutations on publicly reachable GraphQL endpoints, and avoid issuing single-site-scoped tokens until patched. After remediation, audit content in all sites for unexpected creations, edits, or deletions, since exploitation requires only a valid token and would leave few other traces.

Affected
Craft (Craft CMS) Craft CMS
Estimated exposure
largetens of thousands of Craft CMS sites plausibly affected (overall installed base tracked at roughly 100k live sites, narrowed by the multi-site-plus-GraphQL… — Public web-technology trackers place the total Craft CMS installed base on the order of 100k live sites, and the exploitable population is the subset running multi-site setups with GraphQL endpoints reachable by site-scoped tokens, a…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

Craft CMS GraphQL entry mutation resolvers (saveEntry, deleteEntry) read siteIddirectly from$argumentswithout passing throughArgumentManagerprepareArguments(), which is the function that enforces site-scope filtering via array_intersect against the GraphQL schema’s allowed sites. The query path (ElementResolverprepareElementQuery) correctly calls prepareArguments()`, so queries to unauthorized sites return empty. But mutations bypass this entirely — an attacker with a token scoped to Site A can create, modify, or delete entries in Site B by passing siteId in the mutations argument.

Weakness
CWE-89
Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

In the news

No ingested article mentions this CVE yet.