Skip to main content

Froxlor EUVDEUVD-2026-87686

| CVE-2026-100713 HIGH
Time-of-check Time-of-use (TOCTOU) Race Condition (CWE-367)
2026-09-26 VulnCheck GHSA-cvg5-3xjx-32m5
7.1
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

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

  1. Access
    Authenticate as customer with local shell
  2. Delivery
    Prime malicious ~/.ssh symlink swap loop
  3. Exploit
    Win TOCTOU race before root cron write
  4. Execution
    Root cron appends key to /root/.ssh/authorized_keys
  5. Persist
    SSH in as root
  6. Impact
    Full 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.

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

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

Alert me

AnalysisAIv1 – 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

Froxlor 0 <2.3.12

Affected Packages

euvd froxlor fix: 2.3.12

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

Vendor (VulnCheck) PRIMARY 7.1 HIGH
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
vuln.today AI 7.8 HIGH

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).

3.1 AV:L/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H
4.0 AV:L/AC:H/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Sep 26, 2026 - 14:02 EUVD
CVE Published
Sep 26, 2026 - 13:24 cve.org
HIGH 7.1

DescriptionCVE.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

Why It Matters

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.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 96% exploitable
Prevalence
Low
niche open-source shared-hosting control panel, limited enterprise footprint
Data Quality
4 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment GitHub VulDB

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.2%
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
None
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

36
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0
CVE-2023-0315 HIGH POC
8.8 Jan 16

Command Injection in GitHub repository froxlor/froxlor prior to 2.0.8. Rated high severity (CVSS 8.8), this vulnerabilit

CVE-2023-3173 CRITICAL POC
9.8 Jun 09

Improper Restriction of Excessive Authentication Attempts in GitHub repository froxlor/froxlor prior to 2.0.20. Rated cr

CVE-2023-1307 CRITICAL POC
9.8 Mar 10

Authentication Bypass by Primary Weakness in GitHub repository froxlor/froxlor prior to 2.0.13. Rated critical severity

CVE-2021-42325 CRITICAL POC
9.8 Oct 12

Froxlor through 0.10.29.1 allows SQL injection in Database/Manager/DbManagerMySQL.php via a custom DB name. Rated critic

CVE-2026-26279 CRITICAL POC
9.1 Mar 03

Command injection in Froxlor server admin before 2.3.4 due to typo (== instead of =) disabling input validation entirely

CVE-2023-6069 HIGH POC
8.8 Nov 10

Improper Link Resolution Before File Access in GitHub repository froxlor/froxlor prior to 2.1.0. Rated high severity (CV

CVE-2023-2034 HIGH POC
8.8 Apr 14

Unrestricted Upload of File with Dangerous Type in GitHub repository froxlor/froxlor prior to 2.0.14. Rated high severit

CVE-2023-1033 HIGH POC
8.8 Feb 25

Cross-Site Request Forgery (CSRF) in GitHub repository froxlor/froxlor prior to 2.0.11. Rated high severity (CVSS 8.8),

CVE-2023-0877 HIGH POC
8.8 Feb 17

Code Injection in GitHub repository froxlor/froxlor prior to 2.0.11. Rated high severity (CVSS 8.8), this vulnerability

CVE-2023-0671 HIGH POC
8.8 Feb 04

Code Injection in GitHub repository froxlor/froxlor prior to 2.0.10. Rated high severity (CVSS 8.8), this vulnerability

CVE-2020-10235 HIGH POC
8.8 Mar 09

An issue was discovered in Froxlor before 0.10.14. Rated high severity (CVSS 8.8), this vulnerability is remotely exploi

CVE-2023-50256 HIGH POC
7.5 Jan 03

Froxlor is open source server administration software. Rated high severity (CVSS 7.5), this vulnerability is remotely ex

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