Skip to main content
Blog
Attacks Blog

PHP2Shell (CVE-2026-109618, CVE-2026-109619): você atualizou o PHP, agora verifique seu checkout

PHP2Shell dá execução de código em servidores PHP. O patch barra novos ataques, não um skimmer já instalado. O que checar no servidor e no checkout.

Oct 22, 2026 • 16 min read
PHP2Shell (CVE-2026-109618, CVE-2026-109619): você atualizou o PHP, agora verifique seu checkout
Índice

Resumo: PHP2Shell (CVE-2026-109618, CVE-2026-109619)

  • O que aconteceu: em 2026-10-21 o PHP lançou 8.5.12, 8.4.27, 8.3.36 e 8.2.35 para corrigir duas falhas com CVSS 9.2 no próprio motor. Ambas podem dar a um atacante sem conta execução de código em qualquer servidor web PHP, abaixo de WordPress, Magento ou Laravel.
  • Os ataques começaram antes da correção: os identificadores CVE vazaram cerca de 23 horas antes do lançamento. A Cloudflare viu tráfego de ataque antes do patch, e a watchTowr relatou tentativas de exploração 19 minutos depois.
  • Corrigido não é limpo: atualizar o PHP fecha a porta, mas não expulsa ninguém. Em lojas online, o acesso ao servidor muitas vezes termina num skimmer no checkout, e isso só aparece no navegador.

Sem tempo? Veja o monitoramento de scripts client-side da cside. Ajuda você a monitorar as mudanças e o comportamento dos scripts no navegador descritos abaixo.

Em 2026-10-21 o projeto PHP lançou correções de emergência para duas falhas críticas no motor do PHP, registradas como CVE-2026-109618 e CVE-2026-109619 e apelidadas de PHP2Shell. Como as falhas estão no runtime e não em algum CMS ou plugin, todos os sites WordPress, WooCommerce, Magento, Shopware e Drupal rodando numa versão do PHP sem correção estavam em risco ao mesmo tempo.

Quase toda a cobertura até agora fala do servidor, e com razão: atualize o PHP e reinicie todos os workers. Este artigo trata da parte que costuma ficar de fora. Quando um atacante consegue executar código numa loja online, o servidor raramente é o prêmio. O prêmio são algumas linhas de JavaScript adicionadas ao checkout e entregues a cada comprador até que alguém olhe o que o navegador realmente executa.

O que aconteceu: um bug antigo e uma divulgação que vazou

A causa raiz não era nova. Segundo a PHP Foundation, um desenvolvedor do núcleo viu os primeiros sinais do problema de falta de memória por trás da CVE-2026-109618 durante a auditoria externa do PHP em 2024. Ninguém encontrou na época um caminho real até a execução de código, cada correção possível tinha custos de compatibilidade ou de negação de serviço, e o trabalho travou. A Fundação chama esse atraso de falha estrutural do seu próprio processo.

Isso mudou em agosto de 2026, quando auditorias da Calif, da OpenAI e da Wiz transformaram o bug antigo em exploits funcionais. O lançamento coordenado estava marcado para 2026-10-22. Não se manteve.

Quando (UTC)O que aconteceu
2024Sinais da falha de falta de memória encontrados na auditoria externa do PHP; nenhum caminho de exploração identificado, a correção trava
2026-08-11Calif e OpenAI relatam, de forma independente, execução remota de código com a mesma causa
2026-08-24 e 2026-09-18Wiz e OpenAI relatam vetores de ataque adicionais
2026-10-20, ~15:00Os dois identificadores CVE vazam em fóruns e redes sociais, com data de lançamento errada e uma pontuação CVSS 10.0 também errada
2026-10-20, 19:30O PHP pré-anuncia a correção e antecipa o lançamento em um dia
2026-10-20, ~20:00Uma empresa de pesquisa publica por engano um vídeo de uma prova de conceito funcional; cópias se espalham
2026-10-21, 03:02A Cloudflare ativa regras de WAF padrão em todos os planos, inclusive o gratuito
2026-10-21, 07:41A Chainguard publica imagens corrigidas antes da hora, permitindo que qualquer um estude a correção
2026-10-21, 14:00O PHP lança 8.5.12, 8.4.27, 8.3.36 e 8.2.35
2026-10-21, 14:19A watchTowr relata tentativas de exploração ativas contra as duas CVEs

Linha do tempo da divulgação do PHP2Shell em 2026-10-20 e 2026-10-21, com cerca de 23 horas entre o vazamento das CVEs e o lançamento do PHP

