[INCIDENTE GRAVE] PHP2Shell, Node.js e Java: o que as manchetes não contam e como verificar o patch

Este tópico foi traduzido automaticamente do espanhol. Ver original
Carlos Frias

Carlos Frias

1
Ro
Verificación en dos pasos activada
Verificado por Binance
Suscripción a IA
portada.webp

Uma semana, três frentes de segurança
PHP2Shell · Node.js · Java
Diagnóstico, mitigação e verificação · Data de corte: 25 de outubro de 2026​

Passei dois dias intervindo em servidores da minha empresa e de clientes por causa do PHP2Shell; somaram-se os avisos de Node.js e Java. Encontrei um problema repetido: instalar uma atualização e dar um serviço por encerrado sem verificar o que continua em execução.

Este guia cobre hospedagem compartilhada, VPS, painéis, contêineres e aplicações Java: diagnóstico, mitigações, correção e evidências para informar o cliente.

Por que trato isso como incidente grave: coincidem falhas graves em runtimes muito utilizados. É uma prioridade operacional; não implica um exploit compartilhado, gravidade idêntica nem comprometimento de qualquer servidor.

Leitura: hospedagem compartilhada, seção 8; administradores, inventário e frente correspondente. Identifique serviço, conta e runtime antes de agir. Não teste exploits em produção.

1. O mapa do que aconteceu

FrenteO que revisarObjetivo
PHP2ShellPHP de cada sitePatch e workers renovados
Node.jsRuntime e decodificaçãoVersão corrigida em cada aplicação
JavaJDK/JRE e confiança TLSBuild e truststore efetivos

Em 20 de outubro a Oracle publicou sua atualização trimestral. No dia 21 chegaram as correções principais de PHP e Node.js, e outro alerta da Oracle sobre certificados. No dia 23 o PHP acrescentou um aviso específico sobre sessões. No dia 24 a Oracle publicou outro alerta de certificados. Essa sequência importa: uma revisão feita no dia 21 pode precisar de verificações adicionais no dia 25.

2. O que as manchetes não contam

Pacote novo não equivale a processo renovado. Vi executáveis atualizados com processos anteriores em memória. Verifique caminhos e inicialização depois de renovar os afetados.

O console pode mostrar outro runtime. Cruze domínio ou serviço → processo → executável → pacote ou imagem → revisão corrigida. Inclua instalações privadas, por usuário e contêineres.

Um backport pode manter o número base. No CloudLinux e em outras distribuições, compare a revisão com o aviso do fabricante; PHP_VERSION sozinho não demonstra correção nem vulnerabilidade.

O WAF filtra determinadas requisições. Não comprova o patch, não garante cobrir todas as vias e não elimina persistência prévia.

«Não encontrei indícios» tem alcance. Documente datas, registros e sistemas revisados; isso não equivale a demonstrar que nunca aconteceu nada.

3. Primeiro: saber o que você executa

Guarde um retrato de sites e serviços, configuração, backups e recuperação viável. Anote o horário. Se houver indícios de intrusão, preserve registros e arquivos antes de modificá-los.

No Linux, um primeiro inventário de processos sem despejar argumentos completos:

Bash:
ps -eo pid,user,lstart,comm
ss -lntp

Depois identifique o PID que realmente atende o serviço. Este bloco pede um, valida que seja numérico e apenas consulta:

Bash:
read -r -p 'PID del proceso que vas a revisar: ' runtime_pid
case "$runtime_pid" in
  ''|*[!0-9]*) printf '%s\n' 'PID inválido'; exit 1 ;;
esac
readlink "/proc/$runtime_pid/exe"
ps -p "$runtime_pid" -o pid,user,lstart,comm

«(deleted)» após atualizar pode indicar um executável anterior ainda em uso; sua ausência não certifica o patch. Revise bibliotecas e resolva os caminhos no namespace real do processo.

Não publique saídas com dados de clientes ou infraestrutura privada.

4. PHP2Shell: patch e configuração

CVE-2026-109618 e CVE-2026-109619 afetam o gerenciamento de memória e o estado das requisições. Correções iniciais: 8.2.35, 8.3.36, 8.4.27 e 8.5.12. Compare os backports do fornecedor; para ramos antigos, exija cobertura explícita ou migre para um ramo com suporte. [1][2][3]

Verifique o PHP de cada domínio, não só «php -v». Um diagnóstico mínimo, colocado apenas em um acesso privado e restrito da aplicação, pode mostrar o contexto de uma requisição:

PHP:
<?php
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
    'version' => PHP_VERSION,
    'sapi' => PHP_SAPI,
    'binario' => PHP_BINARY,
    'ini' => php_ini_loaded_file(),
    'pid' => getmypid(),
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);

