PatchClock

PHP security digest · 23 Sep 2026

REDAXO: Missing CSRF Protection on Package Update Action Allows Forced Addon Updates

Medium CVE-2026-63000

Package
redaxo/source
Fixed in
5.21.2
Published
Wed 23 Sep 2026, 15:09 LisbonUpdated Mon 26 Oct 2026, 01:26 Lisbon
Installs on Packagist
24K

In plain words

An attacker can trick a logged-in REDAXO admin into visiting a malicious page that silently installs a specific addon version from the REDAXO package server. The package update action lacks CSRF protection, allowing unwanted updates that may disrupt the site. If combined with a compromised package or a downgrade to a known-vulnerable version, this can lead to remote code execution.

Affected versions

PackageAffectedFixed in
redaxo/source<= 5.21.15.21.2

Am I affected?

Check composer.lock for redaxo/source at version 5.21.1 or earlier; 5.21.2 is fixed. Check whether your installation uses the install addon's package update action, rex_api_install_package_update. The attack requires a logged-in admin to visit an attacker-controlled page.

What to do

Check which version you have, then update to a fixed release for your branch (5.21.2):

composer show redaxo/source | grep versions
composer update redaxo/source

If your version constraint in composer.json keeps you below a fixed release, raise it first. Whether your configuration is affected, and the exact version ranges, are in the advisory itself.

If you cannot update yet

Add a requiresCsrfProtection() method to rex_api_install_package_update that returns true.

The advisory's description

Summary

The rex_api_install_package_update API function (install addon) does not override requiresCsrfProtection(), which defaults to false in the base class rex_api_function. Any authenticated admin can therefore be tricked via a CSRF attack into silently triggering a package update from the REDAXO package server.

Details

File: redaxo/src/core/lib/api_function.php:277-280

protected function requiresCsrfProtection()
{
    return false;  // DEFAULT — subclasses must opt in
}

File: redaxo/src/addons/install/lib/api/api_package_update.php:8-39

class rex_api_install_package_update extends rex_api_function
{
    public function execute()
    {
        if (!rex::getUser()?->isAdmin()) {
            throw new rex_api_exception('You do not have the permission!');
        }
        $addonkey = rex_request('addonkey', 'string');
        $fileId = rex_request('file', 'int');
        $installer = new rex_install_package_update();
        // ... downloads and installs $addonkey version $fileId from redaxo.org
    }
    // requiresCsrfProtection() NOT overridden — defaults to false
}

For comparison, rex_api_install_package_add and rex_api_install_package_delete both correctly return true. Only rex_api_install_package_update is missing this.

PoC

<!-- Attacker-controlled page -->
<img src="https://victim-redaxo.example.com/index.php?page=install/packages&rex-api-call=install_package_update&addonkey=some_addon&file=42" />

When an authenticated admin visits this page, the request is automatically made with their session cookie, causing some_addon to be updated to version file_id=42.

Impact

An attacker who can lure an admin to a malicious page can force-install specific addon versions. If combined with a supply-chain compromise of a package on redaxo.org, or by targeting a downgrade to a known-vulnerable version, this becomes a remote code execution vector. Even without supply-chain compromise, it can be used to disrupt the site by forcing unwanted updates.

Fix

Add requiresCsrfProtection() to rex_api_install_package_update:

protected function requiresCsrfProtection()
{
    return true;
}

Weakness: CWE-352 Cross-Site Request Forgery (CSRF). Reported by de3erve-hunter.

The advisory

From OSV.dev, which gathers the GitHub Advisory Database, FriendsOfPHP and Drupal security advisories; the summary is theirs. The description, affected versions, weakness and credits are from the GitHub Advisory Database (CC BY 4.0). "In plain words", "Am I affected?" and "If you cannot update yet" are based on that advisory, and checked to name no version it does not.