O intervalo que importa para quem defende são essas cerca de 23 horas entre o vazamento e o lançamento. Quem rodava PHP passou essa janela exposto a um bug cuja existência os atacantes já conheciam, sem nenhum patch para instalar.

As duas vulnerabilidades, em termos simples

Os dois bugs estão em código que quase toda requisição PHP atravessa: gerenciamento de memória e tratamento de erros. Ambos têm nota 9.2 no CVSS v4.0, e ambos podem dar a um atacante não autenticado execução de código com os privilégios do worker web.

CVE-2026-109618CVE-2026-109619
Nome curtoRCE por corrupção na falta de memóriaRCE por estado obsoleto entre requisições
O que dá erradoUma requisição atinge o limite de memória exatamente no pior momento. O PHP abandona dados internos inicializados pela metade e depois os trata como válidos na limpeza.Um erro fatal deixa estado interno apontando para memória liberada no fim de uma requisição. A próxima requisição no mesmo worker usa essa memória (um use-after-free).
Gatilho típicoRequisições multipart/form-data manipuladas (formulários e uploads) que esgotam a memória enquanto parecem respeitar os limitesUm erro fatal, seguido de uma requisição posterior que lê o estado obsoleto, por exemplo pelo progresso de upload de sessão, ativado por padrão
Pior caso demonstradoRCE no Apache mod_php com uma única requisição, antes de qualquer código da aplicação rodar, com as configurações padrãoRCE no mod_php e no PHP-FPM; no FPM o caminho depende de uma operação dentro da aplicação

Dois detalhes tornam isso pior que um bug comum de CMS. Primeiro, a falha age abaixo da sua aplicação, então uma instalação de WordPress ou Magento totalmente atualizada numa versão vulnerável do PHP continua exposta, e os plugins de segurança nunca veem a requisição. Segundo, segundo os pesquisadores, um atacante também pode ler a memória do worker do PHP sem antes obter execução de código. Essa memória pode conter tokens de sessão, senhas, chaves de API e certificados de outros usuários.

As descrições oficiais são o aviso sobre corrupção na falta de memória e o aviso sobre estado obsoleto.

Quem é afetado, e está sendo explorado?

Qualquer instalação de PHP que atenda requisições web está no escopo, seja qual for a interface de servidor: PHP-FPM, Apache mod_php, php-cgi, FrankenPHP e LiteSpeed. Pesquisadores demonstraram execução de código sem autenticação em instalações padrão de Magento 2.4.9, WordPress, Drupal, Joomla, Nextcloud, phpMyAdmin, Laravel e outros. A Sansec destaca as lojas Magento, Shopware e WooCommerce.

Branch do PHPVulnerávelCorrigido em
8.5abaixo de 8.5.128.5.12
8.4abaixo de 8.4.278.4.27
8.3abaixo de 8.3.368.3.36
8.2abaixo de 8.2.358.2.35 (a branch chega ao fim do suporte em 2026-12-31)
8.1, 8.0, 7.4todasSem versão oficial. O PHP publicou backports do código-fonte; obtenha um build do fornecedor ou migre
7.3 e anteriorestodasMigre

Três coisas confundem as pessoas. Os pacotes das distribuições receberam o patch com antecedência e podem trazê-lo com um número de versão que parece antigo, então procure a CVE no changelog do pacote em vez de confiar na versão. O repositório do Remi, comum em servidores baseados em RHEL, não publicou atualizações em 2026-10-21. E atualizar WordPress, Magento ou Laravel não adianta nada aqui: a correção vem do pacote do servidor, da sua hospedagem ou da sua imagem de contêiner.

Quanto à exploração, tudo andou rápido. A Cloudflare diz que viu tráfego de ataque contra seus clientes antes de o patch sair, e que observou atacantes alterando payloads para driblar suas regras. A watchTowr relatou tentativas de exploração ativas contra as duas CVEs às 14:19 UTC. No momento da publicação, nenhuma fonte confirmou publicamente o comprometimento bem-sucedido de um servidor específico. Várias organizações, entre elas serviços do governo holandês e a BambooHR, saíram do ar por precaução em vez de esperar.

Se você não conseguiu aplicar o patch dentro dessa janela, presuma que foi sondado.

Por que um bug no servidor vira um problema no checkout

