PHP CVE-2026-115560: A Verdade Sobre o Novo Alerta de RCE e Mitigação

PHP CVE-2026-115560: A Verdade Sobre o Novo Alerta de RCE e Mitigação

A vulnerabilidade CVE-2026-115560 é um aviso de segurança emitido pela equipa do PHP dois dias após as correções de emergência do exploit PHP2Shell (CVE-2026-109618 e CVE-2026-109619). O vetor envolve a funcionalidade session.upload_progress combinada com a troca dinâmica do manipulador de serialização (session.serialize_handler) antes de session_start(). Plataformas padrão como WordPress e Laravel não executam essa troca e não estão vulneráveis por omissão. Como medida preventiva universal para qualquer servidor Linux, deves desativar a funcionalidade definindo session.upload_progress.enabled = 0 no php.ini até que a correção de rotina seja lançada.

Se acompanhas canais de inteligência de cibersegurança e redes de administradores de sistemas (como o cybersecurity_outlook), viste disparar um novo alarme generalizado: “Dois dias após o PHP2Shell, foi descoberto outro 0-day de RCE não corrigido no núcleo do PHP!”.

Quando surge uma manchete destas, a reação imediata de muitas equipas de engenharia divide-se entre o pânico desnecessário e a paralisia operacional. No entanto, em administração de infraestruturas críticas, a nossa obrigação é separar o ruído mediático dos factos técnicos verificados.

Este alerta complementa diretamente a estratégia de resposta a incidentes do nosso Alerta CISA, NSA e FBI: Blindagem PHP, Node e Portas Expostas e o manual de Mitigação PHP2Shell em Painéis de Controlo.

No Webxtek Studio, onde gerimos operações para empresas de cibersegurança e pen-test e plataformas de SaaS empresarial B2B, auditámos o comportamento deste vetor no código-fonte do interpretador PHP. Abaixo explico com rigor o que acontece no motor de sessões, quem está realmente em perigo e como neutralizar a superfície de ataque em 60 segundos.


1. A Anatomia do CVE-2026-115560: O Desfasamento de Serialização de Sessão

Para compreenderes este vetor sem alarmismos, tens de olhar para a forma como o PHP processa carregamentos de ficheiros em segundo plano.

Desde a versão 5.4, o PHP inclui nativamente a diretiva session.upload_progress.enabled = 1 (ativa por omissão). Quando um cliente envia um pedido HTTP POST multipart contendo um campo oculto com o nome PHP_SESSION_UPLOAD_PROGRESS, o motor interno do PHP interceta os bytes do upload antes de qualquer código da tua aplicação começar a correr.

Para permitir que o frontend consulte o progresso da transferência, o interpretador escreve dados de telemetria diretamente na superglobal $_SESSION:

Fluxo Normal de Upload Progress:
1. Cliente envia POST multipart/form-data com chave PHP_SESSION_UPLOAD_PROGRESS.
2. SAPI/FastCGI interceta o fluxo antes do script do utilizador.
3. PHP inicializa a sessao e escreve $_SESSION["upload_progress_" . $id].
4. Os dados sao serializados em disco ou Redis conforme session.serialize_handler.

O problema reside no mecanismo de serialização interna do PHP quando ocorrem três condições em simultâneo:

  1. Configuração Base: O ficheiro php.ini ou a configuração global do servidor define o manipulador de serialização como php_binary ou php_serialize.
  2. Troca Dinâmica em Runtime: A aplicação executa ini_set('session.serialize_handler', 'php') em tempo de execução antes da invocação de session_start().
  3. Funcionalidade Ativa: A diretiva session.upload_progress.enabled permanece ligada.

Neste cenário específico, o PHP grava o registo de progresso de upload com um formato de codificação e tenta posteriormente desserializar os dados da sessão com um analisador sintático diferente. Esta discrepância de formato cria uma desserialização assimétrica: um atacante consegue manipular o prefixo de dados da sessão e injetar objetos serializados forjados (POP Gadgets), alcançando execução remota de código no processo do servidor.


2. Pânico das Redes Sociais vs. Realidade Operacional: Quem Está em Risco?

A classificação de uma falha de segurança como “RCE não corrigida” gera sempre alarme imediato. Contudo, importa analisar porque é que a equipa do PHP não lançou uma versão de emergência:

Comparacao de Gravidade Operacional:

Vetor: PHP2Shell (CVE-2026-109618 / 109619)
- Gravidade: CVSS 9.2 (Critico Universal)
- Condicao: Qualquer servidor com PHP unpatched a receber POST multipart
- Impacto: Exploracao remota sem autenticacao em qualquer WordPress/Laravel
- Acao do PHP: Release de emergencia fora de ciclo (8.2.35, 8.3.36, 8.4.27)

Vetor: CVE-2026-115560
- Gravidade: Aviso Informativo (Configuracao Especifica)
- Condicao: Requer troca de session.serialize_handler via ini_set() antes de session_start()
- Impacto: Restrito a aplicacoes que forcam alternancia de serializadores em runtime
- Acao do PHP: Resolucao agendada no ciclo regular de bugfix mensal

O Teu CMS Está Vulnerável?

  • WordPress e WooCommerce: Não estão vulneráveis por omissão. O WordPress não utiliza a funcionalidade de upload progress do PHP para a sua biblioteca de media e não altera os serializadores de sessão nativos.
  • Laravel e Symfony: Não estão vulneráveis por omissão. As frameworks modernas utilizam manipuladores de sessão próprios (geralmente geridos em base de dados, Redis ou cookies encriptados) em vez do mecanismo padrão do PHP em ficheiros de texto.
  • Aplicações Proprietárias e Código Legado: Se geres plataformas desenvolvidas à medida que dependem de bibliotecas antigas de upload de ficheiros, ou sistemas que alternam entre formatos binários de sessão, a exposição é real e exige intervenção imediata.

3. Mitigação Imediata no Terminal: Como Proteger o Teu Servidor em 60 Segundos

A recomendação oficial da equipa do PHP consiste em desativar o progresso de upload de sessões. Esta funcionalidade é quase obsoleta em 2026, uma vez que a grande maioria dos websites e APIs utiliza carregamentos assíncronos diretos (como S3 presigned URLs ou WebSockets) sem depender da superglobal de sessão do servidor.

Passo 1: Verificar o Estado Atual no Teu Servidor

Executa no terminal para identificar se a funcionalidade está ativa:

php -i | grep -E "session\.upload_progress\.(enabled|name)"

Se o comando devolver session.upload_progress.enabled => On => On, o teu ambiente está com a funcionalidade ligada.

Passo 2: Desativar no Debian, Ubuntu ou Servidores Bare-Metal

Para servidores com PHP-FPM em Debian ou Ubuntu (substitui a versão conforme o teu PHP ativo):

# Desativar em todas as versoes instaladas do PHP-FPM
for ini in /etc/php/*/fpm/php.ini; do
  if [ -f "$ini" ]; then
    echo "A ajustar $ini..."
    sudo sed -i 's/^session.upload_progress.enabled = .*/session.upload_progress.enabled = 0/' "$ini"
    if ! grep -q "^session.upload_progress.enabled = 0" "$ini"; then
      echo "session.upload_progress.enabled = 0" | sudo tee -a "$ini"
    fi
  fi
done

# Reiniciar os servicos PHP-FPM para aplicar a alteracao
sudo systemctl reload "php*-fpm" || sudo systemctl restart "php*-fpm"

Passo 3: Desativar no HestiaCP, Plesk ou cPanel

Se geres múltiplos clientes através de painéis de controlo de alojamento:

  • HestiaCP: Podes forçar a desativação diretamente nos modelos de pool em /etc/php/8.3/fpm/pool.d/ ou adicionar a diretiva de bloqueio:
    echo "php_admin_value[session.upload_progress.enabled] = 0" | sudo tee -a /etc/php/*/fpm/pool.d/*.conf
    sudo systemctl reload "php*-fpm"
  • cPanel com EasyApache 4: Edita o ficheiro global /opt/cpanel/ea-php*/root/etc/php.ini ou adiciona uma diretiva local via WHM MultiPHP INI Editor definindo session.upload_progress.enabled = Off, seguido de:
    /scripts/restartsrv_apache_php_fpm
  • Plesk:
    for ini in /opt/plesk/php/*/etc/php.ini; do
      sed -i 's/^session.upload_progress.enabled = .*/session.upload_progress.enabled = 0/' "$ini"
    done
    systemctl reload "plesk-php*-fpm"

