Aug 19, 2026·6 min read·16 visits
Froxlor API endpoints leak raw bcrypt password hashes and raw TOTP seeds to authenticated users, enabling complete multi-factor authentication bypass and administrative takeover.
An insecure data retrieval flaw in the Froxlor server administration panel API allows authenticated remote attackers to retrieve unredacted bcrypt password hashes and Base32-encoded Time-Based One-Time Password (TOTP) seeds. Affected endpoints include several 'get' and 'listing' handlers for customers, administrators, and FTP accounts. Utilizing these leaked parameters, attackers can crack the password hashes offline and concurrently generate valid second-factor authentication codes to completely bypass access controls.
CVE-2026-62988 is a critical information disclosure and authentication bypass vulnerability affecting Froxlor, an open-source server administration platform. The bug is located in the application's API layer, specifically within the command handlers responsible for managing administrators, customers, and FTP accounts. Affected versions include release 2.3.7 up to, but not including, version 2.3.8.
The attack surface is exposed through the authenticated JSON-RPC and REST API endpoints. Although an attacker must have valid API credentials to call the affected functions, the permissions required do not need to be administrative to access some of the vulnerable customer or FTP paths. This allows horizontal or vertical privilege escalation depending on the user's initial access level.
When queried, the API retrieves complete record definitions from the backend database. This data includes password hashes and multi-factor authentication secrets. Because the API layer originally serialized these records without removing security-critical fields, it returned them in cleartext and raw crypt formats to the calling client.
The underlying vulnerability is classified as CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor). It stems from insecure over-fetching practices inside the database abstraction layer coupled with a lack of output filtering in the command controllers. The affected files are lib/Froxlor/Api/Commands/Customers.php, lib/Froxlor/Api/Commands/Admins.php, and lib/Froxlor/Api/Commands/Ftps.php.
In the vulnerable implementation, when a client calls the get or listing commands, the backend executes standard database queries using PHP Data Objects (PDO). The return value of these queries is a complete associative array representing the database rows. Crucially, fields containing sensitive secrets—specifically the password column (which stores bcrypt hashes) and the data_2fa column (which contains the Base32-encoded seed for Time-Based One-Time Passwords)—were fetched and retained within this array.
The controller immediately passed this unfiltered associative array into the $this->response() serialization function. This resulted in the direct exposure of both credentials within the API JSON payload. An authenticated user possessing permission to view their own account or other customer accounts could thereby extract the secret keys of targeted profiles.
The remediation of this vulnerability required two successive patches due to an initial logical flaw and a variable typo.
In the first patch (52a43fb826bb9a058faf9c39feeef7ac4444ceba), the developer attempted to employ a block-list sanitization strategy. The code iterated through the SQL query results and used the PHP unset() function to strip password and data_2fa keys before returning the array to the client.
// In lib/Froxlor/Api/Commands/Admins.php (Commit 1)
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
unset($row['password']);
unset($row['data_2fa']);
$result[] = $row;
}However, this first patch introduced a critical logical typo inside lib/Froxlor/Api/Commands/Ftps.php:
// In lib/Froxlor/Api/Commands/Ftps.php (Commit 1 - FLOPPED)
$result = Database::pexecute_first($result_stmt, $params, true, true);
if ($result) {
unset($row['password']); // BUG: $row does not exist in this block; should be $result
return $this->response($result);
}Because $row was undefined in the Ftps.php::get() method, the unset() operation silently failed, and the full $result array containing the password field was sent back to the API client.
Furthermore, this global block-list approach broke internal backend processes. When other parts of the panel executed internal API calls (such as calling Admins.get during an update() workflow to check privileges), the sanitized array lacked the passwords and 2FA secrets required for internal validation.
To resolve both the typo and the internal breakage, the second patch (8667fa3a4d77d6e322b7b8f7b9edbc1613ab5797) introduced an internal execution flag checking routine ($this->isInternal()). When internal components invoke API functions, the flag is set to true, and the secrets remain available in the memory array. For external clients, $this->isInternal() evaluates to false, and the fields are stripped correctly.
// In lib/Froxlor/Api/Commands/Admins.php (Commit 2)
if (!$this->isInternal()) {
unset($result['password']);
unset($result['data_2fa']);
}Exploiting this vulnerability requires network access to the Froxlor API endpoint and valid credentials or an active session token. An attacker sends a crafted API request to retrieve details about an administrator or user account. No user interaction or elaborate chaining is required to execute this step.
{
"header": {
"apikey": "attacker_api_key",
"secret": "attacker_api_secret"
},
"body": {
"command": "Admins.get",
"params": {
"id": 1
}
}
}Upon receiving the API response, the attacker parses the JSON string to extract the password and data_2fa fields. The password field contains a standard blowfish/bcrypt password hash. The attacker then conducts offline dictionary or brute-force attacks against the hash using specialized utilities like Hashcat.
hashcat -m 3200 -a 0 froxlor_hash.txt wordlist.txtSimultaneously, the attacker decodes the data_2fa string, which is the plaintext Base32-encoded TOTP seed. Using a utility such as oathtool, the attacker can instantly generate valid security codes in real-time.
oathtool --totp -b "JBSWY3DPEHPK3PXP"Combining the cracked password with the synchronously generated TOTP code, the attacker logs in through the primary admin panel interface, completely bypassing multi-factor authentication barriers.
The impact of CVE-2026-62988 is severe, warranting a CVSS score of 9.0 (Critical). Because Froxlor is a server administration panel, compromising an administrative account yields full control over the underlying operating system. This allows the attacker to execute shell commands, alter database contents, modify web root files, and manage system services.
By obtaining both the password hash and the active TOTP seed, the attacker invalidates the entire multi-factor authentication model. There is no fallback security layer to prevent the login, as both elements of the 'something you know' and 'something you have' paradigms are exposed concurrently.
Additionally, the leakage of FTP passwords allows attackers to log in directly to file hosting environments via standard FTP clients, circumventing the web application interface entirely. This facilitates easy upload of web shells, ransomware, or arbitrary PHP injection vectors into all hosted websites.
The primary and recommended resolution is to upgrade the Froxlor installation to version 2.3.8 or higher. The release package contains both the API sanitization routines and the necessary logical checks to preserve internal backend functionality.
For deployments where immediate upgrading is not feasible, administrators should manually apply the second patch's code changes. It is critical to ensure that both password and data_2fa fields are unset when $this->isInternal() evaluates to false. Ensure that the FTP controller unsets $result['password'] instead of $row['password'] to prevent the typo bypass.
Additionally, after upgrading or applying the patch, administrators should enforce a panel-wide password reset and regenerate all TOTP secrets. Because the database fields were previously exposed, any administrator or customer record queried before the patch was applied should be treated as compromised. Defensive teams should inspect API query logs for anomalous invocations of Admins.get, Admins.listing, Customers.get, and Customers.listing to identify historical exploitation attempts.
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:L| Product | Affected Versions | Fixed Version |
|---|---|---|
froxlor froxlor | >= 2.3.7, < 2.3.8 | 2.3.8 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-200 |
| Attack Vector | Network (AV:N) |
| CVSS v3.1 Score | 9.0 (Critical) |
| Exploit Status | Proof of Concept (PoC) documented |
| CISA KEV Status | Not Listed |
| Impact | Authentication Bypass and Account Takeover |
The product exposes sensitive information to an actor who is not authorized to have access to that information.
An LDAP injection vulnerability exists in the centraldogma-server-auth-shiro module of LY Corporation Central Dogma before version 0.84.0. The search logic dynamically constructs LDAP search filters by interpolating user-provided usernames without escaping RFC 4515 metacharacters. Unauthenticated remote attackers can leverage this flaw to bypass authentication, enumerate directory hierarchies, and access unauthorized resources.
CVE-2026-11746 is a critical vulnerability in Central Dogma Server prior to version 0.84.0, where an embedded ZooKeeper replication secret silently falls back to a publicly known, hard-coded default string ('ch4n63m3'). Remote attackers with access to the replication network can authenticate as legitimate cluster peers, potentially leading to unauthorized data exposure, state manipulation, or complete cluster takeover.
A logical verification flaw in ZITADEL's external JWT Identity Provider validation allows attackers to bypass session expiration checks. If an incoming JWT lacks the 'exp' claim, the system skips validation entirely, creating an indefinitely valid session. This issue has been addressed in versions 3.4.12 and 4.15.2.
CVE-2026-59149 identifies a directory traversal vulnerability in `@mockoon/commons-server`, the backend mock-server library powering the Mockoon application. The flaw occurs in the path containment validation logic used during raw file response generation. An unauthenticated attacker can exploit this weakness to retrieve arbitrary files from sibling directories sharing a common prefix with the designated static base directory.
An in-depth analysis of CVE-2026-59148, a high-severity flaw in Mockoon where unauthenticated administrative endpoints and a wildcard Cross-Origin Resource Sharing (CORS) policy allow remote execution, state poisoning, and credential theft.
An improper authentication vulnerability (CWE-287) in ZITADEL's external identity provider handler before version 4.15.3 allows remote attackers to perform complete account takeover. When auto-linking by email is enabled, ZITADEL verifies that the local target account has a verified email address but fails to verify if the external provider confirmed ownership of that same email. Attackers can exploit this by registering an unverified account with a victim's email address on a permissive external provider, leading to unauthorized account binding and persistent access.