Numa loja online, uma shell é um meio, não um fim. Isso se repetiu depois de cada onda de exploração em massa contra plataformas de e-commerce em PHP, com o CosmicSting em 2024 como o caso mais conhecido: os atacantes conseguem executar código, deixam um backdoor e depois mudam o que a loja envia aos navegadores dos compradores. O dinheiro está nos números de cartão digitados no checkout, e eles só existem no navegador.

A cadeia costuma ser assim:

  1. Exploit. Uma requisição manipulada atinge um worker do PHP sem correção.
  2. Execução de código. O código do atacante roda como o usuário web, sem login.
  3. Persistência. O atacante planta uma webshell, um cron job ou uma nova conta de administrador. Isso sobrevive à atualização do PHP, porque o patch fecha a porta mas não expulsa quem já está dentro.
  4. Injeção. O atacante muda o que o navegador recebe: uma tag <script> num template do checkout, um bundle de JavaScript próprio modificado ou, muito comum em Magento e WordPress, um trecho guardado no banco de dados (configurações de cabeçalho do tema, blocos CMS, opções de widgets) onde as verificações de integridade de arquivos nunca olham.
  5. Coleta. O navegador de cada comprador executa o skimmer. Ele lê os campos do cartão, ou exibe um formulário de pagamento falso, e envia os dados para um domínio que parece de analytics ou de CDN.

O lojista costuma descobrir por um aviso de ponto comum de compra de uma bandeira de cartão, semanas ou meses depois de o primeiro cartão ser roubado.

Cada defesa cobre um trecho diferente dessa cadeia:

DefesaCobreNão vê
Atualização do PHPPasso 1, para cada requisição depois da instalaçãoTudo o que foi plantado antes do patch
WAFPasso 1, a requisição de exploit que chegaPayloads alterados; tudo o que vem depois da requisição
Perícia do servidor e integridade de arquivosPassos 2 a 4, em arquivos e logsScripts guardados no banco de dados; o que a página faz no navegador
Monitoramento de scripts no navegadorPassos 4 e 5, o que as páginas de checkout realmente executam e para onde enviam dadosO comprometimento do servidor em si

Cadeia de cinco passos de um exploit do PHP2Shell até um skimmer de cartão no checkout, com a defesa que cobre cada passo

Skimmers modernos são feitos para ficar invisíveis às ferramentas que verificam o lado do servidor. Eles só disparam na rota do checkout, uma vez por sessão, para certos países ou quando não há ferramentas de desenvolvedor abertas, então um crawler vindo de um data center recebe uma página limpa. Vimos o truque de uma vez por sessão há poucos dias no sequestro do checkout da HulkApps. Um WAF vê o exploit que chega, não o script que sua página entrega três semanas depois. O único lugar onde o skimmer se mostra de forma confiável é a sessão de navegador de um cliente real.

Corrigido não é o mesmo que limpo: o que verificar agora

Se seus servidores PHP estavam expostos à internet com uma versão afetada em qualquer momento depois do vazamento de 2026-10-20, percorra as duas listas abaixo. A primeira trata do servidor. A segunda trata do que os navegadores dos seus clientes recebem, e é a que a maioria das listas de resposta a incidentes deixa de fora.

Checklist do PHP2Shell depois do patch, para o servidor e para o navegador

No servidor

  • Preserve as evidências primeiro. Faça uma cópia dos logs do PHP e do servidor web, da configuração e de qualquer arquivo suspeito antes de mudar qualquer coisa.
  • Atualize e reinicie. Instale o build corrigido do PHP e depois reinicie o Apache, o PHP-FPM e todos os workers de longa duração. Um pacote atualizado com workers antigos ainda rodando continua vulnerável.
  • Procure persistência. Procure arquivos PHP novos ou alterados nas raízes web e nos diretórios de upload, cron jobs inesperados e usuários administradores que ninguém criou.
  • Procure nos logs as marcas do exploit. Os pesquisadores sugerem procurar requisições multipart incomuns seguidas de erros de limite de memória ou rajadas de HTTP 500, cookies PHPSESSID de resposta estranhamente grandes e reinícios inexplicados de workers do PHP.
  • Observe o comportamento dos processos. Conexões de saída a partir de workers do PHP, ou sh, curl ou wget iniciados pelo php-fpm, são sinais fortes.
  • Troque o que vivia na memória. Como a memória dos workers podia ser lida sem execução de código, troque chaves de API, credenciais de banco de dados e segredos do gateway de pagamento que os processos do PHP mantinham, e considere invalidar as sessões ativas.

