- 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
| Package | Affected | Fixed in |
|---|---|---|
| redaxo/source | <= 5.21.1 | 5.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
- GitHub Advisory Database: GHSA-m8r3-22v6-g877, with who is affected and how
- OSV.dev: GHSA-m8r3-22v6-g877
- The week's digest, with the other advisories from 21 Sep 2026
- All advisories for redaxo/source