Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as customer with local shell
-
DeliveryPrime malicious ~/.ssh symlink swap loop
-
ExploitWin TOCTOU race before root cron write
-
ExecutionRoot cron appends key to /root/.ssh/authorized_keys
-
PersistSSH in as root
-
ImpactFull host takeover
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture TOCTOU prevention
|
| Exploitation Conditions | Requires the NON-DEFAULT setting system.allow_customer_shell=1, which grants customers interactive local shell access on the host; without it the attack is unreachable. The attacker must be an authenticated Froxlor customer (PR:L) with a shell account, and must win a TOCTOU race by atomically swapping their ~/.ssh directory for a symlink in the window between FileDir::makeCorrectDir()/makeCorrectFile() validation and the root cron's file_put_contents/chown, which lack O_NOFOLLOW or openat2(RESOLVE_NO_SYMLINKS) pinning. The race is limited by timing (AC:H) but the SSH-key-sync cron re-runs every interval, permitting unlimited attempts until success. |
| Impact | This is a genuine root-compromise primitive but tightly gated, making it a moderate real-world priority rather than an emergency. The vendor's CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L) is misleading: the description makes clear this is a LOCAL race requiring an interactive shell on the host, not a network attack, and the outcome is full root - inconsistent with the vector's VI:N/VA:N (integrity/availability = None). No EPSS, no CISA KEV entry, and no public exploit code are provided, so there is no evidence of active exploitation - this is a theoretical TOCTOU window disclosed by VulnCheck. The strongest mitigating factor is that exploitation requires the non-default setting system.allow_customer_shell=1; on default installs the attack surface does not exist. Against that, the impact is maximal (root) and the cron re-runs on every interval giving the attacker unlimited race attempts, which materially raises the practical win probability despite the AC:H timing requirement. Net: high technical impact, narrow reachability - patch on customer-shell-enabled multi-tenant panels, lower urgency elsewhere. |
| Exploit ScenarioDerived | On a Froxlor host where system.allow_customer_shell=1, an authenticated customer with local shell access runs a loop that atomically renames their ~/.ssh directory to a symlink pointing at /root/.ssh immediately after the root-run SshKeys cron validates the path but before it writes. When it wins the race, the root cron appends the customer's SSH public key to /root/.ssh/authorized_keys and chowns /root/.ssh to the customer, giving passwordless root SSH. No public exploit code is identified at time of analysis, but the cron's repeated execution makes the race winnable with brute-force persistence. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 26, 2026
Local privilege escalation to full root compromise on Froxlor panel hosts (2.3.10 and earlier) is achievable by an authenticated Froxlor customer holding a shell account, but only where the non-default setting system.allow_customer_shell=1 is enabled, which is a prerequisite for the attack to be reachable at all. The attacker wins a TOCTOU race in the root-run SSH key synchronization cron (lib/Froxlor/Cron/System/SshKeys.php, SshKeys::generateFiles) by atomically swapping their ~/.ssh directory for a symlink in the window between FileDir::makeCorrectDir()/makeCorrectFile() validation and the root-privileged file_put_contents/chown, causing the customer's public key to be appended to /root/.ssh/authorized_keys and /root/.ssh to be chowned to the customer; the cron re-runs every interval, so attempts are effectively unlimited until the race lands. No public exploit code has been identified at time of analysis and the issue is not in CISA KEV; it is a genuine root-compromise primitive but tightly gated by the non-default shell setting and by race timing, making it a moderate real-world priority rather than an emergency. The issue is fixed in Froxlor 2.3.12.
RemediationAI
Upgrade to Froxlor 2.3.12, the vendor-released patch (patch availability confirmed from vendor; EUVD confirms affected range ends below 2.3.12), following the vendor advisory at https://github.com/froxlor/froxlor/security/advisories/GHSA-927x-9jfh-mq42 and the VulnCheck advisory at https://www.vulncheck.com/advisories/froxlor-before-2.3.12-privilege-escalation-via-ssh-key-sync. If an immediate upgrade is not possible, the single most effective compensating control is to set system.allow_customer_shell=0, which removes the local shell access the race depends on; the trade-off is that customers legitimately relying on shell accounts lose that capability. As a second interim measure, remove or disable the Froxlor SSH key synchronization cron entry from the root crontab until patched, accepting that SSH keys added or changed through the panel will not be provisioned to accounts automatically. Enabling the kernel hardening sysctls fs.protected_symlinks=1 and fs.protected_hardlinks=1 adds defense in depth, but note the limitation that protected_symlinks primarily covers symlinks in sticky world-writable directories and is not a complete fix for a race against a user-owned ~/.ssh path. Because exploitation chowns /root/.ssh to the customer and appends to /root/.ssh/authorized_keys, monitor for unexpected ownership changes on /root/.ssh and for unknown keys in /root/.ssh/authorized_keys, and treat any such finding as a full root compromise requiring credential and key rotation on the panel host. There is no reliable way to win the race defensively while the vulnerable root cron remains active, so patching to 2.3.12 should be prioritized over tuning.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is a classic time-of-check time-of-use race (CWE-367) in Froxlor's PHP-based SSH key synchronization cron, which runs as root and reconciles panel-managed SSH public keys into customer and administrative home directories. The containment logic in FileDir::makeCorrectDir() and FileDir::makeCorrectFile() validates the path and rejects symlinks/escapes only at check time; the actual write re-resolves the live filesystem path as root using file_put_contents() with FILE_APPEND|LOCK_EX, followed by chmod/chown/chgrp. Because a database round-trip and additional file reads occur between validation and write, and because the code does not pin the target with O_NOFOLLOW or openat2(RESOLVE_NO_SYMLINKS) (and LOCK_EX on the opened file provides no protection against a directory component being swapped beforehand), a customer with local shell access can atomically replace their ~/.ssh directory with a symlink pointing at /root/.ssh between the check and the use. The root cron then appends the attacker-controlled public key into /root/.ssh/authorized_keys and changes ownership of /root/.ssh to the unprivileged customer, granting root SSH access; the append/chown sequence is what makes this more than a denial-of-service. This is described as a residual race that bypasses the check-time fix previously introduced for GHSA-mq5v-..., meaning the earlier hardening addressed symlink validation at check time but not the unresolved TOCTOU window. Affected CPE data identifies the Froxlor product family (cpe:2.3:a:froxlor:froxlor:*:*:*:*:*:*:*:*) with affected versions below 2.3.12 per EUVD.
Know when Froxlor 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Requires local shell (AV:L) and winning a timing race (AC:H) as an authenticated customer (PR:L); success crosses the customer/root boundary (S:C) yielding full root host compromise (C:H/I:H/A:H).
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
Froxlor 2.3.10 and earlier contain a time-of-check time-of-use (TOCTOU) race condition in the SSH key synchronization cron (lib/Froxlor/Cron/System/SshKeys.php, SshKeys::generateFiles). The containment/symlink validation performed by FileDir::makeCorrectDir()/makeCorrectFile() is done only at check time; the live filesystem path is re-resolved as root at write time (file_put_contents with FILE_APPEND|LOCK_EX, followed by chmod/chown/chgrp), with a database round-trip and file reads in between, and no path or file-descriptor pinning (no O_NOFOLLOW or openat2(RESOLVE_NO_SYMLINKS)). On installations where the non-default setting system.allow_customer_shell=1 grants customers local shell access, a customer can atomically swap their ~/.ssh directory for a symlink after the check and before the write, causing the root-run cron to append the customer's public key to /root/.ssh/authorized_keys and to chown /root/.ssh to the customer, resulting in full root compromise of the panel host. The cron re-runs on every interval, allowing unlimited attempts. This is a residual race that bypasses the check-time fix introduced for GHSA-mq5v-... . The issue is fixed in Froxlor 2.3.12.
Technical POC Analysis
CWE-367 (Time-of-check Time-of-use Race Condition) in lib/Froxlor/Cron/System/SshKeys.php, function SshKeys::generateFiles(), which runs as root from the Froxlor cron.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Froxlor panel hosts running version 2.3.10 or earlier are exposed to a local privilege escalation that can give a customer with shell access full root control of the hosting server, potentially compromising all hosted tenants, data, and connected systems. The flaw requires the non-default setting system.allow_customer_shell=1 to be enabled, so exposure is limited to environments that intentionally grant shell access to customers. Leadership should prioritize patching because a successful root compromise on a shared hosting panel can lead to broad service disruption, data breach, and regulatory exposure.
Apply vendor patch.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Command Injection in GitHub repository froxlor/froxlor prior to 2.0.8. Rated high severity (CVSS 8.8), this vulnerabilit
Improper Restriction of Excessive Authentication Attempts in GitHub repository froxlor/froxlor prior to 2.0.20. Rated cr
Authentication Bypass by Primary Weakness in GitHub repository froxlor/froxlor prior to 2.0.13. Rated critical severity
Froxlor through 0.10.29.1 allows SQL injection in Database/Manager/DbManagerMySQL.php via a custom DB name. Rated critic
Command injection in Froxlor server admin before 2.3.4 due to typo (== instead of =) disabling input validation entirely
Improper Link Resolution Before File Access in GitHub repository froxlor/froxlor prior to 2.1.0. Rated high severity (CV
Unrestricted Upload of File with Dangerous Type in GitHub repository froxlor/froxlor prior to 2.0.14. Rated high severit
Cross-Site Request Forgery (CSRF) in GitHub repository froxlor/froxlor prior to 2.0.11. Rated high severity (CVSS 8.8),
Code Injection in GitHub repository froxlor/froxlor prior to 2.0.11. Rated high severity (CVSS 8.8), this vulnerability
Code Injection in GitHub repository froxlor/froxlor prior to 2.0.10. Rated high severity (CVSS 8.8), this vulnerability
An issue was discovered in Froxlor before 0.10.14. Rated high severity (CVSS 8.8), this vulnerability is remotely exploi
Froxlor is open source server administration software. Rated high severity (CVSS 7.5), this vulnerability is remotely ex
EUVD-2026-87686
GHSA-cvg5-3xjx-32m5
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB