CVE-2026-79991 Overview
CVE-2026-79991 is an authorization bypass vulnerability in Craft CMS affecting the GraphQL API. The flaw allows an authenticated attacker holding a token scoped to one site to create, modify, or delete entries in a different site within the same installation. The saveEntry and deleteEntry mutation resolvers read siteId directly from $arguments without invoking ArgumentManager::prepareArguments(), the method responsible for enforcing site-scope filtering via array_intersect against the schema's allowed sites.
Critical Impact
An attacker with a GraphQL token scoped to Site A can perform write operations against entries in Site B, breaking multi-site tenant isolation and enabling unauthorized content manipulation.
Affected Products
- Craft CMS (GraphQL API mutation resolvers)
- Versions prior to Craft CMS 5.10.13
- Multi-site installations exposing GraphQL tokens scoped to individual sites
Discovery Timeline
- 2026-09-02 - CVE-2026-79991 published to NVD
- 2026-09-02 - Last updated in NVD database
Technical Details for CVE-2026-79991
Vulnerability Analysis
Craft CMS supports multi-site installations where a single instance manages entries across multiple sites. GraphQL tokens are scoped to a schema that defines which sites the token may access. The framework enforces this scope through ArgumentManager::prepareArguments(), which applies array_intersect between the requested siteId values and the schema's permitted sites. On the query path, ElementResolver::prepareElementQuery calls prepareArguments(), so queries targeting sites outside the token's scope return empty result sets.
The mutation path does not follow the same flow. The saveEntry and deleteEntry resolvers read siteId directly from the raw $arguments array, skipping the scope-filtering call entirely. As a result, the schema's site allow-list is never consulted before the write operation executes.
Root Cause
The root cause is missing authorization enforcement on GraphQL mutation resolvers, categorized as [CWE-89]-adjacent input trust but functionally a broken access control flaw. The mutation resolvers trust an authenticated but improperly scoped input parameter to select the target tenant. Because prepareArguments() is the sole enforcement point for site-scope filtering and it is not invoked, the schema's allowed-sites list becomes advisory rather than authoritative for writes.
Attack Vector
An attacker requires a valid GraphQL token scoped to at least one site on the target Craft CMS installation. The attacker issues a saveEntry or deleteEntry mutation and supplies a siteId corresponding to a site outside the token's schema scope. The resolver accepts the raw argument, resolves the target entry, and performs the create, update, or delete operation. Exploitation requires no user interaction and can be automated against any exposed GraphQL endpoint. See the GitHub Security Advisory GHSA-4mgp-5vf2-7c9m for the disclosed technical details.
Detection Methods for CVE-2026-79991
Indicators of Compromise
- GraphQL mutation requests containing saveEntry or deleteEntry with a siteId argument that does not match the token's assigned schema scope.
- Entry create, update, or delete events in Craft CMS audit logs attributed to tokens whose schema does not include the target siteId.
- Unexpected content modifications on sites not associated with the acting API token's schema.
Detection Strategies
- Inspect web server and application logs for POST requests to the GraphQL endpoint whose body contains mutation operations referencing saveEntry or deleteEntry alongside a siteId value.
- Correlate the acting token's schema-permitted site IDs against the siteId values used in mutation payloads to identify scope violations.
- Review Craft CMS entry revision history for changes performed via GraphQL that cross site boundaries.
Monitoring Recommendations
- Enable verbose GraphQL request logging and forward the logs to a centralized analytics platform for behavioral analysis.
- Alert on any mutation traffic originating from tokens that historically issued only queries or that operate outside expected business hours.
- Track entry-modification volume per token and flag statistical anomalies against baseline activity.
How to Mitigate CVE-2026-79991
Immediate Actions Required
- Upgrade Craft CMS to release 5.10.13 or later, which routes mutation arguments through ArgumentManager::prepareArguments().
- Audit all active GraphQL tokens and revoke any that are unused, over-scoped, or issued to third parties without a current business justification.
- Review entry revision logs across all sites for unauthorized changes since the vulnerable version was deployed.
Patch Information
Craft CMS addressed the flaw in release 5.10.13. Details are available in the Craft CMS 5.10.13 release notes and the GitHub Security Advisory GHSA-4mgp-5vf2-7c9m. The Craft CMS source repository contains the patched resolver logic.
Workarounds
- Restrict GraphQL endpoint exposure to trusted networks using a reverse proxy or web application firewall until the patch is applied.
- Disable mutation operations on the GraphQL schema for tokens that only require read access.
- Deploy a WAF rule that blocks saveEntry and deleteEntry mutations containing a siteId argument, or requires an allow-list match against the token identity.
# Configuration example
# Upgrade Craft CMS to the patched release using Composer
composer require craftcms/cms:^5.10.13 --update-with-dependencies
php craft up
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

