CVE-2026-54347: Froxlor Stored XSS in DNS TXT Record Leads to Admin Account Takeover
A customer-level Froxlor user can store JavaScript in a DNS TXT record that executes in any administrator's browser, handing the attacker full control of the panel.

The problem
Froxlor's DNS editor accepts TXT record content, strips only non-printable bytes, and stores the result verbatim. HTML special characters such as < and > pass through unmodified.
When an administrator opens the DNS editor for the affected domain, the stored value is passed through a Text::wordwrap() callback and rendered into the page via a Twig |raw filter with no escaping. The script executes immediately on page load, no click required.
The panel's Content-Security-Policy also includes 'unsafe-inline', so CSP provides no protection.
Proof of concept
A working proof-of-concept for CVE-2026-54347 in froxlor/froxlor, with the exact payload below.
<img src=x onerror=alert(document.domain)>Three code locations chain to produce the vulnerability. DomainZones.php only runs preg_replace('/[^\x09\x20-\x7E]/', '', $content), which accepts < (0x3C) and > (0x3E) without encoding them. The Text::wordwrap() display callback then calls PHP's wordwrap() on the raw value and returns it as a plain string.
The Twig table template hits the {{ td.data|raw }} branch for any non-iterable callback result, so the browser receives the angle brackets intact and executes the injected tag.
The fix in 2.3.8 (commit a1d8f425b11ef7597949018814afa056a842cba0) applies htmlspecialchars() before wordwrap() in the callback, so < and > become < and > before they ever reach the template. CWE-79.
The fix
Upgrade to froxlor/froxlor 2.3.8 or later. The patch escapes special characters in the Text::wordwrap() display callback before the value reaches the Twig |raw branch. As an additional hardening step, remove 'unsafe-inline' and 'unsafe-eval' from the Content-Security-Policy header in lib/Froxlor/UI/Panel/UI.php.
Related research
- high · 7.2CVE-2026-54348CVE-2026-54348: Froxlor Second-Order SQL Injection via Admins.add ipaddress Parameter
- critical · 9CVE-2026-62988CVE-2026-62988: Froxlor API Credential and 2FA Secret Disclosure
- high · 8.1LibreNMS SSRF-Driven Stored XSS via Oxidized API Response Fields
- high · 8.1CVE-2026-32257CVE-2026-32257: Winter CMS Stored XSS via Backend Brand Settings Custom Styles