Não mostra automaticamente a revisão RPM nem comprova todos os workers. Evite exposição ao terminar e verifique cada nó, pool e réplica.

Como exemplo para FPM do EasyApache, PHP 8.3, o administrador pode identificar o pacote do executável e consultar seu histórico:

Bash:
rpm -qf /opt/cpanel/ea-php83/root/usr/sbin/php-fpm
rpm -q --changelog ea-php83-php-fpm | grep -E 'CVE-2026-(109618|109619)'

Adapte binário e pacote ao LiteSpeed, alt-php ou à sua distribuição. Um grep sem correspondências exige comparar revisão e aviso; não dá um veredito. Com painel, use primeiro os mecanismos oficiais dele.

Se você ainda não pode aplicar o patch: as medidas do advisory reduzem vias concretas; não há um bloco de configuração que substitua a correção completa. No php.ini, aplicado antes de processar requisições:

INI:
session.upload_progress.enabled = Off

; Solo para PHP 8.5
fatal_error_backtraces = Off

Em um pool FPM a sintaxe administrativa é diferente:

INI:
php_admin_flag[session.upload_progress.enabled] = off

; Solo para pools de PHP 8.5
php_admin_flag[fatal_error_backtraces] = off

Não confie em .user.ini nem em ini_set() para um caminho anterior ao script. Guarde a configuração, valide com o FPM correto, reinicie os workers e verifique. Desativar o progresso de upload pode afetar quem o utiliza. [2][3][4]

memory_limit = -1 é temporário. Elimina o limite controlável do PHP, não todas as falhas de alocação; pode esgotar recursos. RLIMIT_AS/DATA podem provocar a rota vulnerável e não servem como substitutos. Com cgroups, verifique o que um OOM mataria: agrupar master e workers pode derrubar o serviço. Não assuma que «LVE/cgroups» basta. [2]

Limite entradas no frontend de acordo com o advisory e a aplicação. Bloquear multipart quebra os uploads que precisem dele; não substitui atualizar.

Aviso do dia 23: manter desativado o progresso de upload cobre outro cenário, CVE-2026-115560: trocar o serializador php_binary/php_serialize para php durante a execução antes de session_start(), com essa função ativa. Consulte condições e a próxima correção. [1]

5. Node.js: npm update não basta

Releases corrigidas: 22.23.4, 24.22.1 e 26.12.1, conforme o ramo. Valide compatibilidade; não pule de ramo principal às cegas. Se estiver fora de suporte, planeje migração e cobertura. [5]

CVE-2026-111497, HIGH: Brotli malformado que a aplicação descomprime com node:zlib pode corromper a memória, com possível queda, vazamento ou execução de código. Revise entradas e respostas externas que cheguem a esse decodificador. Não implica RCE automático em todo Node exposto. [5]

CVE-2026-ÁreaRamos
105482DNS e NUL22/24/26
105483Validação TLS24/26
106069IP não canônico e TLS22/24/26
106072SAN DNS versus IP22/24/26
105481Resposta HTTP e keep-alive22/24/26
106074Entropia em snapshots/SEA22/24/26
106070Validação ZIP26
106071Permissões e curingas26
106073Permissões e realpathSync22/24/26
Consulte condições e gravidade individual no aviso: os dez problemas não afetam igualmente todos os ramos nem todas as aplicações. As releases também atualizam dependências e certificados. [5]

Para identificar o Node que o seu console invoca:

Bash:
node -p 'JSON.stringify({version:process.version,exe:process.execPath,openssl:process.versions.openssl},null,2)'

A consulta anterior não interroga sua aplicação em execução: cruze-a com PID, usuário, serviço e interpretador. npm update não substitui o Node. O nvm pode deixar caminhos antigos fixados; com PM2, revise e renove a aplicação específica, não todos os clientes.

Correção: faça backup e teste a compatibilidade; instale a release corrigida pelo canal oficial; atualize o caminho persistente, reconstrua e renove os processos; verifique runtime e funcionamento. Reconstrua também snapshots e executáveis SEA: atualizar o host não modifica esses artefatos.

Enquanto você atualiza: evite que Brotli não confiável chegue ao decodificador vulnerável, incluindo respostas externas. Desativar a compressão de saída no nginx não desativa a descompressão dentro do Node. Tamanhos máximos e WAF não corrigem corrupção de memória. Não desative a validação TLS para consertar conexões.

6. Docker: o host não é o contêiner

Um inventário inicial, com as permissões do ambiente:

Bash:
docker ps --format '{{.Names}}\t{{.Image}}\t{{.Ports}}'
read -r -p 'Nombre del contenedor Node que vas a consultar: ' runtime_container
docker exec "$runtime_container" node -p 'process.version + " | " + process.execPath'
docker inspect --format '{{.Id}} {{.Image}}' "$runtime_container"

docker exec cria outro processo: mostra o runtime disponível, não o que continua carregado na aplicação antiga. Verifique também o processo principal.

Corrija a imagem e o deploy: atualize a base ou a imagem do fabricante, reconstrua se for própria e recrie o serviço. Um docker cp pode se perder ao recriá-lo; reiniciar mantém a imagem anterior.

Com Compose, depois de fixar e revisar a imagem corrigida no arquivo do projeto, um exemplo limitado a um serviço é:

Bash:
read -r -p 'Servicio Compose que vas a actualizar: ' runtime_service
docker compose pull "$runtime_service"
docker compose up -d --no-deps "$runtime_service"

Verifique cada passo antes de continuar. O exemplo usa imagem publicada; uma própria exige reconstrução. Revise volumes, compatibilidade, segredos e recuperação. No Swarm/Kubernetes, revise todas as réplicas com seu deploy declarativo. Não faça purge de imagens nem de volumes. [6]

7. Java: build, JVM e confiança TLS

Aqui é preciso distinguir três publicações. O CPU da Oracle de 20 de outubro incorpora 55 patches de Java SE; sua matriz aponta 49 vulnerabilidades potencialmente exploráveis pela rede sem autenticação, sob suas respectivas condições. Não são 49 RCE universais contra qualquer Spring ou Tomcat. [7]

No dia 21 a Oracle publicou o CVE-2026-91403 para retirar a confiança de intermediárias relacionadas à eMudhra. No dia 24 publicou o CVE-2026-114820 para retirar determinadas raízes de confiança. São alertas de JSSE/TLS, com impacto em confidencialidade e integridade; eu não os descreveria como uma webshell remota em cada JVM. [8][9]

A armadilha do número curto: 21.0.13 fez parte do CPU, mas depois houve revisões adicionais. Para o Oracle JDK, a baseline publicada no dia 24 é:

FamíliaBuild Oracle de 24/10
81.8.0_511-b33
1111.0.33.0.3+1
1717.0.21.0.3+1
2121.0.13.0.3+1
2525.0.5.0.3+1

Estas builds são da Oracle: Temurin, Corretto, Zulu e as distribuições têm revisões e prazos próprios. Compare fornecedor e plataforma; para GraalVM ou outra família, a matriz correspondente. Valide compatibilidade e licença. [10]

Pelo console:

Bash:
java -version
read -r -p 'PID de la JVM de la aplicación: ' runtime_java_pid
jcmd "$runtime_java_pid" VM.version
jcmd "$runtime_java_pid" VM.system_properties | grep -E '^(java.home|javax.net.ssl.trustStore|javax.net.ssl.trustStoreType)='

O jcmd exige o contexto e as permissões adequadas, normalmente o mesmo usuário efetivo e um JDK compatível; resolva namespaces em contêineres. Um attach que falha não é evidência de segurança. Não publique todas as propriedades. [11]

Verifique o truststore efetivo. Pode ser o cacerts, um privado via javax.net.ssl.trustStore ou uma configuração da biblioteca. Atualizar o JDK não altera necessariamente uma cópia privada. A propriedade não aparecer não prova o que cada biblioteca usa.

A correção preferencial é a build atualizada do fornecedor, revisar os repositórios privados e reiniciar as JVMs que os usam. Se você ainda não pode instalá-la, a Oracle documenta opções temporárias: cópia do keystore antes de retirar as raízes indicadas, ou verificação de revogação. Não apague todas as CAs nem desative a verificação de certificados para resolver um erro TLS. [12]

Para aplicações TLS em que caiba a alternativa oficial de revogação, as propriedades de inicialização são:

Inserir CODE, HTML ou PHP:
-Dcom.sun.net.ssl.checkRevocation=true
-Dcom.sun.security.enableCRLDP=true

Verifique se a aplicação aplica essa política, alcança os serviços de revogação e mantém as conexões legítimas. Não corrige o restante do CPU. A Oracle oferece o CheckCerts.java: revise o programa oficial antes de executá-lo e verifique cada runtime e repositório. [12]

8. Se você está em hospedagem compartilhada

Peça evidências referentes à sua conta e ao seu nó. Você pode adaptar este texto:

