Uma vulnerabilidade de script de site cruzado (XSS) armazenada no editor DNS do Froxlor permite que um usuário autenticado com acesso ao editor DNS (rol do cliente) injete o JavaScript arbitrário na sessão do navegador de qualquer administrador. Quando um administrador visualiza a configuração DNS de um domínio afetado, a carga útil executa automaticamente — habilitando a tomada de conta de administrador completa, roubo de credenciais e compromisso completo do servidor. Três locais de código combinam para criar esta vulnerabilidade. ** 1. A validação de entrada não tira caracteres especiais do HTML** — `lib/Froxlor/Api/Commands/DomainZones.php: 158 ` ``` php // Apenas tira caracteres não imprestíveis. ( 0 x 3 C/ 0 x 3 E) passar por um conteúdo de $ não modificado = preg_ replace('/[^\x 09 \x 20 -\x 7 E]/', '', $content); $content = Dns::encloseTXTContent($ content); // só enrola nas citações, sem codificação HTML ```.

** 2. Mostrar callback retorna HTML sem fuga** — `lib/Froxlor/UI/Callbacks/Text.php: 95 `. ````php public static function wordwrap(array $attributes): string { return wordwrap($attributes['data']), 100, ' ', true); // no htmlspecialchars() } ``` ** 3. O modelo Twig renderiza a saída de chamadas com `.raw`** — ` templates/ Froxlor/table/table.html.twig: 57 ` `` ` twig {% outra coisa%} {{ td.data (')raw }} {# string from wordwrap() — renderizado sem escapar do #} {% endif%} ```.

A tabela do editor DNS atribui `[ Texto::classe, 'wordwrap']' como o callback para a coluna `content' (`lib/tablelisting/tablelisting.dns.php: 58 `). O callback retorna uma string não- iterável, então o modelo cai para o ramo `.raw `. Além disso, o cabeçalho da Política de Segurança de Conteúdo (`lib/Froxlor/UI/Panel/UI.php: 140 `) inclui `'inline- insegura''', tornando CSP completamente ineficaz como uma mitigação: ``` Conteúdo-Segurança-Política: 'self' do padrão- src; 'self' do script-src' 'inline inseguro' 'inseguro';... ````.

**Prerequisitos:** Froxlor executando com DNS habilitado (`system.dnsenabled = 1 `), pelo menos um domínio com o editor DNS habilitado, e uma conta de usuário (cliente ou administrador) com acesso ao editor DNS. **Passo 1 — Injete a carga útil** (via interface de usuário da web ou API como qualquer usuário habilitado para DNS): Navegue para o editor DNS para qualquer domínio, adicione um registro TXT com: - Registro: `@` - Tipo: `TXT` - Conteúdo: ` `.

**Passo 2 — Activador:**. Não é necessária interação além da navegação da página. O fogo de carga útil na página carrega automaticamente no momento em que qualquer visita do administrador logado: Este URL é parte do fluxo de trabalho normal do administrador (gestão de domínios → editor DNS). Sem clique, sem submissão do formulário, sem condições especiais — visitar o URL é suficiente. **Verifique através da linha de comandos** (login + fetch em uma linha). ```bash T=$(curl -sc /tmp/c (') grep -oP 'csrf-token" content="\K[^"]+') && \ curl -sc /tmp/c -b /tmp/c \ -d "loginname=admin&password=PASS&dologin= 1 &send=send&csrf_token=$T" -o /dev/null && \ curl -sb /tmp/c " \. grep -o ' ]*>' ```.

Saída esperada confirmando carga útil inesquecível na fonte da página. Em uma sessão de navegador, o ` alert()` dispara imediatamente — não é necessário cliques. **Tipo:** Gravação de Sito Cruzado armazenado (XSS armazenado). **Quem é impactado:** Qualquer instalação Froxlor com funcionalidade de editor DNS ativada. O ataque requer uma conta de cliente de baixa prioridade com `dnsenabled = 1 ` — uma funcionalidade padrão concedida aos clientes de hospedagem. A vítima é qualquer administrador que veja a configuração DNS do domínio afetado. Um atacante do mundo real substituiria ` alert()` por uma carga útil que exfiltra silenciosamente o cookie de sessão de administração, então o usa para criar uma conta de administração de backdoor, ler todas as credenciais do cliente ou executar comandos arbitrários no servidor subjacente através da interface de configuração do sistema do Froxlor.

Aplicar ** um** do seguinte. ** Opção A (recomendada) — Remover `.raw` do modelo da tabela:** ```twig {# templates/Froxlor/table/table.html.twig: 57 #} {{ td.data } {# A escada automática do ramo controla o #} ``` Chamadas que retornam intencionalmente HTML (por exemplo, botões de ação) devem devolver um array estruturado com uma chave `macro` em vez de uma string em bruto.

** Opção B — Escape na chamada de volta:**. ``` php // lib/ Froxlor/UI/Callbacks/Text.php public static function wordwrap(array $attributes): string { return wordwrap(htmlspecialchars($attributes['data']), ENT_ QUOTES, 'UTF- 8 '), 100, ' ', true); } ``` ** Opção C — Saneia na entrada:**. ``` php // lib/ Froxlor/ Api/ Commands/DomainZones.php após a linha 160 $content = htmlspecialchars($content, ENT_ QUOTES, 'UTF- 8 '); ``` Remova também `'inline- insegura'' e `'eval- insegura'' do cabeçalho CSP no `lib/Froxlor/ UI/ Panel/ UI.php: 140 `.

--- Se possível, por favor, aplique para um CVE quando publicar. Registro de aconselhamento: GHSA- 43 gm- 9 rr 3 - cx 7 g. Identificadores relacionados: CVE- 2026 - 54347. Tempo: GitHub Advisory Database publicou este registro em 2026 - 08 - 18 T 20: 47: 53.000 Z e lista a sua última modificação como 2026 - 08 - 18 T 20: 47: 53.000 Z.

Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N. Software afetado e informações de versão: pacote de pacotes Packagist froxlor/froxlor — ECOSYSTEM: introduzido 0, corrigido 2.3.8. Classificação e evidência: identificadores de fraqueza CWE- 79. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.