GHSA-875v-7m49-8x88

Suggest an improvement
Source
https://github.com/advisories/GHSA-875v-7m49-8x88
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-875v-7m49-8x88/GHSA-875v-7m49-8x88.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-875v-7m49-8x88
Aliases
Published
2026-04-14T00:07:34Z
Modified
2026-04-14T00:41:06Z
Severity
  • 8.7 (High) CVSS_V4 - 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 CVSS Calculator
Summary
Craft Commerce has a SQL Injection can lead to Remote Code Execution via TotalRevenue Widget
Details

Summary

A SQL injection in the Commerce TotalRevenue widget can lead to remote code execution through a chain of four vulnerabilities:

  • SQL Injection -- The TotalRevenue stat interpolates unsanitized widget settings directly into a sprintf-based SQL Expression. Any control panel user can create any widget type without permission checks.

  • PDO Multi-Statement Queries -- PHP PDO MySQL enables CLIENT_MULTI_STATEMENTS by default. Neither Yii2 nor Craft CMS disables it. This allows stacking an INSERT statement after the injected SELECT , writing a maliciously serialized PHP object into the queue table.

  • Unrestricted unserialize() -- The yii2-queue PhpSerializer calls unserialize() with no allowed_classes restriction on every queue job. When the queue consumer processes the injected job, it instantiates the attacker-controlled object.

  • Gadget Chain (FileCookieJar) -- GuzzleHttp\Cookie\FileCookieJar (a standard Guzzle dependency) has an unguarded __destruct() method that calls file_put_contents(). The attacker’s serialized payload writes a PHP webshell to the server’s webroot. PHP tags survive json_encode() because Guzzle uses options=0 (no JSON_HEX_TAG).

The complete chain requires 3 HTTP requests and achieves arbitrary command execution as the PHP process user. Queue processing is triggered via GET /actions/queue/run, an endpoint that requires no authentication ($allowAnonymous = ['run']).

RCE Exploitation Steps

  • Authenticate as any control panel user
  • POST to /admin/actions/dashboard/create-widget with stacked SQL injection:
  • settings[type] contains the stacked INSERT with the serialized gadget chain
  • Response: HTTP 500 (expected -- INSERT already committed)
  • Trigger queue processing: GET /actions/queue/run
  • Queue consumer deserializes the gadget chain
  • FileCookieJar::__destruct() writes webshell to webroot
  • Access the webshell: GET /poc_rce.php?c=id
  • Response: uid=1000(home) gid=1000(home) groups=1000(home)
Database specific
{
    "cwe_ids": [
        "CWE-89"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-04-14T00:07:34Z",
    "nvd_published_at": "2026-04-13T21:16:24Z",
    "severity": "HIGH"
}
References

Affected packages

Packagist / craftcms/commerce

Package

Name
craftcms/commerce
Purl
pkg:composer/craftcms/commerce

Affected ranges

Type
ECOSYSTEM
Events
Introduced
4.0.0
Fixed
4.10.3

Affected versions

4.*
4.0.0
4.0.1
4.0.2
4.0.3
4.0.4
4.1.0
4.1.1
4.1.2
4.1.3
4.2.0
4.2.1
4.2.2
4.2.3
4.2.4
4.2.5
4.2.5.1
4.2.6
4.2.7
4.2.8
4.2.9
4.2.10
4.2.11
4.3.0
4.3.1
4.3.2
4.3.3
4.4.0
4.4.1
4.4.1.1
4.5.0
4.5.1
4.5.1.1
4.5.2
4.5.3
4.5.4
4.6.0
4.6.1
4.6.2
4.6.3.1
4.6.4
4.6.5
4.6.6
4.6.7
4.6.8
4.6.9
4.6.10
4.6.11
4.6.12
4.6.13
4.6.14
4.7.0
4.7.1
4.7.2
4.7.3
4.8.0
4.8.0.1
4.8.1
4.8.1.1
4.8.1.2
4.8.2
4.8.3
4.8.4
4.9.0
4.9.1
4.9.2
4.9.3
4.9.4
4.10.0
4.10.1
4.10.2

Database specific

last_known_affected_version_range
"<= 4.10.2"
source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-875v-7m49-8x88/GHSA-875v-7m49-8x88.json"

Packagist / craftcms/commerce

Package

Name
craftcms/commerce
Purl
pkg:composer/craftcms/commerce

Affected ranges

Type
ECOSYSTEM
Events
Introduced
5.0.0
Fixed
5.5.5

Affected versions

5.*
5.0.0
5.0.1
5.0.2
5.0.3
5.0.4
5.0.5
5.0.6
5.0.7
5.0.8
5.0.9
5.0.10
5.0.10.1
5.0.11
5.0.11.1
5.0.12
5.0.12.1
5.0.12.2
5.0.13
5.0.14
5.0.15
5.0.16
5.0.16.1
5.0.16.2
5.0.17
5.0.18
5.0.19
5.1.0-beta.1
5.1.0-beta.2
5.1.0-beta.3
5.1.0
5.1.0.1
5.1.1
5.1.2
5.1.3
5.1.4
5.2.0
5.2.1
5.2.2
5.2.2.1
5.2.3
5.2.4
5.2.5
5.2.6
5.2.7
5.2.8
5.2.9
5.2.9.1
5.2.10
5.2.11
5.2.12
5.2.12.1
5.3.0
5.3.0.1
5.3.0.2
5.3.1
5.3.2
5.3.2.1
5.3.2.2
5.3.3
5.3.4
5.3.5
5.3.6
5.3.7
5.3.8
5.3.9
5.3.10
5.3.11
5.3.12
5.3.13
5.4.0
5.4.1
5.4.1.1
5.4.2
5.4.3
5.4.4
5.4.5
5.4.5.1
5.4.6
5.4.7
5.4.7.1
5.4.8
5.4.9
5.4.10
5.5.0
5.5.0.1
5.5.1
5.5.2
5.5.3
5.5.4

Database specific

last_known_affected_version_range
"<= 5.5.4"
source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-875v-7m49-8x88/GHSA-875v-7m49-8x88.json"