CVE-2026-53599
Redaxo has a Mediapool isAllowedExtension bypass via multi-segment filename that leads to authenticated RCE on Apache mod_php multi-extension handlers
REDAXO is a PHP-based content management system. From 5.18.2 until 5.21.1, rex_mediapool::isAllowedExtension in redaxo/src/addons/mediapool/lib/mediapool.php lets an authenticated backend user with media[upload] permission upload a JPEG/PHP polyglot named shell.php.any.jpg, which web servers with multi-extension PHP handlers can execute as the web-server user. This issue is fixed in version 5.21.1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
7.5
Redaxo has a Mediapool isAllowedExtension bypass via multi-segment filename that leads to authenticated RCE on Apache mod_php multi-extension handlers
REDAXO is a PHP-based content management system. From 5.18.2 until 5.21.1, rex_mediapool::isAllowedExtension in redaxo/src/addons/mediapool/lib/mediapool.php lets an authenticated backend user with media[upload] permission upload a JPEG/PHP polyglot named shell.php.any.jpg, which web servers with multi-extension PHP handlers can execute as the web-server user. This issue is fixed in version 5.21.1.
- Record
CVE-2026-53599- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
EUVDEUVD-2026-51626
7.5
REDAXO is a PHP-based content management system. From 5.18.2 until 5.21.1, rex_mediapool::isAllowedExtension in redaxo/src/addons/mediapool/lib/mediapool.php lets an authenticated backend user with media[upload] permission upload a JPEG/PHP polyglot named shell.php.any.jpg, which web servers with multi-extension PHP handlers can execute as the web-server user. This issue is fixed in version 5.21.1.
- Record
EUVD-2026-51626- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-98pp-vccm-qm25
7.5
Redaxo has a Mediapool isAllowedExtension bypass via multi-segment filename that leads to authenticated RCE on Apache mod_php multi-extension handlers
Summary
rex_mediapool::isAllowedExtension in redaxo/src/addons/mediapool/lib/mediapool.php accepts filenames that contain a blocked extension as a non-terminal segment of a longer extension chain, for example shell.php.any.jpg. The check only catches the blocked extension when it appears at the end of the filename or immediately before the final extension. An authenticated backend user with mediapool upload permission can upload a JPEG/PHP polyglot named shell.php.any.jpg and, on web servers whose PHP handler matches .php as any segment (mod_mime AddHandler-style, or any FilesMatch regex without an end anchor), request the file from the public media/ directory to execute arbitrary PHP as the web-server user.
The vulnerable check is a regression introduced in commit 9d008697d (PR #6213, Feb 7 2025), which weakened a previously correct str_contains check into a pair of str_ends_with checks. The earlier check, in place since 2018 specifically to defend against double-extension attacks, would have blocked this payload.
The regression has shipped in every release from 5.18.2 through 5.21.0.
Details
Root cause
At the audited commit 6e0de42, isAllowedExtension performs three checks against the blocked-extension list:
// redaxo/src/addons/mediapool/lib/mediapool.php (104–130) @ 6e0de42
public static function isAllowedExtension(string $filename, array $args = []): bool
{
$fileExt = mb_strtolower(rex_file::extension($filename));
if ('' === $filename || str_contains($fileExt, ' ') || '' === $fileExt) {
return false;
}
if (str_starts_with($fileExt, 'php')) {
return false;
}
$blockedExtensions = self::getBlockedExtensions();
foreach ($blockedExtensions as $blockedExtension) {
// $blockedExtensions extensions are not allowed within filenames, to prevent double extension vulnerabilities:
// -> some webspaces execute files named file.php.txt as php
if (str_ends_with($filename, '.' . $blockedExtension)
|| str_ends_with($filename, '.' . $blockedExtension . '.' . $fileExt)
) {
return false;
}
}
$allowedExtensions = self::getAllowedExtensions($args);
return !count($allowedExtensions) || in_array($fileExt, $allowedExtensions);
}
For shell.php.any.jpg:
$fileExtisjpg, sostr_starts_with('jpg', 'php')is false.- The loop checks two suffix shapes:
str_ends_with('shell.php.any.jpg', '.php')— false.str_ends_with('shell.php.any.jpg', '.php.jpg')— false, because the actual chain is.php.any.jpg.
- Default
$allowedExtensionsis empty (no widgettypesarg on the main mediapool upload page), so the function returnstrue. The defensive comment on lines 119–120 explicitly names the threat model the maintainers are guarding against — "some webspaces execute files named file.php.txt as php". The current check covers that exact two-segment shape but fails for any chain of length three or more in which a blocked extension is not the final segment.
Regression history
Prior to commit 9d008697d (PR #6213, Feb 7 2025) the check was:
if (str_contains($filename, '.' . $blockedExtension)) {
return false;
}
str_contains('shell.php.any.jpg', '.php') is true, so the prior check would have correctly rejected this payload. The substring form had a false-positive problem with names like foo.json (which contains the substring .js), and the rewrite removed the false positive but also removed the multi-extension protection. The three regression tests added in that commit (foo.js.txt, js_datei.txt, foo.json) do not include a length-three-or-greater chain with a blocked non-terminal segment, so the security regression was not caught by…
- Record
GHSA-98pp-vccm-qm25- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
NVD
7.5
REDAXO is a PHP-based content management system. From 5.18.2 until 5.21.1, rex_mediapool::isAllowedExtension in redaxo/src/addons/mediapool/lib/mediapool.php lets an authenticated backend user with media[upload] permission upload a JPEG/PHP polyglot named shell.php.any.jpg, which web servers with multi-extension PHP handlers can execute as the web-server user. This issue is fixed in version 5.21.1.
- Record
CVE-2026-53599- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
OSV
7.5
Redaxo has a Mediapool isAllowedExtension bypass via multi-segment filename that leads to authenticated RCE on Apache mod_php multi-extension handlers
REDAXO is a PHP-based content management system. From 5.18.2 until 5.21.1, rex_mediapool::isAllowedExtension in redaxo/src/addons/mediapool/lib/mediapool.php lets an authenticated backend user with media[upload] permission upload a JPEG/PHP polyglot named shell.php.any.jpg, which web servers with multi-extension PHP handlers can execute as the web-server user. This issue is fixed in version 5.21.1.
- Record
CVE-2026-53599- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
OSVGHSA-98pp-vccm-qm25
7.5
Redaxo has a Mediapool isAllowedExtension bypass via multi-segment filename that leads to authenticated RCE on Apache mod_php multi-extension handlers
Summary
rex_mediapool::isAllowedExtension in redaxo/src/addons/mediapool/lib/mediapool.php accepts filenames that contain a blocked extension as a non-terminal segment of a longer extension chain, for example shell.php.any.jpg. The check only catches the blocked extension when it appears at the end of the filename or immediately before the final extension. An authenticated backend user with mediapool upload permission can upload a JPEG/PHP polyglot named shell.php.any.jpg and, on web servers whose PHP handler matches .php as any segment (mod_mime AddHandler-style, or any FilesMatch regex without an end anchor), request the file from the public media/ directory to execute arbitrary PHP as the web-server user.
The vulnerable check is a regression introduced in commit 9d008697d (PR #6213, Feb 7 2025), which weakened a previously correct str_contains check into a pair of str_ends_with checks. The earlier check, in place since 2018 specifically to defend against double-extension attacks, would have blocked this payload.
The regression has shipped in every release from 5.18.2 through 5.21.0.
Details
Root cause
At the audited commit 6e0de42, isAllowedExtension performs three checks against the blocked-extension list:
// redaxo/src/addons/mediapool/lib/mediapool.php (104–130) @ 6e0de42
public static function isAllowedExtension(string $filename, array $args = []): bool
{
$fileExt = mb_strtolower(rex_file::extension($filename));
if ('' === $filename || str_contains($fileExt, ' ') || '' === $fileExt) {
return false;
}
if (str_starts_with($fileExt, 'php')) {
return false;
}
$blockedExtensions = self::getBlockedExtensions();
foreach ($blockedExtensions as $blockedExtension) {
// $blockedExtensions extensions are not allowed within filenames, to prevent double extension vulnerabilities:
// -> some webspaces execute files named file.php.txt as php
if (str_ends_with($filename, '.' . $blockedExtension)
|| str_ends_with($filename, '.' . $blockedExtension . '.' . $fileExt)
) {
return false;
}
}
$allowedExtensions = self::getAllowedExtensions($args);
return !count($allowedExtensions) || in_array($fileExt, $allowedExtensions);
}
For shell.php.any.jpg:
$fileExtisjpg, sostr_starts_with('jpg', 'php')is false.- The loop checks two suffix shapes:
str_ends_with('shell.php.any.jpg', '.php')— false.str_ends_with('shell.php.any.jpg', '.php.jpg')— false, because the actual chain is.php.any.jpg.
- Default
$allowedExtensionsis empty (no widgettypesarg on the main mediapool upload page), so the function returnstrue. The defensive comment on lines 119–120 explicitly names the threat model the maintainers are guarding against — "some webspaces execute files named file.php.txt as php". The current check covers that exact two-segment shape but fails for any chain of length three or more in which a blocked extension is not the final segment.
Regression history
Prior to commit 9d008697d (PR #6213, Feb 7 2025) the check was:
if (str_contains($filename, '.' . $blockedExtension)) {
return false;
}
str_contains('shell.php.any.jpg', '.php') is true, so the prior check would have correctly rejected this payload. The substring form had a false-positive problem with names like foo.json (which contains the substring .js), and the rewrite removed the false positive but also removed the multi-extension protection. The three regression tests added in that commit (foo.js.txt, js_datei.txt, foo.json) do not include a length-three-or-greater chain with a blocked non-terminal segment, so the security regression was not caught by…
- Record
GHSA-98pp-vccm-qm25- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
redaxo/sourcePackagist |
5.18.2 up to 5.21.1 | 5.21.1 |
redaxo/sourcePackagist |
5.18.2 up to 5.21.1, plus listed versions 5.18.35.19.05.20.05.20.15.20.25.21.05.21.0-beta1 |
5.21.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-53599 is a high vulnerability (CVSS 7.5) in Opnsense Core, published July 31, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.51%, the 43rd percentile. Fixed in redaxo/source 5.21.1.
References
github.com/redaxo/core/security/advisories/GHSA-98pp-vccm-qm25
github.com/redaxo/core/pull/6538
github.com/redaxo/core/commit/462e36896bb65d292ba22d711044c23c9cfb0340
github.com/redaxo/core/releases/tag/5.21.1
github.com/advisories/GHSA-98pp-vccm-qm25
github.com/CVEProject/cvelistV5/tree/main/cves/2026/53xxx/CVE-2026-53599.json
nvd.nist.gov/vuln/detail/CVE-2026-53599
github.com/redaxo/core
Left out here: the rest of 2 source descriptions. The JSON record has them.