Passo 4: Contentores Docker em Produção

Se publicas aplicações PHP em Docker, adiciona um ficheiro de configuração dedicado no teu Dockerfile para garantir que a imagem nasce protegida:

# Blindagem contra CVE-2026-115560 e PHP2Shell
RUN echo "session.upload_progress.enabled = 0" > /usr/local/etc/php/conf.d/security-hardening.ini \
    && echo "session.upload_progress.cleanup = 1" >> /usr/local/etc/php/conf.d/security-hardening.ini

4. Conclusão: A Importância da Blindagem Perimetral em Profundidade

O aparecimento do CVE-2026-115560 logo após o terramoto do PHP2Shell demonstra uma regra básica de engenharia de segurança: quando uma funcionalidade central antiga do PHP é dissecada por investigadores e atacantes, todos os mecanismos periféricos adjacentes (gestão de memória, sessões, temporários) começam a ser auditados à lupa.

A melhor defesa contra vulnerabilidades no interpretador nunca é esperar pelo próximo patch de emergência; é reduzir ativamente a superfície de ataque:

  1. Atualiza os Binários: Mantém as versões estáveis do PHP compiladas e corrigidas (8.2.35+, 8.3.36+, 8.4.27+).
  2. Elimina Funcionalidades Obsoletas: Desativa session.upload_progress.enabled = 0 em todos os nós.
  3. Tranca o Perímetro: Conforme demonstrámos no nosso artigo sobre o fecho de portas e painéis de controlo, portas de gestão expostas (cPanel 2083, Plesk 8443, HestiaCP 8083) devem ser bloqueadas com nftables e acessíveis apenas via WireGuard.
  4. Isola os Processos: Utiliza sockets UNIX protegidos com permissões restritas e jaulas chroot para programadores, tal como documentámos no nosso guia de Isolamento SSH com Jailkit no HestiaCP.

Com estas medidas aplicadas, o teu servidor deixa de estar à mercê de ondas de exploração automatizada e opera com a resiliência exigida em ambientes de produção.

[+] [ INDEX_DIRECTORY ] 17 tópicos ▼
[ SYSTEM.FAQ ]

Perguntas Frequentes

O que é a vulnerabilidade CVE-2026-115560 no PHP?

É um aviso de segurança emitido pela equipa oficial do PHP relativo a um vetor de execução remota de código (RCE) na funcionalidade session.upload_progress. O problema ocorre quando uma aplicação define o manipulador de serialização para php_binary ou php_serialize e depois altera dinamicamente essa opção para php através de ini_set() antes de chamar session_start().

O meu site WordPress ou aplicação Laravel está vulnerável ao CVE-2026-115560 por omissão?

Não. As principais frameworks e CMS de mercado (WordPress, Laravel, Symfony, Drupal e Magento) não alteram dinamicamente o session.serialize_handler em tempo de execução antes do session_start(). O risco afeta sobretudo aplicações proprietárias antigas, código legado com gestores de sessão customizados ou bibliotecas que forçam alternância de serializadores.

Porque é que a equipa do PHP não lançou uma versão de emergência fora de calendário como no PHP2Shell?

Porque a combinação de configurações e comportamentos em runtime necessária para explorar o CVE-2026-115560 é invulgar na maioria das aplicações em produção. A equipa de segurança do PHP avaliou o risco prático como reduzido para a maioria dos utilizadores e optou por integrar a correção definitiva no ciclo regular de manutenção mensal.

Qual é a medida de mitigação temporária recomendada antes da atualização oficial?

Basta desativar o progresso de upload de sessão definindo session.upload_progress.enabled = 0 no teu php.ini ou nas configurações de pool do PHP-FPM. Se já aplicaste a mitigação completa do PHP2Shell recomendada pelo Webxtek Studio, esta opção já está desativada no teu servidor e estás totalmente protegido.

> INICIAR_PROJETO

Precisa de um website que transmita confiança, apareça na pesquisa e dê mais força à sua presença digital? Comece a conversa aqui.