Preciso confirmar a correção das vulnerabilidades aplicáveis ao runtime que executa meu domínio ou aplicação. Por favor, informem o ramo e o handler, o nome e a revisão completa do pacote ou build, a referência oficial que comprova a correção e a renovação dos seus processos. Se houver backport, preciso da revisão do fornecedor, não só do número base. Para Java, confirmem também os avisos de certificados de 21 e 24 de outubro e o truststore utilizado. Se alguma medida continuar sendo temporária, informem o seu alcance e o próximo passo.

Não peça dados de outros clientes. Não mude todos os sites de ramo principal sem verificar compatibilidade nem declare vulnerável um backport pela sua versão base.

9. A parte forense: procurar uma intrusão prévia

O patch não elimina uma intrusão anterior. Trabalhe com linha do tempo, originais preservados, horário, fuso e cobertura de cada fonte.

  • Requisições e WAF: data, caminho, método, regra, resposta e corpo disponível. Um 403 comprova essa rejeição, não todas as tentativas. Um 200 pode ser a página inicial normal; é preciso seguir a evidência.
  • Processos e erros: quedas, erros de memória, filhos inesperados e conexões novas. Não atribua um crash ao exploit sem correlação e diagnóstico.
  • Arquivos: alterações e proprietários comparados com deploys e fontes confiáveis. Um plugin atualizado hoje ou uma assinatura de antivírus que contém código suspeito não são automaticamente malware.
  • Persistência: crons, timers, unidades, chaves autorizadas, tarefas da aplicação e inicializações de contêineres. Compare com o estado conhecido, sem apagar por heurística.
  • Acessos e segredos: administradores, senhas de aplicação e alterações de permissões. Se houver comprometimento, contenha e limpe a causa antes de trocar credenciais a partir de um ambiente confiável.

Para um WordPress, com a conta dele e a partir da sua pasta, uma verificação limitada útil é:

Bash:
wp core verify-checksums --include-root
wp plugin verify-checksums --all
wp user list --role=administrator --fields=ID,user_login,user_registered

Os checksums precisam de referência de versão e procedência: um plugin comercial pode não tê-la. Analise arquivos adicionais; estes comandos não auditam o host. [13]

Na minha intervenção não encontrei evidência de exploração bem-sucedida no que foi revisado. Reservo as identidades e os dados dos clientes: o útil é o método e as provas.

10. Quando dar o trabalho por concluído

  • Inventário de domínios, serviços, runtimes privados, contêineres e réplicas reconciliado.
  • Versão completa ou backport comparado com o fabricante; downloads e assinaturas verificados pelo procedimento dele.
  • Processos renovados e inicializações persistentes apontando para o runtime previsto.
  • Configuração efetiva verificada, incluindo sessões PHP e repositórios TLS do Java quando se aplicarem.
  • Testes funcionais dos sites e aplicações: login, upload, tarefas, API e conexões externas pertinentes.
  • Revisão de indícios com datas e limites documentados; erros prévios separados das alterações introduzidas.
  • Backup recuperável e plano de reversão preservados. Uma mitigação pendente continua constando como pendente.

Se algo falhar após atualizar, diagnostique a incompatibilidade. Não desative controles nem volte silenciosamente a uma versão vulnerável; avalie isolamento e uma alternativa controlada.

Atualizar, mitigar e verificar são trabalhos diferentes. Quando os três são documentados, dá para informar o cliente com algo mais sólido do que um print do painel.

Fontes primárias e documentação

  1. PHP: avisos de 21 e 23 de outubro, versões e condições
  2. PHP: CVE-2026-109618, OOM e limites da mitigação
  3. PHP: CVE-2026-109619, ciclo de vida e auditoria
  4. PHP-FPM: configuração administrativa de pools
  5. Node.js: dez avisos, ramos e downloads corrigidos
  6. Docker: recriação de serviços com Compose
  7. Oracle: CPU de outubro e matriz do Java SE
  8. Oracle: alerta de 21 de outubro, intermediárias
  9. Oracle: alerta de 24 de outubro, raízes
  10. Oracle: builds e baseline de 24 de outubro
  11. Oracle: requisitos e comandos do jcmd
  12. Oracle: repositórios de confiança, alternativas e CheckCerts
  13. WordPress: documentação oficial do WP-CLI

Informações verificadas em 25 de outubro de 2026. As novas releases e revisões dos fabricantes podem mudar as recomendações; guarde sempre a referência e a data da sua verificação.

Até a próxima 🙂

CF
 
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
Muito obrigado por esta contribuição tão detalhada e técnica. Você tem toda a razão ao apontar que a vulnerabilidade do Node.js não recebeu a mesma divulgação que a do PHP; na verdade, essa nem passou pela minha cabeça. De qualquer forma, vou dar uma revisada nos meus serviços por pura precaução.
 
Muito obrigado, uma info excelente.
 
Voltar
Topo