GHSA-w998-qmw9-mf4m

Suggest an improvement
Source
https://github.com/advisories/GHSA-w998-qmw9-mf4m
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-w998-qmw9-mf4m/GHSA-w998-qmw9-mf4m.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-w998-qmw9-mf4m
Aliases
  • CVE-2026-63002
Published
2026-09-23T14:06:04Z
Modified
2026-09-23T14:15:04Z
Severity
  • 4.8 (Medium) CVSS_V3 - CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N CVSS Calculator
Summary
REDAXO: Stored XSS in Mediapool Sync Page via Unescaped Filesystem Filenames
Details

Summary

The mediapool sync page (sync.php) renders filenames from the /media filesystem directory directly into HTML without applying rex_escape() (i.e., htmlspecialchars). Any file placed in the media directory whose filename contains HTML metacharacters will execute JavaScript in the browser of any backend user who views the sync page.

Details

In redaxo/src/addons/mediapool/pages/sync.php, the variable $diffFiles is populated from actual filesystem filenames (files in /media/ not yet registered in the database). These filenames are then rendered without escaping:

File: redaxo/src/addons/mediapool/pages/sync.php:119-120

foreach ($diffFiles as $file) {
    if (is_writable(rex_path::media($file))) {
        $e = [];
        $e['label'] = '<label>' . $file . '</label>';          // NO rex_escape!
        $e['field'] = '<input type="checkbox" name="sync_files[]" value="' . $file . '" />'; // NO rex_escape!
        $writable[] = $e;
    } else {
        $notWritable[] = $file;
    }
}

File: redaxo/src/addons/mediapool/pages/sync.php:170

$fragment->setVar('body', '<ul><li>' . implode('</li><li>', $notWritable) . '</li></ul>', false);
// $notWritable contains unescaped filenames

By contrast, all other filename displays in the codebase use rex_escape($fname) (e.g., media.detail.php:236, media.list.php). The sync page is accessible to any backend user with the media[sync] permission (not exclusively admins).

PoC

  1. Place a file named <img src=x onerror=alert(document.cookie)>.txt into the REDAXO /media/ directory (via backup restore or server access) without adding it to the media database.
  2. Log in as any backend user with media[sync] permission.
  3. Navigate to Mediapool → Sync.
  4. The XSS payload executes immediately, stealing the admin session cookie.

Impact

Stored XSS in the admin panel. An attacker who can place files in the media directory (via admin-level backup restore or server access) can achieve persistent XSS against all users who visit the sync page, including higher-privileged admins. This enables session hijacking, credential theft, and full CMS takeover.

Fix

Apply rex_escape() to all filename variables before inserting into HTML:

$e['label'] = '<label>' . rex_escape($file) . '</label>';
$e['field'] = '<input type="checkbox" name="sync_files[]" value="' . rex_escape($file) . '" />';
// ...
$fragment->setVar('body', '<ul><li>' . implode('</li><li>', array_map('rex_escape', $notWritable)) . '</li></ul>', false);
Database specific
{
    "cwe_ids":  [
        "CWE-79"
    ],
    "github_reviewed":  true,
    "github_reviewed_at":  "2026-09-23T14:06:04Z",
    "nvd_published_at":  null,
    "severity":  "MODERATE"
}
References

Affected packages

Packagist / redaxo/source

Package

Name
redaxo/source
Purl
pkg:composer/redaxo/source

Affected ranges

Type
ECOSYSTEM
Events
Introduced
0 Unknown introduced version / All previous versions are affected
Fixed
5.21.2

Affected versions

5.*
5.10.0-beta1
5.10.0-beta2
5.10.0
5.10.1
5.11.0-beta1
5.11.0
5.11.1
5.11.2
5.12.0-beta1
5.12.0-beta2
5.12.0-beta3
5.12.0
5.12.1
5.13.0-beta1
5.13.0-beta2
5.13.0
5.13.1
5.13.2
5.13.3
5.14.0-beta1
5.14.0-beta2
5.14.0
5.14.1
5.14.2
5.14.3
5.15.0-beta1
5.15.0
5.15.1
5.16.0-beta1
5.16.0
5.16.1
5.17.0
5.17.1
5.18.0
5.18.1
5.18.2
5.18.3
5.19.0
5.20.0
5.20.1
5.20.2
5.21.0-beta1
5.21.0
5.21.1

Database specific

last_known_affected_version_range
"<= 5.21.1"
source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-w998-qmw9-mf4m/GHSA-w998-qmw9-mf4m.json"