Aug 6, 2026·6 min read·2 visits
Missing admin authorization check in Craft CMS's GlobalsController allows low-privilege authenticated users to reorder global sets via direct API endpoint calls.
An authorization bypass vulnerability in Craft CMS allows authenticated control panel users with low privileges to reorder global sets. This alters structure and writes to the project configuration database schema without administrative rights.
Craft CMS utilizes "Global Sets" to manage site-wide variables and content modules. These components are handled through the administrative Control Panel (CP) via controllers designed to manage structural operations. The GlobalsController exposed a specific action route, actionReorderSets(), meant exclusively for system administrators to alter the sequential layout and prioritization of these global configurations.
This endpoint resides in the core routing configuration, rendering it accessible via POST requests directed to /actions/globals/reorder-sets or through query parameters like ?p=actions/globals/reorder-sets. However, in vulnerable versions up to 4.18.0.1, the application did not apply corresponding controller-level restriction mechanisms. Any authenticated session with basic CP access could access and invoke the endpoint.
This flaw falls under CWE-285 (Improper Authorization) and CWE-639 (Authorization Bypass Through User-Controlled Key). While standard content management operations are segregated by user roles and specific permissions, this route bypassed administrative boundaries. Consequently, low-privilege users could modify the database and global configuration file sequences without proper credentials.
The root cause of CVE-2026-14793 lies in the omission of authorization checks within the execution pipeline of the controller method. Craft CMS controllers typically execute filter chains or explicit security checks before handling request parameters. Administrative controllers utilize the $this->requireAdmin() helper method to enforce that the current user context contains administrative privileges.
In the vulnerable configuration of GlobalsController.php, the action method actionReorderSets only enforced transport-layer constraints. It invoked $this->requirePostRequest() to ensure the request method was HTTP POST and $this->requireAcceptsJson() to enforce JSON transport format. However, it failed to perform user-level validation, allowing any authenticated session to reach the underlying service call.
Furthermore, the service layer function Craft::$app->getGlobals()->reorderSets() operates under the assumption that the calling context has already performed necessary authorization validation. This architectural pattern delegates boundary enforcement entirely to the controller layer. When a controller action fails to invoke $this->requireAdmin(), the underlying database operations run without validation, resulting in structural state updates.
Analysis of the vulnerable source code highlights the security gap in src/controllers/GlobalsController.php (commit f801317b13e4a87d704a50a2807a0af83325c452). The method lacked any checks validating the active user's permissions, directly invoking parameter extraction and service layer execution immediately after confirming transport validation.
// VULNERABLE CODE (<= 4.18.0.1)
public function actionReorderSets(): Response
{
$this->requirePostRequest();
$this->requireAcceptsJson();
// Missing authorization check here
$setIds = Json::decode($this->request->getRequiredBodyParam('ids'));
Craft::$app->getGlobals()->reorderSets($setIds);
}The function decodes the array of IDs sent in the request parameter ids and directly processes the update database sequence. Since there is no controller gate, the PHP pipeline proceeds blindly to the persistence layer.
// PATCHED CODE (>= 4.18.1 / 5.10.3)
public function actionReorderSets(): Response
{
$this->requirePostRequest();
$this->requireAcceptsJson();
$this->requireAdmin(); // Enforces administrative context before execution
$setIds = Json::decode($this->request->getRequiredBodyParam('ids'));
Craft::$app->getGlobals()->reorderSets($setIds);
}The integration of $this->requireAdmin() successfully forces execution flow verification against Yii2 session properties. If the user session lacks the active administrative flag, the application halts execution and outputs a 403 Forbidden JSON error block, neutralizing the bypass vector.
To exploit this vulnerability, an attacker must first obtain a valid, authenticated Control Panel session. This prerequisite restricts the attack surface to registered users, such as low-privileged editors, translators, or guest authors. Once logged in, the attacker can leverage the browser session's cookies and retrieve the current application-wide CSRF token from the Control Panel's DOM.
The attacker then crafts a direct POST request targeted at /index.php?p=actions/globals/reorder-sets. The request payload requires the parameter ids set to a JSON-formatted string array of integers representing the desired configuration order. This can be submitted either via standard application/x-www-form-urlencoded form encoding or application/json headers, containing the appropriate cookie and CSRF header.
POST /index.php?p=actions/globals/reorder-sets HTTP/1.1
Host: target-craftcms.local
User-Agent: Mozilla/5.0 (Security-Researcher)
Accept: application/json
Content-Type: application/json
Cookie: CraftSessionId=8abc01df823de7e123654;
X-CSRF-Token: your_csrf_token_here
Connection: close
{
"ids": "[3,2,1]"
}Upon processing, the backend decodes the requested layout sequence and modifies the database records. In environments where Craft CMS tracks configuration changes in files (Project Config), this action additionally writes state changes directly to the project configuration directory. These configuration modifications are then tracked by version control, potentially introducing persistence anomalies across deployments.
The direct impact of CVE-2026-14793 is categorized as partial loss of integrity. Because an unauthorized user can modify the sequential positioning of global content sets, the presentation layer of the public website may become distorted or unreadable. While this does not immediately allow remote code execution, manipulating application-wide variables can lead to secondary injection vectors if downstream template files process global attributes insecurely.
Additionally, Craft CMS utilizes a Project Config system to store structure and configuration in YAML files. The execution of the unauthorized global reordering triggers a serialization process that updates these configuration files on the local filesystem. In automated continuous integration pipelines, this modification could be committed to git, leading to configuration drift or pipeline failures.
Based on the CVSS v4.0 metrics, this vulnerability has a base score of 5.3 (CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N). The vulnerability requires basic user credentials (PR:L) but is executable remotely over the network with low complexity. This highlights the risk of privilege escalation within corporate content-management networks.
The primary remediation is to upgrade Craft CMS to version 4.18.1 (for 4.x installations) or 5.10.3 (for 5.x installations). These versions integrate the necessary role restriction check into the controller, securing the execution path. Organizations must apply the updates using Composer or the official Control Panel updater to ensure the patch is compiled into the codebase.
For environments where an immediate software upgrade is not feasible, administrators should audit and restrict Control Panel access. Disabling access to the Control Panel for all non-administrative users provides an effective temporary mitigation. Alternatively, custom access policies or Web Application Firewalls (WAF) can block requests targeting the specific URI path /actions/globals/reorder-sets for non-admin IP blocks.
This flaw underscores the importance of a defense-in-depth model in modern software architectures. Developers should implement security checks at both the controller boundary and the service layer. Relying solely on controllers to gate administrative functions introduces single points of failure, where an omitted helper call exposes the entire database layer to unauthorized manipulation.
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Craft CMS Craft | <= 4.18.0.1 | 4.18.1 |
Craft CMS Craft | 5.x < 5.10.3 | 5.10.3 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-285 |
| Attack Vector | Network |
| CVSS v4.0 | 5.3 (Medium) |
| EPSS Score | 0.00224 (Percentile: 13.08%) |
| Impact | Partial Integrity Modification |
| Exploit Status | Proof of Concept |
| KEV Status | Not Listed |
The software does not perform or incorrectly performs an authorization check when an actor attempts to access a resource or perform an action.
A protocol-parsing vulnerability in the pure-Python HTTP/2 library 'h2' (versions <= 4.4.0) allows unauthenticated remote attackers to perform HTTP Request Smuggling (CWE-444). The vulnerability exists because the library does not validate the uniqueness of 'Host' headers in incoming HTTP/2 request streams. When an upstream gateway parses such requests and downgrades them to HTTP/1.1 for internal backend servers, the resulting stream contains duplicate Host headers, which leads to parsing inconsistency and potential bypass of security filters.
An information disclosure vulnerability in Craft CMS allows users with administrative or non-sandboxed template-authoring privileges to read arbitrary system and configuration files. The issue stems from an incomplete class instantiation blocklist in the Twig template extension, which omitted PHP's built-in SplFileObject class.
Prior to versions 10.9.8 and 11.16.1, Mermaid is vulnerable to prototype pollution via its deep-merge utility function assignWithDepth. This helper is invoked by public configuration-setting interfaces, specifically mermaid.initialize, mermaidAPI.setConfig, and mermaidAPI.updateSiteConfig. Because assignWithDepth recursively merges developer-provided properties into Mermaid's internal configuration state without proper sanitization, an attacker who can control or influence the configuration payload can corrupt the global Object.prototype. This vulnerability can lead to security bypasses, cross-site scripting (XSS), or execution flow modifications in applications using vulnerable Mermaid integrations.
A high-severity path traversal vulnerability exists in Traefik's Kubernetes Ingress NGINX provider. The flaw resides in the RewriteTarget middleware, which is auto-generated when an Ingress resource specifies the `nginx.ingress.kubernetes.io/rewrite-target` annotation. This allows remote, unauthenticated attackers to bypass route-level authentication and access restricted downstream endpoints by exploiting a parser differential.
CVE-2026-65600 is a path traversal vulnerability in the ReplacePathRegex middleware component of Traefik. An unauthenticated remote attacker can exploit the vulnerability to inject directory traversal sequences. When Traefik forwards the resulting un-normalized path, downstream backend web servers normalize the request to execute administrative or protected paths, bypassing gateway-enforced security policies.
A critical authentication bypass and context spoofing vulnerability exists in Traefik's BasicAuth, DigestAuth, and ForwardAuth middlewares prior to versions 2.11.51, 3.6.22, and 3.7.6. The flaw arises because Traefik's header cleanup mechanisms rely on Go's standard library header canonicalization, which does not modify or delete headers containing underscores. Consequently, unauthenticated remote attackers can inject custom underscore-variant headers (e.g., X_Auth_User) that bypass Traefik's stripping filters and reach backend application servers. When downstream backends normalize both hyphens and underscores into the same environment variables, the attacker's spoofed identity value is processed as trusted authorization data.