Underflow in PHP-FPM can lead to RCE
Corrige ahora. Ella está bajo explotación confirmada por CISA y tiene exploit funcional público.
Apply updates per vendor instructions.
Resumen
Falha de integer underflow no PHP-FPM (sapi/fpm/fpm_main.c) que, em configurações específicas de nginx repassando PATH_INFO ao PHP via FastCGI, permite escrita fora dos limites do buffer reservado para dados do protocolo FastCGI, abrindo caminho para execução remota de código. O CVSS alto (8.7, AC:H) é justificado: a exploração não funciona contra qualquer instalação PHP-FPM — depende de um bloco de configuração nginx específico (muito comum em tutoriais e imagens Docker) que faz split de PATH_INFO via regex antes de passar ao FPM.
Detalle técnico
O bug está na rotina de fpm_main.c que calcula o comprimento de PATH_INFO/PATH_TRANSLATED a partir do request_uri recebido via FastCGI. Em certas combinações de PATH_INFO vazio ou malformado (dependente de como o frontend fez o split do path), a subtração usada para determinar o tamanho do path_info restante resulta em valor negativo que, armazenado em variável sem sinal (size_t), sofre underflow e se transforma num número enorme. Esse valor é então usado para escrever na região de memória reservada para os dados do protocolo FastCGI (o buffer que guarda os registros da requisição FCGI), corrompendo estruturas adjacentes na heap do processo worker do PHP-FPM.
Cómo se explota
Padrão CWE-191 (Integer Underflow) que degenera em CWE-787 (Out-of-Bounds Write). O atacante não controla diretamente um ponteiro ou offset — ele controla o request_uri e a query string enviados via HTTP, que o frontend (tipicamente nginx) reencaminha ao PHP-FPM via FastCGI após aplicar uma regex de split de path_info. Manipulando o formato da URI de forma que o split produza um path_info de tamanho inconsistente com o esperado, o atacante induz o cálculo negativo dentro do FPM.
Pré-requisito central, ignorado por quem só vê o CVSS: a instância precisa estar atrás de um proxy (nginx é o caso documentado) configurado com diretiva de split de PATH_INFO (ex.: `fastcgi_split_path_info`) e repasse do parâmetro `PATH_INFO` para o FastCGI — configuração amplamente copiada de exemplos oficiais de nginx+PHP-FPM e de imagens Docker prontas, mas não universal. Instalações que usam PHP como módulo Apache (mod_php) ou PHP-FPM sem esse split de path_info não são exploráveis por este vetor. Não é necessária autenticação nem interação do usuário (UI:N, PR:N), mas a complexidade de ataque é alta (AC:H) justamente pela dependência de configuração.
O resultado documentado por pesquisadores e replicado em PoC pública e módulo Metasploit é execução remota de código no processo worker do PHP-FPM. A CVE está no catálogo KEV da CISA, confirmando exploração ativa in-the-wild — consistente com o fato de a configuração vulnerável ser comum em stacks nginx+PHP-FPM expostos, tornando o alvo abundante para scanning automatizado assim que a PoC se tornou pública.
Versiones
Cómo protegerse
Correção definitiva: atualizar para PHP 7.1.33, 7.2.24 ou 7.3.11 (ou versões posteriores dos respectivos ramos). Distribuições que mantêm numeração própria de pacote backportaram a correção independente da versão upstream 7.x: Red Hat corrigiu em php-5.4.16-46.1.el7_7 (RHEL 7, RHSA-2019:3286), php-5.3.3-50.el6_10 (RHEL 6, RHSA-2019:3287), rh-php71-php-7.1.30-2.el7 (Software Collections, RHSA-2019:3300) e rh-php72-php-7.2.24-1.el7 (Software Collections, RHSA-2019:3299) — ou seja, checar apenas o número de versão upstream do PHP não é suficiente em sistemas RHEL/CentOS baseados em pacotes da distro. Após aplicar o pacote, é necessário reiniciar o daemon httpd/php-fpm para o patch entrar em vigor.
Se a atualização não for possível de imediato, o paliativo real e amplamente recomendado na época foi alterar a configuração do proxy (nginx) para validar que o SCRIPT_FILENAME resolvido corresponde a um arquivo .php existente antes de repassar a requisição ao FastCGI (por exemplo, adicionando uma verificação de existência do arquivo antes do bloco `fastcgi_pass`), impedindo que requisições com PATH_INFO forjado alcancem o PHP-FPM. O custo é quebrar rotas que dependem legitimamente de PATH_INFO — funcionalidade rara na maioria das aplicações.
Mito a descartar: desabilitar `cgi.fix_pathinfo` no php.ini não corrige a falha, porque o underflow ocorre na rotina de parsing de path_info do fpm_main.c independentemente dessa diretiva. Restringir a exploração exige atacar a configuração do proxy, não uma flag do PHP.
Cómo detectar
Não há uma assinatura única e confiável de exploração, mas indícios úteis em log incluem: crashes ou reinícios repentinos de workers do PHP-FPM no error log (segmentation faults associados ao processo fpm), requisições HTTP para endpoints .php com PATH_INFO anômalo — sufixos, bytes de controle (como quebras de linha codificadas) ou caracteres inesperados após a extensão .php que não correspondem a uso legítimo de path_info da aplicação —, e picos de erros 502/500 em endpoints PHP coincidindo com scanning automatizado.
Como existe PoC pública e módulo Metasploit desde a divulgação, e a CVE está no catálogo KEV da CISA, é razoável assumir tentativas de exploração oportunista contra qualquer stack nginx+PHP-FPM exposta publicamente sem os devidos patches, mesmo sem log específico do fornecedor confirmando esse comportamento.