Unknown · Frankenphp · CVE-2026-24895
**Nome do Software Vulnerável e Versões Afetadas**
Versões do FrankenPHP anteriores à 1.11.2
**Descrição**
A lógica de divisão de caminho CGI do FrankenPHP manipula inadequadamente caracteres Unicode durante a conversão de caixa. A lógica calcula o índice de divisão para encontrar `.php` em uma cópia do caminho da requisição em minúsculas, mas aplica esse índice de byte ao caminho original. Como `strings.ToLower()` em Go pode aumentar o comprimento em bytes de certos caracteres UTF-8, o índice calculado pode não se alinhar com a posição correta na string original. Isso resulta em um `SCRIPT NAME` e `SCRIPT FILENAME` incorretos, potencialmente fazendo com que o FrankenPHP execute um arquivo diferente daquele pretendido pela URI. A vulnerabilidade reside na função `splitPos()` e no seu uso dentro de `splitCgiPath()`. O problema é que o índice retornado representa um offset de byte dentro do caminho em minúsculas, mas este índice é usado para fatiar o caminho original. Esta lógica depende da suposição de que o comprimento do caminho em minúsculas é igual ao comprimento do caminho original, o que é falso para certos caracteres Unicode. Por exemplo, o caractere `Ⱥ` (U+023A) requer 2 bytes em UTF-8, mas seu equivalente em minúsculas `ⱥ` (U+2C65) requer 3 bytes. Se o caminho contiver tais caracteres antes da extensão `.php`, o índice calculado no caminho em minúsculas será maior que a posição correspondente no caminho original. Quando aplicado ao caminho original, a divisão ocorre no offset de byte errado. Isso pode fazer com que o servidor trate uma porção maior do caminho como o nome do script, efetivamente permitindo que um atacante manipule o `SCRIPT FILENAME`. Esta é uma questão de bypass de limite de segurança e confusão de caminho que pode levar à Execução Remota de Código (RCE) em configurações onde os usuários podem fazer upload de arquivos para um caminho acessível. A vulnerabilidade pode ser explorada elaborando uma requisição com caracteres Unicode específicos para forçar o FrankenPHP a calcular o `SCRIPT FILENAME` como terminando em um arquivo com uma extensão segura (ex: `payload.txt`), enquanto a requisição parece conter `.php` para a lógica interna do roteador. A função vulnerável é `splitPos()`, que é usada por `splitCgiPath()`. Os parâmetros vulneráveis são as variáveis `path` e `split` usadas dentro dessas funções.
**Recomendações**
Versões anteriores à 1.11.2 devem ser atualizadas para a versão 1.11.2 ou posterior.