🛡️ CVE-2026-26279 — froxlor
Description
Froxlor has Admin-to-Root Privilege Escalation via Input Validation Bypass + OS Command Injection
Summary
A typo in Froxlor's input validation code (== instead of =) completely disables email format checking for all settings fields declared as email type. This allows an authenticated admin to store arbitrary strings — including shell metacharacters — in the panel.adminmail setting. This value is later concatenated into a shell command executed as root by a cron job, where the pipe character | is explicitly whitelisted. The result is full root-level Remote Code Execution.
Why This Is a Security Vulnerability (Not Just "Admin Using Admin Features")
Froxlor is a shared hosting control panel. In production deployments:
1. Admin panel access does not equal root access. Hosting providers assign the Froxlor admin role to staff who manage customer accounts, domains, and services through the web UI. These operators are not given SSH access or root shell on the underlying server. The boundary between "panel admin" and "OS root" is a deliberate security design.
2. Froxlor itself enforces this boundary. The safe_exec() function (FileDir.php:224-264) exists specifically to prevent shell injection — it blocks ;, |, &, >, <, ` `, $, ~, ?. The email validation function (validateFormFieldEmail`) exists specifically to ensure email fields contain valid emails. Both mechanisms are security boundaries that this vulnerability bypasses.
3. The root cause is an unintentional code defect. The == operator on a standalone line is a no-op. No developer writes $x == 'mail'; intentionally. This is a typo that silently breaks an entire class of input validation. It is not an admin feature.
4. Comparable CVEs exist for similar hosting panel escalations:
- CVE-2022-44877 (CentOS Web Panel: admin→root RCE, CVSS 9.8)
- CVE-2023-27524 (Apache Superset: admin→RCE)
- CVE-2021-21315 (Node.js systeminformation: privileged user→RCE)
- CVE-2024-22024 (Ivanti: authenticated→system command execution)
In each case, the fact that the attacker needs authenticated access did not prevent CVE assignment. The privilege escalation from "application admin" to "OS root" is the security impact.
5. Multi-tenant impact. A single compromised or malicious admin gains root access to a server hosting potentially hundreds of customers. All customer data, databases, emails, and SSL keys are exposed.
Vulnerability Details
Bug 1: Input Validation Bypass (CWE-482)
File: lib/Froxlor/Validate/Form/Data.php
```php
// Line 169 — CURRENT CODE (BUGGY)
public static function validateFormFieldEmail($fieldname, $fielddata, $newfieldvalue)
{
$fielddata['string_type'] == 'mail'; // == comparison: result is discarded
return self::validateFormFieldString($fieldname, $fielddata, $newfieldvalue);
}
// Line 175 — SAME BUG
public static function validateFormFieldUrl($fieldname, $fielddata, $newfieldvalue)
{
$fielddata['string_type'] == 'url'; // == comparison: result is discarded
return self::validateFormFieldString($fieldname, $fielddata, $newfieldvalue);
}
```
What happens:
$fielddata['string_type']is never set to'mail'validateFormFieldString()checksstring_typeto decide which validation to apply- Since it's unset,
FILTER_VALIDATE_EMAILis never called - Validation falls through to a permissive fallback regex:
/^[^\r\n\t\f\0]*$/D - This regex allows
|,;,&,$, ```, and all other shell metacharacters
Intended code:
```php
$fielddata['string_type'] = 'mail'; // = assignment
```
Bug 2: OS Command Injection via acme.sh Installation (CWE-78)
File: lib/Froxlor/Cron/Http/LetsEncrypt/AcmeSh.php
```php
// Line 428
FileDir::safe_exec(
"wget -O - https://get.acme.sh | sh -s email=" . Settings::Get('panel.adminmail'),
$return,
['|'] // pipe character EXPLICITLY ALLOWED
);
```
What happens:
Settings::Get('panel.adminmail')returns the unsanitized value from Bug 1safe_exec()normally blocks|as a dangerous character- But
['|']in the third argument whitelists pipe for this specific call (needed forwget | sh) - An attacker's pipe-based payload passes through unblocked
- The cron job runs as root
The Chain
```
Admin sets panel.adminmail = "[email protected] | COMMAND"
|
v
Bug 1: validateFormFieldEmail() does nothing (== typo)
|
v
Value stored to database as-is
|
v
Cron job runs AcmeSh::checkInstall() as root
|
v
Bug 2: safe_exec("wget ... | sh -s [email protected] | COMMAND", ..., ['|'])
|
v
COMMAND executes as root
```
Proof of Concept
vuln 1 PoC:
```
#!/usr/bin/env python3
"""
VULN-1 Live Verification: Email Validation Bypass
Tests against running Froxlor Docker instance.
"""
import re
import sys
import requests
TARGET = "http://localhost:8080"
USERNAME = "admin"
PASSWORD = "Admin123!@#"
How this vulnerability can be exploited
This issue can be reached over the network, attack complexity is low, an attacker needs administrative privileges on the target. No user interaction is required. The scope is changed, meaning a successful attack can affect components beyond the vulnerable one. Rated impact: confidentiality high, integrity high, availability high.
Weakness class
CVE-2026-26279 is classified as CWE-78: OS Command Injection. Untrusted input reaches a shell command without neutralisation, so an attacker can run arbitrary operating system commands.
Affected software
CVE-2026-26279 is recorded against 2 packages.
- froxlor (fixed in 2.3.4)
- froxlor/froxlor (fixed in 2.3.4)
Timeline and source
Published on 3 March 2026 and last revised on 17 June 2026. A public exploit is known to exist, which raises the urgency of patching considerably. A vendor advisory or fix has been published. Record sourced from NVD.
References
Details
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| froxlor | — | 2.3.4 |
| froxlor/froxlor | — | 2.3.4 |
References
Similar Threats
- High CVE-2023-3172
- Critical CVE-2023-3173
- High CVE-2023-2666
- Critical CVE-2023-2034
- Critical CVE-2023-1307
Exploit Protection
Are you running froxlor?
CVE-2026-26279 carries CVSS 9.5 Critical rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.
Check My Site For CVE-2026-26279 →No credit card required · Results in minutes
ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.