CVE-2026-115935

Control panel only API response emulation replaces "securityKey" and reaches server RCE

High 8.7

The app/process-api-response-headers action accepts fake Craft API response headers from any authenticated control panel user. A non-admin user with only accessCp can place newline characters in X-Craft-Plugin-Licenses. Craft passes this value to its .env writer without removing the newlines. This lets the user insert a new attacker-known CRAFT_SECURITY_KEY into .env. After Craft loads that key, the user can forge a signed login redirect containing a Twig system() callback. This is different from the previous report. That report reads the existing key through a Twig sandbox bypass. This report replaces the key through fake API headers and CRLF injection. Fixing either source does not fix the other.

Assigner
Hackrate
Published
2026-10-23
Updated
2026-10-23
Reserved
2026-10-23

Scores

SourceCVSSScoreSeverityVector
Hackrate4.08.7HighCVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Hackrate3.18.8HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Weaknesses

Affected

VendorProductVersions
craftcms cms 5.0.0 to < 5.11.2 (affected)
4.0.0 to < 4.18.9 (affected)
others: unaffected

References

Full CVE JSON record (5.2)

API · GitHub · cve.org

{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://packagist.org",
          "defaultStatus": "unaffected",
          "packageName": "craftcms/cms",
          "product": "cms",
          "vendor": "craftcms",
          "versions": [
            {
              "lessThan": "5.11.2",
              "status": "affected",
              "version": "5.0.0",
              "versionType": "semver"
            },
            {
              "lessThan": "4.18.9",
              "status": "affected",
              "version": "4.0.0",
              "versionType": "semver"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:craftcms:cms:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "5.11.2",
                  "versionStartIncluding": "5.0.0",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:a:craftcms:cms:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "4.18.9",
                  "versionStartIncluding": "4.0.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "OR"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "reporter",
          "value": "Mohamed Wagdy (@Kalawy)"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Hackrate"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eThe\u0026nbsp;\u003ccode\u003eapp/process-api-response-headers\u003c/code\u003e\u0026nbsp;action accepts fake Craft API response headers from any authenticated control panel user.\u003c/p\u003e\u003cp\u003eA non-admin user with only\u0026nbsp;\u003ccode\u003eaccessCp\u003c/code\u003e\u0026nbsp;can place newline characters in\u0026nbsp;\u003ccode\u003eX-Craft-Plugin-Licenses\u003c/code\u003e. Craft passes this value to its\u0026nbsp;\u003ccode\u003e.env\u003c/code\u003e\u0026nbsp;writer without removing the newlines.\u003c/p\u003e\u003cp\u003eThis lets the user insert a new attacker-known\u0026nbsp;\u003ccode\u003eCRAFT_SECURITY_KEY\u003c/code\u003e\u0026nbsp;into\u0026nbsp;\u003ccode\u003e.env\u003c/code\u003e. After Craft loads that key, the user can forge a signed login redirect containing a Twig\u0026nbsp;\u003ccode\u003esystem()\u003c/code\u003e\u0026nbsp;callback.\u003c/p\u003e\u003cp\u003eThis is different from the previous report. That report reads the existing key through a Twig sandbox bypass. This report replaces the key through fake API headers and CRLF injection. Fixing either source does not fix the other.\u003c/p\u003e"
            }
          ],
          "value": "The\u00a0app/process-api-response-headers\u00a0action accepts fake Craft API response headers from any authenticated control panel user.\n\n\n\nA non-admin user with only\u00a0accessCp\u00a0can place newline characters in\u00a0X-Craft-Plugin-Licenses. Craft passes this value to its\u00a0.env\u00a0writer without removing the newlines.\n\n\n\nThis lets the user insert a new attacker-known\u00a0CRAFT_SECURITY_KEY\u00a0into\u00a0.env. After Craft loads that key, the user can forge a signed login redirect containing a Twig\u00a0system()\u00a0callback.\n\n\n\nThis is different from the previous report. That report reads the existing key through a Twig sandbox bypass. This report replaces the key through fake API headers and CRLF injection. Fixing either source does not fix the other."
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "NONE",
            "attackVector": "NETWORK",
            "baseScore": 8.7,
            "baseSeverity": "HIGH",
            "exploitMaturity": "NOT_DEFINED",
            "privilegesRequired": "LOW",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "HIGH",
            "vulnConfidentialityImpact": "HIGH",
            "vulnIntegrityImpact": "HIGH",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        },
        {
          "cvssV3_1": {
            "attackComplexity": "LOW",
            "attackVector": "NETWORK",
            "availabilityImpact": "HIGH",
            "baseScore": 8.8,
            "baseSeverity": "HIGH",
            "confidentialityImpact": "HIGH",
            "integrityImpact": "HIGH",
            "privilegesRequired": "LOW",
            "scope": "UNCHANGED",
            "userInteraction": "NONE",
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-94",
              "description": "CWE-94 Improper Control of Generation of Code (\u0027Code Injection\u0027)",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-23T21:40:57.592Z",
        "orgId": "7004884b-51e2-48e8-b4a2-5ca29e80453e",
        "shortName": "Hackrate"
      },
      "references": [
        {
          "tags": [
            "third-party-advisory",
            "technical-description",
            "mitigation"
          ],
          "url": "https://www.hckrt.com/hacktivity/HCKRT-WM3VSE"
        },
        {
          "tags": [
            "release-notes"
          ],
          "url": "https://github.com/craftcms/cms/releases/tag/5.11.2"
        },
        {
          "tags": [
            "product"
          ],
          "url": "https://github.com/craftcms/cms"
        },
        {
          "tags": [
            "third-party-advisory"
          ],
          "url": "https://github.com/craftcms/cms/security/advisories/GHSA-9hp6-3565-gvh5"
        }
      ],
      "source": {
        "advisory": "GHSA-9hp6-3565-gvh5",
        "discovery": "UNKNOWN"
      },
      "title": "Control panel only API response emulation replaces \"securityKey\" and reaches server RCE",
      "x_generator": {
        "engine": "Vulnogram 1.0.4"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "7004884b-51e2-48e8-b4a2-5ca29e80453e",
    "assignerShortName": "Hackrate",
    "cveId": "CVE-2026-115935",
    "datePublished": "2026-10-23T21:40:57.592Z",
    "dateReserved": "2026-10-23T21:23:18.607Z",
    "dateUpdated": "2026-10-23T21:40:57.592Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}