Skip to content

GHSA-x27p-wfqw-hfcc CVE-2025-68437

Craft CMS vulnerable to Server-Side Request Forgery (SSRF) via GraphQL Asset Upload Mutation

Medium Packagist
Severity
0.0 / 10
Medium · CVSS 4.0
Exploit chance (EPSS)
0.47%
Chance of exploitation in the next 30 days. Higher than 40.97% of scored vulnerabilities.
Known exploited
No
Not in CISA's catalog
Weakness
CWE-918 Server-Side Request Forgery (SSRF)
Fix
5.8.21
Upgrade craftcms/cms to this version or later

Description

The Craft CMS GraphQL save_<VolumeName>_Asset mutation is vulnerable to Server-Side Request Forgery (SSRF). This vulnerability arises because the _file input, specifically its url parameter, allows the server to fetch content from arbitrary remote locations without proper validation. Attackers can exploit this by providing internal IP addresses or cloud metadata endpoints as the url, forcing the server to make requests to these restricted services. The fetched content is then saved as an asset, which can subsequently be accessed and exfiltrated, leading to potential data exposure and infrastructure compromise. This exploitation requires specific GraphQL permissions for asset management within the targeted volume.

Users should update to the patched 5.8.21 and 4.16.17 releases to mitigate the issue.

References:

https://github.com/craftcms/cms/commit/013db636fdb38f3ce5657fd196b6d952f98ebc52

https://github.com/craftcms/cms/blob/5.x/CHANGELOG.md#5821---2025-12-04


Required Permissions

The exploitation requires a few permissions to be enabled in the used GraphQL schema:

  • "Edit assets in the <VolumeName> volume"
  • "Create assets in the <VolumeName> volume"

Steps to Reproduce

  1. Log in to the Craft CMS control panel as an admin.

  2. Create a new volume if you haven’t yet.

  3. Create a new schema (or use the full/public schema) and enable the permissions mentioned above in the Required Permissions section.

  4. Go to GraphiQL: http://craft.local/admin/graphiql & set the created schema.

  5. Run the following GraphQL mutation to upload an Asset (Replace the <VolumeName> with your volume name):

mutation {
    save_<VolumeName>_Asset(_file: { 
        url: "http://127.0.0.1:80/index.php"
        filename: "poc.txt"
    }) {
        id
    }
}
  1. Note that the index.php response will be saved as poc.txt & its content will be accessible via the asset preview/download functionality.

  2. For the PoC, http://127.0.0.1:80/index.php was used as an example. However, the url parameter can be leveraged to target internal services, cloud metadata endpoints, or any arbitrary external URL.

Impact

Successful exploitation of this SSRF vulnerability allows attackers to access internal network resources, bypass firewall rules, and conduct network reconnaissance.

In cloud environments (AWS, GCP, Azure), this can lead to the theft of sensitive credentials (e.g., IAM roles, service account tokens) from metadata endpoints, potentially resulting in the full compromise of the underlying infrastructure and the exfiltration of sensitive data.


Users should update to the patched versions (5.8.21 and 4.16.17) to mitigate the issue.

Users running Craft 3.5.0+ should update to the latest Craft 4.16.17 or 5.8.21 releases.

Affected versions

Packagist

PackageVulnerableFixed in
craftcms/cms
>= 5.0.0-RC1, < 5.8.21
5.8.21
craftcms/cms
>= 3.5.0, < 4.16.17
4.16.17

How to fix

Move to the fixed version or later with your package manager, update the lockfile, and run your tests. If the package only arrives through another dependency, upgrade that dependency first. If none of its releases pulls a fixed version yet, force the version with your package manager's override.

craftcms/cms Packagist → 5.8.21

composer
composer require craftcms/cms:^5.8.21

Severity breakdown

CVSS 4.0 0.0

CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:P

Attack vector
Network
Attack complexity
Low
Attack requirements
Present
Privileges required
High
User interaction
None
Confidentiality (vulnerable system)
High
Integrity (vulnerable system)
None
Availability (vulnerable system)
None
Confidentiality (subsequent systems)
None
Integrity (subsequent systems)
None
Availability (subsequent systems)
None
Exploit maturity
Proof of concept

CVSS 3.1 6.8

CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:N/A:N

Attack vector
Network
Attack complexity
Low
Privileges required
High
User interaction
None
Scope
Changed
Confidentiality
High
Integrity
None
Availability
None

Weakness

CWE-918: Server-Side Request Forgery (SSRF)

The web server receives a URL or similar request from an upstream component and retrieves the contents of this URL, but it does not sufficiently ensure that the request is being sent to the expected destination.

References

Timeline

  1. Published
  2. Last updated by the source
  3. Latest EPSS score
AdvisorySeverityWhy it's related
GHSA-v2gc-rm6g-wrw9
Craft CMS: Cloud Metadata SSRF Protection Bypass via IPv6 Resolution
Medium Linked by the source
GHSA-gp2f-7wcm-5fhx
Craft CMS has Cloud Metadata SSRF Protection Bypass via DNS Rebinding
Medium Linked by the source
GHSA-7vrx-9684-xrf2
Craft CMS stores arbitrary content provided by unauthenticated users in session files
Medium Known exploited Also affects craftcms/cms
GHSA-f3gw-9ww9-jmc3
Craft CMS Allows Remote Code Execution
Critical Known exploited Also affects craftcms/cms
GHSA-x684-96hh-833x
Craft CMS has a potential RCE with a compromised security key
High Known exploited Also affects craftcms/cms
GHSA-2p6p-9rc9-62j9
Craft CMS has potential RCE when PHP `register_argc_argv` config setting is enabled
Critical Known exploited Also affects craftcms/cms
GHSA-wg23-69c2-gjc8
Craft CMS: Passkey login accepts replayed WebAuthn assertions
Medium Also affects craftcms/cms
GHSA-957r-qf9p-67xw
Craft CMS: Arbitrary file read via SplFileObject in non-sandboxed template contexts
Medium Also affects craftcms/cms
Is this in your code?

MergeHarbor checks every repository's dependencies against this database, ranks what matters by exploitability and reachability, routes it to the owning team and opens the fix pull request.

Check your repos with MergeHarbor