GitHub Advisoryadvisory · Packagist

GHSA-c43v-4cr8-6mvp Craft CMS has authenticated path traversal in `assets/icon`, allowing local `.svg` file read

LOW Published 2026-07-09 Modified 2026-08-06 Official page ↗
Aliases
CVE-2026-56394
Ecosystem
Packagist
Packages
craftcms/cms
Severity
Low
CVSS vector
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
Weaknesses
CWE-22
Reviewed
2026-07-09

Affected packages

• Packagist craftcms/cms: >= 4.0.0-RC1, < 4.17.7 → fixed in 4.17.7 • Packagist craftcms/cms: >= 5.0.0-RC1, < 5.9.13 → fixed in 5.9.13

Description

Summary An authenticated path traversal in `assets/icon` allows local SVG file read by passing traversal sequences in the `extension` parameter. The issue is caused by file existence checks happening before extension validation. Details The endpoint: • `src/controllers/AssetsController.php:1115-1123` • `actionIcon(string $extension)` calls `Assets::iconPath($extension)` and returns `sendFile($path, ...)`. In `Assets::iconPath()`: • Path is built from user-controlled `extension`: • `src/helpers/Assets.php:906-909` • If `file_exists($path)` is true, path is returned immediately: • `src/helpers/Assets.php:910-912` Validation exists in `Assets::iconSvg()`: • `preg_match('/^\w+$/', $extension)` • `src/helpers/Assets.php:927-931` However, that validation is only reached if `iconPath()` does not find a file. So traversal payloads that resolve to existing `.svg` files bypass validation and are served by `sendFile()`. Impact • Authenticated users can read local .svg files accessible to the application process. References • https://github.com/craftcms/cms/commit/30f5f1a8d6edf0f3a00be72c42c78d9dc7d72d5c

Related

Alias · CVE (1)

  • CVE-2026-56394 Craft CMS from 4.0.0-RC1 contains an authenticated path traversal vulnerability in the assets/icon endpoint where the extension parameter… vulnerability

Weakness · CWE (1)

  • CWE-22 Improper Limitation of a Pathname to a Restricted Directory weakness

References