No navegador

  • Inventarie cada script das suas páginas sensíveis. Primeiro checkout, pagamento, login e conta. Inclua seus bundles próprios, não só as tags de terceiros.
  • Compare com uma linha de base anterior a 2026-10-20. Qualquer script novo, qualquer hash de arquivo alterado e qualquer domínio novo com o qual o checkout se comunique merece uma explicação.
  • Verifique os lugares onde skimmers se escondem fora do seu código. No Magento, as configurações "Scripts and Style Sheets" do cabeçalho HTML e "Miscellaneous HTML" do rodapé, os blocos CMS e os widgets. No WordPress, plugins de injeção de cabeçalho e rodapé, widgets e opções do tema guardadas no banco de dados.
  • Não confie num único rastreamento. Um skimmer que dispara uma vez por sessão ou ignora endereços IP de data centers passa num scan. Você precisa de observações de sessões reais, ao longo do tempo.
  • Observe as requisições de saída do checkout. Os dados do cartão precisam sair da página de alguma forma: um fetch, um beacon de imagem, um WebSocket. Um destino novo na página de pagamento é o sinal mais claro que você vai ter.
  • Revise os relatórios de violação de CSP, se você os coleta. Um relatório que cita um domínio que você nunca usou vale a investigação, mesmo que a página pareça normal.

Nada disso substitui o patch. Responde à pergunta que o patch não consegue responder: algo mudou enquanto a porta estava aberta?

O que isso significa para o PCI DSS 6.4.3 e 11.6.1

O PHP2Shell é um caso de livro para os dois requisitos do PCI DSS 4.0.1 que se tornaram obrigatórios em 2025-03-31.

  • O requisito 6.4.3 pede que você gerencie cada script carregado e executado numa página de pagamento no navegador do consumidor: confirmar que cada um está autorizado, garantir sua integridade e manter um inventário com uma justificativa escrita para cada um. Um skimmer injetado depois do comprometimento de um servidor é, por definição, um script não autorizado.
  • O requisito 11.6.1 exige um mecanismo de detecção de mudanças e adulterações que alerte você sobre alterações não autorizadas nos scripts das páginas de pagamento e nos cabeçalhos HTTP relevantes para a segurança, tal como o navegador os recebe. É exatamente essa a mudança que um atacante faz no passo 4 da cadeia acima.

Duas perguntas práticas para a sua próxima avaliação. Com que frequência o seu mecanismo de 11.6.1 avalia de fato a página? Se a resposta for semanal, um skimmer injetado em 2026-10-21 pode rodar por dias antes que alguém perceba. E as suas evidências cobrem a janela a partir de 2026-10-20? Se você consegue mostrar que o inventário de scripts das suas páginas de pagamento não mudou, tem uma resposta limpa. Se não consegue, vale fechar essa lacuna agora.

Lojistas no SAQ A que incorporam o iframe de um provedor de pagamento também não estão livres. Desde a revisão do SAQ A de janeiro de 2025, a elegibilidade depende de confirmar que o seu site não é suscetível a ataques de script que possam afetar seus sistemas de e-commerce. Uma página pai comprometida ainda pode trocar ou sobrepor esse iframe.

Onde a cside entra

Para deixar o escopo claro: a cside não corrige o PHP nem bloqueia a requisição do exploit. Esse é o trabalho da sua atualização do PHP e do seu WAF. A cside cobre a camada que vem depois: o que suas páginas realmente executam nos navegadores dos seus clientes.

Sessões reais, não rastreamentos sintéticos. A cside monitora scripts em sessões reais de compradores em vez de depender de um scan periódico, então um skimmer que dispara uma vez por sessão ou se esconde de data centers continua rodando na nossa frente.

Mudanças e comportamento, não só nomes de arquivo. Um script novo no checkout, um bundle próprio modificado ou um script que começa a ler os campos do cartão e a enviá-los para um domínio que sua loja nunca usou gera um alerta, com o conteúdo do script disponível para inspeção.

Bloqueado na sessão. Com o Script Method, a cside busca cada script de terceiros no servidor para gerar o hash, arquivar e analisar, e os bloqueios são aplicados em tempo de execução no navegador, junto com o CSP. Um script não autorizado, ou uma capacidade específica que ele tenta usar, é bloqueado na sessão em vez de ser relatado depois.

Evidências para o PCI. O PCI Shield mantém o inventário de scripts do 6.4.3 e os alertas de mudança do 11.6.1, com relatórios semanais que o seu avaliador consegue ler.

Os detalhes acima refletem as informações públicas e as declarações dos fornecedores em 2026-10-21. Vamos atualizar este artigo conforme os relatos de exploração mudarem.

