Atualização de Segurança PHP 2026: Guia de Correção do PHP2Shell CVSS 9.2
Em 21 de outubro de 2026 o PHP lançou as versões 8.5.12, 8.4.27, 8.3.36 e 8.2.35 para fechar duas falhas de execução remota de código exploráveis sem autenticação. Se o seu servidor, o servidor de um cliente ou o alojamento partilhado da sua agência corre PHP, isto é um assunto para hoje, não um item de roteiro.
A própria divulgação foi invulgar. Em 20 de outubro, a equipa de segurança do PHP publicou um aviso prévio, agendou o lançamento para 21 de outubro às 14:00 UTC e reservou-se o direito de o lançar mais cedo. Os identificadores CVE vazaram um dia antes da divulgação, acompanhados de alegações exageradas sobre a gravidade e as versões afetadas. Os fabricantes das distribuições já tinham recebido os patches, e os CERT nacionais começaram a publicar orientações antes mesmo de o código ser tornado público. Por outras palavras: ninguém tinha uma desculpa legítima para demorar depois de o lançamento ter saído.
Duas Falhas, Um Lançamento de Emergência
Nenhuma das duas falhas é um erro de lógica numa aplicação. Ambas residem na forma como o PHP prepara e desmonta um pedido, e é por isso que nenhuma atualização de framework, de plugin ou regra de WAF substitui a atualização do interpretador.
CVE-2026-109618 — RCE por corrupção no esgotamento de memória. Quando a memória do PHP esgota, o pedido é abortado em vez de continuar. O aviso descreve um caminho em que esse aborto interrompe o PHP enquanto os dados internos do pedido estão apenas parcialmente inicializados, pelo que a etapa de limpeza do pedido acaba por tratar dados inválidos como válidos. Um atacante que consiga empurrar a utilização de memória até ao limite pode, assim, orientar o que acontece a seguir. É esta a falha que torna a orientação de mitigação tão contraintuitiva: o fornecedor pede aos administradores que impeçam o PHP de atingir o seu próprio teto de memória, não que o apertem.
CVE-2026-109619 — RCE por estado global obsoleto. O estado interno pertencente a um pedido pode sobreviver depois de a memória que o suporta ter sido libertada. O pedido seguinte tratado pelo mesmo processo worker pode consumir esse estado obsoleto antes de a inicialização normal o repor. Num worker de longa duração — exatamente o que são o PHP-FPM, o mod_php e o LiteSpeed — a reutilização de memória é uma condição normal e permanente, e é por isso que isto não é um caso raro reservado a configurações exóticas.
| Identificador | O que é | Gravidade | Corrigido em |
|---|---|---|---|
| CVE-2026-109618 GHSA-w8hw-w9fx-j79w |
O tratamento do esgotamento de memória interrompe o PHP com os dados do pedido parcialmente inicializados; a limpeza confia então em dados inválidos | CVSS v4.0 9.2 | 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 |
| CVE-2026-109619 GHSA-6wmf-4rv5-p3rp |
O estado pertencente a um pedido sobrevive depois de a sua memória ser libertada; um pedido posterior no mesmo worker usa-o antes da reinicialização | CVSS v4.0 9.2 | 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 |
O nome PHP2Shell não é uma designação oficial do projeto PHP; surgiu de investigadores e empresas de segurança e acabou por ficar, por isso vai encontrá-lo em resultados de scanners, boletins de fornecedores de alojamento e avisos de CERT, sempre a referir-se exatamente a estas duas CVE.
Quem Está Realmente Exposto
O aviso não dá voltas: todas as instalações PHP que servem pedidos web estão em risco. Isso inclui PHP-FPM atrás de nginx ou Apache, Apache com mod_php, php-cgi, LiteSpeed e FrankenPHP. A diferença entre elas está no trabalho que um atacante tem de fazer.
| Configuração | Risco | Motivo |
|---|---|---|
| Apache com mod_php | Mais elevado | O aviso descreve uma exploração já demonstrada em que um pedido não autenticado despoleta o ataque antes de qualquer código da aplicação correr |
| PHP-FPM (nginx, Apache como proxy) | Elevado | Os workers de longa duração reutilizam o estado dos pedidos; o worker costuma correr com o mesmo utilizador do site |
| LiteSpeed, php-cgi, FrankenPHP | Elevado | Mencionadas no aviso como configurações de serviço de pedidos abrangidas |
| Alojamento gerido e partilhado | Varia — pergunte | Normalmente corrigido na camada da plataforma, mas não o pode verificar; o seu trabalho é obter, por escrito, a versão incorporada e a data do patch |
| Tarefas cron e scripts de CLI | Mais baixo, atualize na mesma | Não têm superfície de pedidos pública, mas partilham o mesmo binário e muitas vezes guardam credenciais |
Se aloja WordPress, WooCommerce, Laravel, Magento, ERPs adjacentes ao Magento ou qualquer portal de reservas em PHP da sua atividade comercial, está abrangido pelas primeiras três linhas mesmo quando o código da aplicação está impecável. Para uma perspetiva mais ampla sobre quem deve, à partida, ter a seu cargo o runtime, consulte o nosso guia sobre externalização de TI na Turquia.
Verifique a Sua Versão em Dois Minutos
A armadilha aqui é a aritmética das versões. As distribuições fornecem o PHP 8.3.6 ou 8.2.x durante anos e fazem backport das correções de segurança para dentro do mesmo número de versão visível, por isso php -v por si só não diz se está protegido. Compare três coisas.
1. A versão visível do PHP e a SAPI que serve o tráfego.
php -i | grep -E 'PHP Version|memory_limit|session.upload_progress.enabled|fatal_error_backtraces'
systemctl list-units --type=service --state=running | grep -Ei 'php|apache|nginx|litespeed'
2. A versão do pacote da distribuição, não a upstream. Em Debian e Ubuntu, o changelog é a resposta honesta; em sistemas RPM, consulte o changelog do pacote.
zcat /usr/share/doc/php8.3-cli/changelog.Debian.gz | grep -iE 'CVE-2026-10961[89]'
apt-cache policy php8.3-fpm | head -4
# RPM-based hosts
rpm -q php && rpm -q --changelog php | grep -iE 'CVE-2026-10961[89]'
Se o changelog mencionar ambas as CVE na versão instalada, está corrigido, ainda que php -v continue a dizer 8.3.6. Está aqui a diferença entre uma resposta de segurança a sério e uma superstição de número de versão.
3. Se o processo em execução recarregou o binário corrigido. Uma atualização de pacote que nunca é seguida de um reinício deixa o código antigo em memória. Compare a hora de arranque do serviço com a hora de instalação do pacote:
stat -c '%y %n' /usr/sbin/php-fpm8.3
Em cPanel, Plesk, DirectAdmin ou numa plataforma gerida, o equivalente é o seletor de PHP e o boletim de segurança do próprio fornecedor de alojamento: identifique a versão incorporada realmente atribuída ao seu site, não a mais recente anunciada no painel. Se o seu fornecedor de alojamento não conseguir indicar uma data de patch, considere o site não corrigido. Os nossos serviços de infraestrutura digital cobrem esta auditoria e a própria atualização; também pode simplesmente contactar-nos com a sua stack e dizemos-lhe o que verificaríamos.
Versões Corrigidas e o Precipício do EOL
O PHP dá a um ramo dois anos de desenvolvimento ativo e mais dois anos de correções de segurança. Foi essa política que produziu quatro correções simultâneas em 21 de outubro — e é também ela que deixa os ramos mais antigos órfãos.
| Ramo | Versão corrigida | Estado após este aviso |
|---|---|---|
| PHP 8.5 | 8.5.12 | Com suporte ativo |
| PHP 8.4 | 8.4.27 | Com suporte ativo |
| PHP 8.3 | 8.3.36 | Fase de suporte de segurança |
| PHP 8.2 | 8.2.35 | O suporte de segurança termina a 31 de dezembro de 2026 — planeie a mudança já |
| PHP 8.1 e anteriores | Sem lançamento upstream | Apenas backports dos fabricantes das distribuições; o projeto PHP publicou backports mínimos de código-fonte para 7.4, 8.0 e 8.1 para quem compila a partir do código-fonte |
Dois avisos práticos do próprio comunicado. Primeiro, se instala o PHP a partir de um repositório da comunidade em vez da sua distribuição, esse repositório pode ficar atrás da janela de segurança: os responsáveis pelos amplamente usados pacotes Remi declararam que não teriam atualizações no próprio dia, por isso o caminho seguro são os pacotes da sua distribuição ou uma compilação a partir do código-fonte. Segundo, se está no PHP 8.1 ou anterior, «esperar pelo nosso fornecedor de alojamento» é uma decisão de segurança que está a tomar em nome dos seus clientes — documente-a ou mude-a.
Corrigir um Servidor em Produção Sem Provocar um Incidente
As atualizações de segurança dentro da mesma minor raramente quebram uma aplicação; o que quebra são os reinícios não testados. A ordem abaixo é a que usamos em plataformas comerciais em produção, e mantém a janela de risco curta sem arriscar o site.
- Primeiro, o snapshot. Um snapshot de hipervisor ou de volume que tenha realmente testado restaura em minutos, e torna barata a decisão de corrigir.
- Reproduza a versão em staging. O mesmo ramo, as mesmas extensões, os mesmos ficheiros de configuração do PHP, uma cópia dos dados de produção. Percorra os fluxos de checkout, de pedido de orçamento e de pagamento, não apenas a página inicial.
- Atualize o conjunto de pacotes como um todo. Misturar um CLI atualizado com um binário FPM antigo é a receita para acabar com um
php -vcorrigido e um caminho web por corrigir:apt-get update && apt-get install --only-upgrade 'php8.3-*', oudnf update --security 'php*'em servidores RPM. - Reinicie o processo que serve os pedidos e depois verifique que reiniciou.
systemctl restart php8.3-fpm(ou recarregue o Apache / reinicie o LiteSpeed), depois volte a verificar a hora de arranque do serviço e execute novamente as consultas de versão e de changelog. - Vigie o registo de erros durante uma hora. Mensagens de OOM, novas assinaturas de erros fatais e taxas de 5xx invulgares são os sinais de que as definições de mitigação abaixo podem precisar de ajuste — não razões para adiar a atualização.
- Registe as evidências. Versão do pacote, linha do changelog que menciona ambas as CVE, hora exata do reinício. Clientes, auditores e revisões de controlos ao estilo ISO 27001 pedem exatamente isto, e guardá-lo demora dez segundos.
Onde a atualização tem de esperar — uma integração de ERP validada, um calendário de lançamentos bloqueado por embargo, um circuito de aprovação pelo cliente — coloque nesse mesmo dia um controlo compensatório à sua frente, em vez de deixar a porta aberta e ficar à espera. Foi isso que os avisos dos CERT nacionais recomendaram exatamente para esta situação: isolar da rede pública as aplicações PHP expostas à internet nos casos em que a correção imediata não é possível.
Mitigações Temporárias: Estreitar a Janela, Não Fechá-la
O aviso do PHP afirma claramente que não existe mitigação completa e que a atualização é a única opção segura. Encare o que se segue como uma cobertura de dias, não de semanas, aplicada a um nível ao qual a aplicação não se possa sobrepor, com todos os workers reiniciados depois.
Contra a CVE-2026-109618 (o caminho do esgotamento de memória)
- Deixe o PHP esgotar a memória da máquina em vez do seu próprio limite:
memory_limit = -1, idealmente comophp_admin_value memory_limit = -1, para que o código da aplicação não possa repor o teto. - Mantenha pequenos os corpos dos pedidos ao nível do interpretador: a orientação do aviso aponta para cerca de 8 MB quando não há uploads e cerca de 32 MB quando há, com
upload_max_filesizeabaixo depost_max_size. - Imponha os limites dispendiosos no proxy, porque o estrago está no pedido descodificado, não no tamanho transmitido: tamanho total do corpo descodificado, número de campos de entrada, número de partes multipart, número de cabeçalhos, profundidade de aninhamento — e cubra os pedidos que chegam sem um
Content-Lengthutilizável. - Contenha o raio de impacto com um limite de memória de container ou cgroup dimensionado de modo a que um worker morto seja um incidente de disponibilidade, não um incidente do servidor. Não os substitua por
RLIMIT_ASouRLIMIT_DATA: estes despoletam precisamente a falha de alocação que está no caminho vulnerável.
Contra a CVE-2026-109619 (o caminho do estado obsoleto)
- Desative o progresso de upload de sessão com
session.upload_progress.enabled = 0, definido no php.ini, no pool do FPM ou na configuração do servidor — num local que se aplique antes da análise do pedido. Depois reinicie todos os workers, porque o FPM partilha entre pedidos o estado de módulos já inicializado. Oini_set()e o.user.inichegam tarde demais para ajudar. - No PHP 8.5, defina
fatal_error_backtraces = 0e reinicie. - Remova as definições por pedido que sejam inválidas ou obsoletas e que, por isso, emitem diagnósticos logo na inicialização. Suprimir a mensagem com
error_reporting,display_errorsou@não remove o caminho de código. - Cace erros fatais alcançáveis por um atacante e timeouts de longa duração nos tratadores de uploads e importações, no código de callbacks e nas rotinas de limpeza — os mesmos sítios onde ambas as falhas vivem.
Uma CDN ou um WAF à frente da origem ainda justifica o custo: a limitação de tráfego por taxa, o bloqueio de pedidos com formatos anómalos e a correção virtual reduzem o ruído e atrasam a sondagem oportunista. São uma lombada para um atacante direcionado, não um controlo que possa dar como remediação.
O Que Perguntar Hoje ao Seu Fornecedor de Alojamento
Os guiões do suporte respondem a esta pergunta com um «estamos sempre atualizados». Peça antes evidências que possa arquivar:
- A versão de PHP incorporada atribuída à nossa conta, e se se trata de um pacote da distribuição ou de uma compilação do fabricante.
- A data em que as correções da CVE-2026-109618 e da CVE-2026-109619 chegaram ao vosso parque de servidores, com a string da versão interna do pacote.
- Se a correção se aplica à SAPI que serve o nosso site (FPM, LiteSpeed, mod_php) e a qualquer nó de staging ou de cópia de segurança que venhamos a restaurar.
- Se a plataforma ainda não estiver corrigida: que controlo compensatório está em vigor e até quando.
- A vossa política permanente para ramos em fim de vida (EOL) — o que acontece ao meu site a 1 de janeiro de 2027, quando termina o suporte de segurança do PHP 8.2.
Um fornecedor que responda a essas cinco perguntas num único e-mail é um fornecedor que vale a pena manter. Um que volte com texto de marketing é uma conversa de migração; aplica-se aqui a mesma diligência do nosso trabalho de avaliação de lacunas ISO 27001, em que o entregável é evidência, não tranquilização.
Deve Assumir Que Foi Comprometido?
Não automaticamente — mas verifique em vez de conjecturar, sobretudo se o servidor esteve exposto à internet pública durante a janela anterior à aplicação do seu patch.
- Procure processos, portas à escuta e entradas de cron que não tenha criado, bem como ligações de saída do utilizador do worker do PHP.
- Compare, por diferenças, os diretórios com permissão de escrita da aplicação face a uma fonte fidedigna de deployment: ficheiros PHP novos, diretórios de upload modificados, pastas temporárias executáveis sem explicação.
- Pesquise nos registos web tempestades de pedidos nas horas da divulgação, corpos multipart invulgarmente grandes ou pedidos que devolveram 500 com assinaturas de OOM no registo de erros do PHP.
- Confirme que o binário corrigido está de facto a correr — a comparação da hora de reinício acima responde a isso.
- Se algo parecer estar errado, trate-o como um incidente: preserve o disco e os registos, renove todas as credenciais que a aplicação consiga ler e reconstrua a partir de uma imagem conhecida como boa. Reinstalar o pacote PHP por cima de um servidor comprometido não é remediação.
Um Exemplo Prático da Nossa Própria Infraestrutura
O worldwidetradex.com corre em Ubuntu 24.04 LTS com nginx e PHP-FPM, por isso aplicámos a nós próprios as verificações acima em 22 de outubro. Os resultados ilustram bem por que razão a aritmética das versões importa:
O php -v indicou PHP 8.3.6 — um número que, à luz do PHP upstream, parece três anos atrasado e alarmante.
O dpkg -l indicou 8.3.6-0ubuntu0.24.04.13, e o changelog Debian empacotado para essa versão exata lista a CVE-2026-109618 e a CVE-2026-109619 com o patch do fabricante aplicado. O apt-cache policy mostrou a versão instalada igual à candidata, por isso não havia nada mais recente pendente.
Conclusão: corrigido através do backport da distribuição, servido por PHP-FPM em vez de mod_php, com o serviço FPM reiniciado depois da atualização do pacote. O mesmo exercício, cinco comandos, e podemos mostrar a evidência a qualquer cliente que peça.
A lição aplica-se a qualquer stack: a sua postura de segurança é a versão do pacote, mais o changelog, mais o reinício — não a string de versão de marketing no painel do alojamento.
Torne a Correção Rotina, Não Heroísmo
O PHP2Shell não é memorável por ser exótico; é memorável porque o interpretador em que corre a maior parte da web tinha uma falha crítica, explorável antes da autenticação, e milhares de servidores tiveram de reagir em poucas horas. As equipas que atravessaram o episódio a dormir não tiveram sorte — tinham automatização.
- Atualizações de segurança automáticas e sem supervisão para o interpretador, com a versão e o reinício registados automaticamente.
- Um inventário que saiba que SAPI e que ramo de PHP cada site utiliza, incluindo staging, cópias de segurança e aquele WordPress de 2019.
- Um caminho de restauro ensaiado, para que «corrigir já» nunca seja posto na balança contra «não conseguimos voltar atrás».
- Um plano de ramos: nada num lançamento de PHP cujo suporte de segurança termine nos próximos doze meses.
- Um responsável nomeado por servidor e uma via de escalonamento escrita para os dias em que um patch surge às 14:00 UTC numa quarta-feira.
Se preferir comprar essa capacidade a contratá-la internamente, nós assumimos a responsabilidade de plataformas PHP em produção — cadência de patches, monitorização, cópias de segurança e restauros documentados — no âmbito do nosso trabalho de infraestrutura gerida. Comece com um resumo breve e as quantidades: peça um orçamento.
Perguntas Frequentes
O meu site está mesmo comprometido se correr uma versão de PHP não corrigida?
Não necessariamente. Uma instalação de PHP não corrigida e virada para a internet está exposta, e a sondagem começou por altura da divulgação, mas exposição não é comprometimento. Corrija primeiro e execute depois os passos de verificação acima; trate o servidor como comprometido apenas com base em evidências e, se encontrar alguma, reconstrua em vez de limpar.
O meu fornecedor de alojamento diz PHP 8.3.6. Está corrigido ou não?
Depende da compilação. Os pacotes das distribuições transportam as correções das CVE mantendo o número de versão upstream, por isso um PHP 8.3.6 do Ubuntu 24.04 ou do Debian já pode incluir ambas as correções. Peça a versão completa do pacote e a linha do changelog que nomeia a CVE-2026-109618 e a CVE-2026-109619; em plataformas geridas, peça antes a data do patch.
As atualizações de plugins, temas ou frameworks protegem-me do PHP2Shell?
Não. Ambas as falhas estão na configuração e no encerramento do pedido pelo interpretador PHP, não no código da aplicação. As atualizações da aplicação continuam a ser boa higiene e um WAF trava o tráfego oportunista, mas só a atualização do interpretador remove a vulnerabilidade.
Posso simplesmente definir um limite de memória mais baixo para bloquear a falha de esgotamento de memória?
O oposto. A orientação provisória do aviso para a CVE-2026-109618 é impedir o PHP de abortar no seu próprio teto de memória — memory_limit = -1, definido de modo a que o código da aplicação não o possa sobrepor — e depois limitar a complexidade dos pedidos no proxy e conter o worker com um limite de container ou cgroup. Um limite de PHP mais apertado fica dentro do modo de falha que está a ser explorado.
Estamos no PHP 8.1 ou anterior, que não teve lançamento upstream. E agora?
Mude para um ramo suportado se puder; essa é a resposta duradoura. Se não puder, tome a correção da sua distribuição ou do seu fabricante, que é a única fonte realista, ou aplique os backports mínimos de código-fonte que o projeto PHP publicou para 7.4, 8.0 e 8.1, se compilar a partir do código-fonte. Registe essa decisão, porque ela altera o seu perfil de risco em cada mês que a mantiver.
Atualizar do PHP 8.3 para o 8.3.36 é arriscado para uma loja em produção?
Uma atualização de segurança dentro da mesma minor muda o binário do interpretador, não a linguagem, pelo que a maioria das aplicações fica intacta. O risco é operacional: conjuntos de pacotes parciais, um reinício esquecido ou uma configuração que só se revela sob carga. Faça o snapshot, atualize todo o conjunto de pacotes do PHP, reinicie o processo que serve os pedidos e verifique — e faça-o primeiro em staging quando a plataforma é complexa.
Fontes
- PHP — aviso de segurança «Critical remote code execution vulnerabilities, update now» e os anúncios de lançamento de 21 de outubro de 2026, incluindo a orientação de mitigação e o calendário de suporte em versões suportadas.
- GitHub Security Advisories do repositório do PHP: GHSA-w8hw-w9fx-j79w (CVE-2026-109618) e GHSA-6wmf-4rv5-p3rp (CVE-2026-109619).
- CERT-EU — Security Advisory 2026-018, «Critical Vulnerabilities in PHP», que nomeia ambas as CVE.
- Infosecurity Magazine — «Critical PHP Vulnerabilities Leaked Ahead of Scheduled Security Patches» (21 de outubro de 2026) e «PHP2Shell Exploitation Attempt Detected by Amazon Four Days Before Vulnerability Disclosure» (22 de outubro de 2026).
Precisa de alguém que trate da atualização por si? Para falar de correção, de uma auditoria de versões, de migração para uma plataforma PHP gerida e corrigida ou da infraestrutura que a envolve, contacte-nos ou ligue para o +90 505 679 78 03.