Vulnerabilidade do PHP: patch do PHP2Shell e como verificar a versão do PHP (WordPress)

PHP2Shell é o nome de duas vulnerabilidades do PHP (CVE-2026-109618 · CVE-2026-109619) cujos patches foram publicados em 21 de outubro de 2026. São falhas de execução remota de código que permitem executar código no servidor mesmo com uma requisição sem login, então o primeiro passo é verificar qual versão do PHP o seu site usa e atualizá-la para uma versão corrigida. Em um servidor Nginx + Apache com WordPress 7.1.3, verifiquei a versão do PHP no Diagnóstico, atualizei só os pacotes php para a versão corrigida e depois verifiquei de novo.
1️⃣ A vulnerabilidade do PHP PHP2Shell: como as falhas funcionam e quem é afetado
As falhas ficam dentro do motor do PHP, que lê a requisição antes de qualquer código do WordPress ser executado, então continuam lá mesmo que você mantenha plugins e temas atualizados, enquanto o PHP não for atualizado. Segundo o alerta do CERT-EU, as duas têm pontuação CVSS 9,2; os detalhes técnicos foram divulgados e estão em discussão, e um código inicial de prova de conceito já começou a circular.
A CVE-2026-109618 é uma falha em que, quando uma requisição ultrapassa o limite de memória (memory_limit) e é interrompida, o processo de limpeza trata como válidos dados da requisição inicializados só pela metade. A CVE-2026-109619 é uma falha em que o estado da memória liberada após um erro fatal permanece e é reutilizado antes da inicialização na próxima requisição tratada pelo mesmo worker.
Segundo o anúncio do php.net, todas as instalações do PHP que processam requisições web são afetadas, e o Apache mod_php é considerado a configuração mais perigosa. Isso porque no mod_php foi demonstrado que uma única requisição sem login dispara o ataque antes de o código da aplicação ser executado.
| Modo de execução do PHP | Impacto | Observações |
|---|---|---|
| Apache mod_php | 🔴 Afetado · o mais perigoso | Demonstração em que uma única requisição sem login disparou o ataque antes de o código da aplicação ser executado |
| PHP-FPM | 🔴 Afetado | — |
| php-cgi | 🔴 Afetado | — |
| FrankenPHP | 🔴 Afetado | — |
| LiteSpeed | 🔴 Afetado | — |
As versões corrigidas são 8.2.35, 8.3.36, 8.4.27 e 8.5.12, e todas as versões anteriores das séries 8.2 a 8.5 são afetadas. O PHP 8.1 e anteriores são séries que o projeto PHP não suporta mais, por isso não há versão corrigida oficial; elas são cobertas por correções que distribuições e empresas de hospedagem trazem para essas versões (backports).
Quando a CISA publicou o alerta em 21 de outubro, ainda não havia exploração real confirmada, mas a CISA considerou perigoso deixar os sistemas sem patch e recomendou aplicar o patch imediatamente, começando pelos sistemas expostos à internet. No mesmo dia, em seu alerta, o CERT-EU concluiu que, com o código de prova de conceito começando a circular, ficou mais provável que atacantes já estejam explorando as falhas.
2️⃣ Verificar a versão do PHP: Diagnóstico › Informação › Servidor
Mesmo conhecendo as falhas, não dá para saber o que fazer sem saber com qual versão do PHP o seu site funciona. No painel de administração, abra [Ferramentas › Diagnóstico] e expanda a seção [Servidor] da aba [Informação]: a linha [Versão do PHP] mostra a versão do PHP que realmente processa as requisições do seu site.
A linha [PHP SAPI], logo abaixo de [Versão do PHP], mostra o modo de execução do PHP; fpm-fcgi indica uma configuração PHP-FPM. Aqui basta olhar as duas linhas [Versão do PHP] e [PHP SAPI] da seção [Servidor].
O ataque começa com uma requisição sem login. Na etapa em que o PHP lê a requisição especialmente forjada antes do código do WordPress, ela aciona uma das duas falhas e leva à execução de código no servidor. As versões corrigidas bloqueiam esse fluxo, então o que há a fazer é levar o PHP do site a uma versão corrigida ou mais recente.
O [php -v] no terminal mostra só a versão do PHP padrão da linha de comando. Em configurações com várias versões do PHP no mesmo servidor, como o EA-PHP do cPanel ou o alt-php do CloudLinux, ela pode ser diferente da versão que o seu site usa. Por isso a referência é o valor [Versão do PHP] no Diagnóstico.
php -vPHP 8.3.xx (cli) (built: Jun 3 2025 17:17:57) (NTS gcc x86_64)3️⃣ Abaixo do PHP 8.2: confirme com a hospedagem se há um backport e, se não houver, solicite
Se a [Versão do PHP] no Diagnóstico for inferior a 8.2 (7.x, 8.0 ou 8.1), não há versão corrigida oficial do php.net. Pela tabela de versões suportadas do php.net (verificada em 22 de outubro de 2026), só quatro séries têm suporte, 8.2, 8.3, 8.4 e 8.5, e as versões oficiais 8.1 e anteriores não recebem patches de segurança.
Em vez disso, distribuições e empresas de hospedagem às vezes publicam pacotes que mantêm o número da versão e só incorporam a correção (backports). Os pacotes 7.4.33, 8.0.30 e 8.1.34 de um servidor de teste de uma hospedagem gerenciada são um exemplo. O changelog deles tinha a linha [Backported from 8.2.35 — CVE-2026-109618, CVE-2026-109619].
Mesmo com o número de versão igual, para saber se a correção está incluída procure o número do CVE no changelog do pacote. No Debian e no Ubuntu, a busca é algo como [zcat /usr/share/doc/php8.2-cli/changelog.Debian.gz | grep 109618]. Em sistemas RPM, a forma é [rpm -q --changelog php-common | grep 109618]; ajuste o número da versão no nome do pacote à versão que o seu site usa.
Por isso, se você estiver abaixo do 8.2, primeiro pergunte à sua empresa de hospedagem se o backport foi aplicado e, se não foi ou se não for possível confirmar, peça a atualização para uma versão suportada (8.2 ou superior). Depois da atualização, verifique de novo o valor [Versão do PHP] no Diagnóstico.
A CISA recomendou que organizações que usam 8.1 ou anterior e não conseguem atualizar logo mantenham seus sistemas baseados em PHP offline até aplicar o patch ou fazer o upgrade.
Se você administra o próprio servidor e usa 8.1 ou anterior, pode instalar os pacotes com backport da sua distribuição ou aplicar os patches de código-fonte para 7.4, 8.0 e 8.1 publicados pela equipe de segurança do PHP. Mesmo assim, são séries sem suporte, então a solução de verdade é passar para uma versão suportada.
4️⃣ PHP 8.2 ou superior: atualize para a versão corrigida e verifique de novo
Se você está no 8.2 ou superior, mas abaixo da versão corrigida, atualize o próprio PHP. Na hospedagem gerenciada e compartilhada, a empresa aplica o patch no servidor inteiro, então confirme pelos avisos dela ou pelo suporte se ele já foi aplicado e qual build está rodando, e veja se a [Versão do PHP] no Diagnóstico mudou. Segundo a página de status, a Cloudways começou a aplicar o patch em todas as versões do PHP que suporta (5.6 a 8.4) em 21 de outubro, às 22:19 UTC. Em 22 de outubro, às 10:11 UTC, anunciou a conclusão.
Em um servidor que você mesmo administra, atualize com os pacotes do repositório da distribuição ou de um fornecedor LTS, como indica o anúncio do php.net. Antes de atualizar, confira numa prévia a lista de pacotes que vão mudar para garantir que só os pacotes que começam com php sejam atualizados e que nenhum outro venha junto, e não misture com outras atualizações do sistema operacional.
dnf upgrade --assumeno 'php*'Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Upgrading:
php x86_64 8.3.xx-1.… … 1.9 M
php-cli x86_64 8.3.xx-1.… … 5.6 M
php-common x86_64 8.3.xx-1.… … 1.3 M
php-fpm x86_64 8.3.xx-1.… … 1.9 M
(linhas de pacotes de extensão como php-gd · php-intl omitidas)
Transaction Summary
================================================================================
Upgrade xx Packagesdnf upgrade 'php*'Upgraded:
php-8.3.xx-1.….x86_64
php-cli-8.3.xx-1.….x86_64
php-common-8.3.xx-1.….x86_64
php-fpm-8.3.xx-1.….x86_64
(linhas de pacotes de extensão omitidas)
Complete!Neste teste, só os pacotes que começam com php foram atualizados para a versão corrigida, e o php-fpm reiniciou sozinho quando a instalação dos pacotes terminou. A versão corrigida só passa a valer quando os workers do php-fpm reiniciam, então, em ambientes sem reinício automático, execute você mesmo [systemctl restart php-fpm].
Depois da atualização, confira se [php -v] e a linha [Versão do PHP] da aba [Informação] do Diagnóstico mostram a versão corrigida ou mais recente, e verifique também o status do serviço php-fpm e a resposta do site. Se só o valor da linha de comando mudou e a [Versão do PHP] continua igual, reinicie o php-fpm e verifique de novo.
Depois da atualização, abra de novo a seção [Servidor] na aba [Informação] da mesma tela [Ferramentas › Diagnóstico] e veja a linha [Versão do PHP]. Se o valor mudou para a versão que você instalou, os workers do php-fpm também já estão rodando na nova versão.
php -vPHP 8.3.xx (cli) (built: Oct 19 2026 14:00:34) (NTS gcc x86_64)systemctl is-active php-fpmactivecurl -s -o /dev/null -w '%{http_code}\n' 'https://example.com/?r=1'200Em pacotes cujo número de versão sobe, o patch se confirma pelo novo número de versão; em pacotes com backport que mantêm o número, pelo número do CVE no changelog. Este servidor era do primeiro tipo: o [rpm -q --changelog php-common] não tinha nenhuma linha com o número do CVE, e confirmei pelo novo número de versão na primeira linha do changelog.
5️⃣ Quando não dá para atualizar já: as medidas temporárias indicadas pelo php.net
Para servidores que não podem ser atualizados já, o php.net indica as configurações abaixo como medidas temporárias, mas deixa claro que elas só reduzem caminhos de ataque específicos e não tornam a instalação segura. Também orienta a não limitar a memória com RLIMIT_AS ou RLIMIT_DATA no lugar disso, porque isso pode justamente provocar as falhas de alocação vulneráveis.
| Configurações | Valor | Onde | O que bloqueia |
|---|---|---|---|
| memory_limit | -1 | php_admin_value no pool do FPM ou na configuração do Apache (para que a aplicação não consiga reverter) | CVE-2026-109618 · caminho de falha do limite de memória (incompleto) |
| post_max_size | 8M (32M se precisar de uploads) · upload_max_filesize menor que isso | php.ini · configuração do pool | CVE-2026-109618 |
| session.upload_progress.enabled | 0 + reiniciar todos os workers | php.ini · pool do FPM · configuração do servidor (não via ini_set() nem .user.ini) | CVE-2026-109619 · só o caminho de sessão confirmado |
| fatal_error_backtraces | 0 + reiniciar todos os workers (só PHP 8.5) | Igual ao de cima | CVE-2026-109619 · só o caminho de backtrace confirmado |
O php_admin_value é uma configuração do lado do servidor que a aplicação não consegue reverter, então quem usa hospedagem compartilhada muitas vezes não pode mudá-lo por conta própria e, também nesse caso, acaba tendo de pedir à empresa de hospedagem. O php.net recomenda ainda impor limites, também no servidor web ou no proxy, ao tamanho do corpo da requisição, ao número de campos de entrada, ao número de partes multipart, ao número de cabeçalhos e à profundidade de aninhamento.
🔢 FAQ & conteúdo recomendado
Segurança
Vulnerabilidades do wp-config.php
Como evitar que o arquivo wp-config.php fique exposto e reforçar as configurações de segurança.
Segurança
XML-RPC do WordPress
Como identificar ataques ao xmlrpc.php nos logs e três formas de desativá-lo.
Servidor
Aviso de php-fpm max_children
Um teste real que encontra a causa do aviso nos logs antes de aumentar os workers.
ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.