BLOG | NGINX

Abordando a vulnerabilidade PHP-FPM (CVE-2019-11043) com NGINX

NGINX-Parte-de-F5-horiz-preto-tipo-RGB
Miniatura de Owen Garrett
Owen Garrett
Publicado em 29 de outubro de 2019

Uma vulnerabilidade relatada recentemente, rastreada como CVE-2019-11043 , pode afetar sites que usam PHP‑FPM para executar páginas PHP. O uso do PHP-FPM é particularmente comum em sites com tecnologia NGINX porque o NGINX não tem um tempo de execução PHP em processamento. Em vez disso, o NGINX atua como um proxy reverso para servidores de aplicativos e gerenciadores de processos, como o PHP‑FPM.

A vulnerabilidade está no próprio PHP‑FPM, não no NGINX, então a única solução garantida é atualizar para a versão corrigida (ou posterior) da sua versão do PHP: PHP 7.1.33 , PHP 7.2.24 ou PHP 7.3.11 .

Qual é a natureza da vulnerabilidade?

O NGINX se comunica com o PHP‑FPM usando o protocolo FastCGI. Cada mensagem FastCGI contém um conjunto de variáveis de ambiente. Um deles, PATH_INFO , é derivado de outros parâmetros de solicitação. Se seu valor estiver inesperadamente vazio, isso pode causar corrupção de memória no binário PHP‑FPM . É possível explorar essa situação e fazer com que o binário PHP‑FPM execute comandos arbitrários no servidor local.

Essa vulnerabilidade pode ser acionada por uma configuração comum do NGINX, na qual o NGINX usa uma expressão regular na diretiva fastcgi_split_path_info para dividir o URI da solicitação em duas partes. Uma maneira de acionar a vulnerabilidade é incorporar um caractere de quebra de linha ( %0a ) ou retorno de carro ( %0d ) no URI da solicitação, que não é manipulado corretamente pela expressão regular.

Mitigando a vulnerabilidade

Conforme mencionado acima, a única maneira segura de resolver essa vulnerabilidade é atualizar para a versão corrigida (ou posterior) da sua versão do PHP: PHP 7.1.33 , PHP 7.2.24 ou PHP 7.3.11 .

Se você não puder atualizar seu binário PHP imediatamente, há várias medidas parciais que você pode tomar:

  1. Várias fontes sugeriram adicionar uma diretiva try_files à configuração do NGINX para verificar se a variável $uri resolve para um arquivo (o script PHP) e rejeitar a solicitação com código 404(Não encontrado) se não:

    localização ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    try_files $uri =404;
    #...
    }

    Observe que essa mitigação só funciona se o NGINX e o PHP‑FPM compartilharem o mesmo docroot no mesmo host.

    As configurações do PHP variam dependendo das necessidades do aplicativo upstream. Teste alterações como essas para verificar se elas não afetam seu aplicativo.

  2. Use o F5 BIG-IP ASM (Application Security Manager) para proteger o aplicativo . Os conjuntos de assinaturas existentes “Command Execution” e “Server Side Code Injection” incluem assinaturas de ataque que bloqueiam a maioria das tentativas de descobrir e explorar esta vulnerabilidade do PHP‑FPM.

    Editor – Desde que este blog foi publicado, a equipe de segurança do F5 lançou uma assinatura adicional específica para esta vulnerabilidade. Para mais detalhes, consulte F5 DevCentral .

  3. Adicione uma regra ModSecurity para bloquear solicitações que contenham o caractere suspeito %0a ou %0d :

    SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,fase:1,t:minúsculas,negar"

    Esta solução é descrita no relatório original de Wallarm sobre a vulnerabilidade ; ela pode causar falsos positivos e um invasor ainda pode encontrar outras maneiras de explorar a vulnerabilidade.

Usando um gerenciador de processos PHP diferente

Em vez de depender do PHP‑FPM, você pode usar o NGINX Unit para executar seus aplicativos PHP. O NGINX Unit é um servidor de aplicativos e gerenciador de processos de código aberto de alto desempenho que oferece suporte a diversas linguagens e estruturas , além do PHP. Ele pode dimensionar automaticamente aplicativos PHP em resposta à carga e executar simultaneamente aplicativos que usam diferentes tempos de execução PHP. Fornecemos binários, fontes e imagens do Docker gratuitamente.

Consulte a documentação da Unidade NGINX para obter instruções sobre como configurar e operar a Unidade NGINX para WordPress, um aplicativo popular, de alto tráfego e baseado em PHP. A implantação aproveita o suporte para servir arquivos estáticos no NGINX Unit 1.11.0 e posteriores.


"Esta postagem do blog pode fazer referência a produtos que não estão mais disponíveis e/ou não têm mais suporte. Para obter as informações mais atualizadas sobre os produtos e soluções F5 NGINX disponíveis, explore nossa família de produtos NGINX . O NGINX agora faz parte do F5. Todos os links anteriores do NGINX.com redirecionarão para conteúdo semelhante do NGINX no F5.com."