CVE-2026-26279
Froxlor Admin-to-Root Privilege Escalation via Input Validation Bypass + OS Command Injection
Froxlor is open source server administration software. Prior to 2.3.4, 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 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. This vulnerability is fixed in 2.3.4.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- High
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
9.1
Froxlor Admin-to-Root Privilege Escalation via Input Validation Bypass + OS Command Injection
Froxlor is open source server administration software. Prior to 2.3.4, 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 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. This vulnerability is fixed in 2.3.4.
- Record
CVE-2026-26279- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-78, CWE-482
- Updated
- 2026-11-02
EUVDEUVD-2026-9340
9.1
Froxlor is open source server administration software. Prior to 2.3.4, 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 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. This vulnerability is fixed in 2.3.4.
- Record
EUVD-2026-9340- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-33mp-8p67-xj7c
9.1
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:
-
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.
-
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. -
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. -
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.
-
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
// 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:
$fielddata['string_type'] = 'mail'; // = assignment
Bug 2: OS Command Injection via acme.sh Installation (CWE-78)
File: lib/Froxlor/Cron/Http/LetsEncrypt/AcmeSh.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 1 -…
- Record
GHSA-33mp-8p67-xj7c- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-78, CWE-482
- Updated
- 2026-11-02
NVD
9.1
Froxlor is open source server administration software. Prior to 2.3.4, 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 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. This vulnerability is fixed in 2.3.4.
- Record
CVE-2026-26279- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-78, CWE-482
- Updated
- 2026-11-02
OSV
9.1
Froxlor Admin-to-Root Privilege Escalation via Input Validation Bypass + OS Command Injection
Froxlor is open source server administration software. Prior to 2.3.4, 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 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. This vulnerability is fixed in 2.3.4.
- Record
CVE-2026-26279- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-482, CWE-78
- Updated
- 2026-11-02
OSVGHSA-33mp-8p67-xj7c
9.1
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:
-
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.
-
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. -
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. -
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.
-
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
// 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:
$fielddata['string_type'] = 'mail'; // = assignment
Bug 2: OS Command Injection via acme.sh Installation (CWE-78)
File: lib/Froxlor/Cron/Http/LetsEncrypt/AcmeSh.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 1 -…
- Record
GHSA-33mp-8p67-xj7c- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H - Weakness
- CWE-482, CWE-78
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
froxlor/froxlorPackagist |
through 2.3.3 | 2.3.4 |
froxlor/froxlorPackagist |
before 2.3.4, plus listed versions 0.10.00.10.0-rc10.10.0-rc20.10.10.10.10 Show 45 moreShow less0.10.110.10.120.10.130.10.140.10.150.10.160.10.170.10.180.10.190.10.20.10.200.10.210.10.220.10.230.10.23.10.10.240.10.250.10.260.10.270.10.280.10.290.10.29.10.10.30.10.300.10.310.10.320.10.330.10.340.10.34.10.10.350.10.35.10.10.360.10.370.10.380.10.38.10.10.38.20.10.38.30.10.40.10.50.10.60.10.70.10.80.10.92.0.02.0.1 |
2.3.4 |
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-26279 is a critical vulnerability (CVSS 9.1) in Froxlor, published March 3, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.93%, the 60th percentile. Fixed in froxlor/froxlor 2.3.4.
References
github.com/froxlor/Froxlor/security/advisories/GHSA-33mp-8p67-xj7c
github.com/froxlor/froxlor/commit/22249677107f8f39f8d4a238605641e87dab4343
github.com/froxlor/froxlor/releases/tag/2.3.4
nvd.nist.gov/vuln/detail/CVE-2026-26279
github.com/advisories/GHSA-33mp-8p67-xj7c
github.com/CVEProject/cvelistV5/tree/main/cves/2026/26xxx/CVE-2026-26279.json
github.com/froxlor/froxlor
Left out here: 55 versions and the rest of 2 source descriptions. The JSON record has them.