Se a cside já monitorava o seu checkout em 2026-10-20, revise os dados registrados desde então ou agende uma demo para analisá-los com a nossa equipe. Comece grátis para iniciar o monitoramento a partir da implementação. Novas implementações não podem reconstruir sessões anteriores do navegador.

Fontes

Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks, web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

PHP2Shell é o apelido de CVE-2026-109618 e CVE-2026-109619, duas falhas críticas de segurança de memória no próprio motor do PHP, corrigidas em 2026-10-21. Ambas têm pontuação CVSS v4.0 de 9.2 e podem permitir execução remota de código sem autenticação em qualquer servidor que use PHP para requisições web, a partir do PHP 5.4.

PHP 8.5.12, 8.4.27, 8.3.36 e 8.2.35. PHP 8.1, 8.0 e 7.4 não recebem versão oficial; a equipe de segurança do PHP publicou backports do código-fonte, então use um build corrigido da sua distribuição ou do seu fornecedor de suporte estendido, ou migre de branch. Reinicie todos os workers do PHP depois de atualizar.

A Cloudflare viu tráfego de ataque contra seus clientes antes de o patch sair, e a watchTowr relatou tentativas de exploração ativas contra as duas CVEs em 2026-10-21. No momento em que escrevemos, nenhuma fonte havia confirmado publicamente o comprometimento bem-sucedido de um servidor específico.

Não. As falhas estão no runtime do PHP, abaixo da sua aplicação. Você precisa de um pacote PHP atualizado do seu sistema operacional, da sua hospedagem ou da sua imagem de contêiner. Atualizações da aplicação e plugins de segurança nunca chegam a ver a requisição maliciosa a tempo.

Só em parte. O PHP lista medidas provisórias como session.upload_progress.enabled=0, impor memory_limit=-1 com limites rígidos de tamanho de requisição e, no PHP 8.5, fatal_error_backtraces=0. Bloquear multipart/form-data no servidor web também ajuda, mas quebra uploads. O PHP é explícito: só a atualização corrige as falhas por completo.

Um WAF pode bloquear padrões de exploit conhecidos. A Cloudflare ativou regras padrão em todos os planos antes da divulgação, mas também viu atacantes alterando payloads para contorná-las. Trate o WAF como uma proteção temporária enquanto você aplica o patch, não como a correção.

Sim, se seus servidores estavam acessíveis com uma versão vulnerável antes do patch. A atualização impede novas explorações, mas não remove uma webshell, uma conta de administrador maliciosa nem um skimmer já injetado nas suas páginas. Procure persistência no servidor e verifique o que seu checkout entrega aos navegadores reais.

Compare cada script e cada requisição de saída das suas páginas de checkout e de pagamento com uma linha de base anterior a 2026-10-20. Inclua o HTML armazenado no banco de dados, não só os arquivos do tema. Como skimmers costumam se esconder de crawlers, observações de sessões reais de clientes são a evidência mais confiável.

Monitore e proteja seus scripts de terceiros

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Comece grátis ou experimente o Business com um teste de 14 dias.

Interface do painel cside mostrando monitoramento de scripts e análises de segurança
Related Articles
Agende uma demonstração

Quer ver isso em detalhe com um engenheiro?

Trinta minutos, no seu próprio site. Sem slides.

Agende uma demo personalizada para ver:

Como alcançar a conformidade com os requisitos 6.4.3 e 11.6.1 do PCI DSS em 1 dia
Por que scripts de terceiros são um risco de segurança para você e seus visitantes
Como monitorar vazamentos de privacidade e consentimento (RGPD, CCPA) em cada terceiro
Como conter abuso de cadastros, compartilhamento de contas e fraude de chargeback com device intelligence
Como detectar e controlar agentes de IA e bots que acessam seu site em tempo real

Prefere só mandar uma pergunta?

Use este mesmo e-mail ao agendar pelo Google. O Google pode pedir que você o informe novamente.

Usamos seu e-mail para associar a reserva à sua visita e medir como as pessoas nos encontram. Isto não é uma inscrição na newsletter.

Problemas para agendar? Abrir o agendador em uma nova aba

O que você está tentando resolver?

Conte em uma linha e voltamos com algo útil, não com um discurso genérico.

Costumamos ajudar com:

Ver quais scripts de terceiros rodam no seu site
Evidências para PCI DSS 6.4.3 e 11.6.1
Bots, agentes de IA e roubo de contas

Prefere agendar um horário? Escolher um horário