A campanha que encadeou o PHP2Shell e o Fragnesia, CVE-2026-46300, contra firewalls expostos
Entre 8 e 24 de outubro de 2026, um operador de língua chinesa preparou e executou uma campanha contra interfaces de gerenciamento de firewalls PAN-OS expostas à internet. A entrada foi uma versão própria do exploit PHP2Shell, que dava execução de comandos com a conta sem privilégios do servidor web. A escalada foi o Fragnesia, uma falha do kernel Linux divulgada em maio, com exploit público, que escreve na cópia em memória de arquivos somente leitura: o operador reescreveu a configuração do su para aceitar qualquer senha e virou root. Vinte e quatro firewalls foram comprometidos em lote; em dois deles, ligados a um ambiente afiliado ao governo dos Estados Unidos, o operador abriu túneis, invadiu o servidor de gerenciamento interno e atacou o Active Directory. Uma falha de kernel de cinco meses, sem correção nos appliances, transformou uma execução limitada em controle total.
O PHP2Shell (CVE-2026-109618 e CVE-2026-109619) deu ao operador execução de comandos como nobody no servidor web de gerenciamento dos firewalls; o Fragnesia (CVE-2026-46300) transformou essa execução em root ao sobrescrever /etc/pam.d/su na memória com pam_permit.so, o que faz su root aceitar qualquer senha [1] [4]. A cadeia completa, de uma conexão HTTPS sem autenticação a uma webshell persistente com root, levava menos de 15 minutos [1] [6]. Como a escrita do Fragnesia acontece no cache de páginas, e não no disco, um reinício apaga a alteração e a evidência dela [3] [4]. Faça a triagem forense antes de reiniciar.
Em 25 de outubro de 2026, pesquisadores da Dream encontraram artefatos de uma campanha que comprometeu 25 servidores nos Estados Unidos, no Japão, em Taiwan e na Coreia do Sul: 24 firewalls e um servidor interno de gerenciamento de firewalls [1] [6]. Os artefatos incluíam o exploit, listas de alvos, registros de exploração e cerca de 40 scripts de pós-exploração [1] [5]. A Unit 42, da Palo Alto Networks, confirmou de forma independente as ferramentas e os resultados e rastreia a atividade como CL-UNK-1280 [1] [2].
A campanha seguiu um funil: cerca de 19.000 firewalls encontrados no buscador FOFA, cerca de 5.000 que responderam à identificação de versão e 240 alvos filtrados por país e versão vulnerável [1] [6]. A exploração em lote comprometeu 24 firewalls; 22 ficaram "estacionados", com webshell e sem outra ação, e dois foram priorizados [1]. Num deles, o operador abriu um túnel SSH reverso para a rede interna, comprometeu o servidor de gerenciamento com a mesma cadeia menos de 90 minutos depois e partiu para o Active Directory [1].
A CISA incluiu o Fragnesia no catálogo KEV em 28 de outubro, com prazo de 31 de outubro e exigência de triagem forense, e afirmou que a falha "pode ser encadeada com a CVE-2026-109618 e a CVE-2026-109619 para implantar webshells PHP e executar comandos como root" [4] [5].
As ações são três: atualize o PHP e o kernel, ou o firmware dos appliances que os embutem; tire interfaces de gerenciamento da internet; e, em qualquer equipamento que tenha ficado exposto, faça triagem forense antes de reiniciar, porque o reinício apaga a principal evidência da escalada [1] [3] [4].
Não houve submissão a sandbox, execução de exploit nem análise de amostra. O CiberLab não teve acesso aos artefatos recuperados. A descrição da campanha vem da pesquisa da Dream [1], confirmada pela Unit 42 [2] e coberta pela imprensa especializada [5] [6]; a mecânica do Fragnesia, da Tenable [3] e da HOL [4]. O PHP2Shell é descrito em detalhe no relatório PHP2Shell do CiberLab.
| Campo | Valor |
|---|---|
| Designação | CL-UNK-1280 (Unit 42); a Dream não nomeia um ator [1] |
| Atribuição provável | Operador de língua chinesa, fuso UTC+8 [1] [6] |
| Período | Preparação de 8 a 22 de outubro; exploração em 23 e 24 de outubro de 2026 [1] |
| Alvos | Interfaces de gerenciamento de firewalls PAN-OS expostas à internet [1] [2] |
| Países | Estados Unidos, Japão, Taiwan e Coreia do Sul [1] [6] |
| Versões perfiladas | PAN-OS 11.1 (PHP 7.4.33) e PAN-OS 12.1 e 12.2 (PHP 8.0.30) [1] |
| Fração afetada | Cerca de 0,02% da base instalada, contatada individualmente pela Palo Alto Networks [2] |
| Descoberta | Dream, 25 de outubro de 2026; pesquisa publicada em 27 e atualizada em 29 de outubro [1] [4] |
| Etapa | CVE | Natureza | Pontuação |
|---|---|---|---|
| Acesso inicial | CVE-2026-109618, CVE-2026-109619 | Execução remota sem autenticação no núcleo do PHP [7] | 9.2 em CVSS v4 [7] |
| Escalada | CVE-2026-46300 (Fragnesia) | Escalada local de privilégio no subsistema XFRM ESP-in-TCP do kernel Linux [3] | 7.8 em CVSS 3, estimado [3] |
Quando um programa lê um arquivo, o kernel Linux guarda o conteúdo em memória, no cache de páginas, para que as próximas leituras não precisem ir ao disco [3] [4]. Todo processo que abre o mesmo arquivo vê essa cópia em memória. Se alguém consegue escrever nela, muda o que o sistema enxerga como conteúdo do arquivo, mesmo que o arquivo seja somente leitura e o disco continue intacto [3] [4].
O Fragnesia foi divulgado em 13 de maio de 2026 por William Bowling, da V12 Security, com prova de conceito pública e correção no kernel [3]. Quando a função skb_try_coalesce() junta fragmentos de pacotes de rede, ela deixa de propagar a marca SKBFL_SHARED_FRAG, que indica páginas compartilhadas com outros subsistemas [3] [4]. Sem a marca, páginas que pertencem ao cache de arquivos passam a ser tratadas como graváveis. O caminho ESP-in-TCP do IPsec então decifra esses fragmentos no lugar, e grava sobre o cache de um arquivo somente leitura os bytes do fluxo de cifra AES-GCM que o atacante escolheu, 192 bytes por vez [3] [4].
A exploração não depende de corrida [3]. Exige acesso local sem privilégio e usa namespaces de usuário e de rede, ligados por padrão na maioria das distribuições, para obter CAP_NET_ADMIN sem privilégio no host; exige também que os módulos ESP estejam disponíveis [3]. A prova de conceito pública reescreve /usr/bin/su em memória [3] [4].
O Fragnesia pertence à mesma classe do Dirty Frag (CVE-2026-43284 e CVE-2026-43500), que também escreve no cache de páginas pelo caminho XFRM e ESP, com outro ponto de entrada [3] [5]. As correções do Dirty Frag não corrigem o Fragnesia; quem só aplicou aqueles patches continua vulnerável, enquanto quem bloqueou os módulos esp4, esp6 e rxrpc para o Dirty Frag já está protegido [3] [4].
| Ramo | Primeira versão corrigida |
|---|---|
| 7.0 | 7.0.10 [4] |
| 6.18 | 6.18.33 [4] |
| 6.12 | 6.12.91 [4] |
| 6.6 | 6.6.141 [4] |
| 6.1 | 6.1.174 [4] |
| 5.15 | 5.15.208 [4] |
A correção é o commit f84eca581739, "net: skbuff: preserve shared-frag marker during coalescing", integrado em 21 de maio [4]. Ubuntu 20.04 e anteriores com kernel padrão não são afetados, e o Amazon Linux também não, porque não traz o módulo espintcp [3] [4].
| Data | Evento |
|---|---|
| 13 de maio | Divulgação do Fragnesia, com exploit público e CVE [3] |
| 8 de outubro | Início da preparação da operação [1] |
| 8 a 22 de outubro | Desenvolvimento do exploit, perfilamento de versões em laboratório e varredura dos alvos [1] |
| 21 de outubro | O projeto PHP publica as correções do PHP2Shell [7] |
| 23 de outubro, 18h14 | Primeiro firewall afiliado ao governo dos EUA comprometido no lote automático; ele cai pouco depois e não volta. O operador faz 240 sondagens em duas horas [1] |
| 24 de outubro, 10h09 | Segundo firewall da mesma organização comprometido em campanha dedicada [1] |
| 24 de outubro | Túnel SSH reverso e proxy SOCKS5 abertos para a rede interna [1] |
| 24 de outubro, 11h35 | Servidor interno de gerenciamento de firewalls comprometido pelo túnel; total chega a 25 [1] |
| 24 de outubro, depois | Ataque ao Active Directory a partir do servidor de gerenciamento [1] |
| 25 de outubro | A Dream encontra os artefatos [1] [6] |
| 28 de outubro | CISA inclui a CVE-2026-46300 no KEV [4] [5] |
| 29 de outubro | A Dream atualiza a pesquisa após colaborar com a Palo Alto Networks; a Unit 42 publica a confirmação [1] [2] |
O operador usou o FOFA, um buscador chinês de ativos expostos na internet, para encontrar cerca de 19.000 dispositivos PAN-OS [1]. Um varredor próprio com 200 threads identificou cerca de 5.000 dispositivos ativos e suas versões, e um filtro por país e versão vulnerável reduziu a lista a 240 alvos [1] [6].
A versão do exploit era própria e não pública, e mirava o mecanismo session.upload_progress do servidor web de gerenciamento do firewall, o appweb [1] [6]. Ela tinha quatro estágios [6]:
multipart construídas para esgotar a memória e moldar o alocador do PHP.Set-Cookie, um ponteiro da libphp.so, usado para calcular endereços.system().nobody, e a última requisição disparava o Fragnesia.Com a escrita no cache de páginas, o operador sobrescreveu /etc/pam.d/su para usar pam_permit.so, o módulo PAM que aprova qualquer autenticação, e passou a obter root com su sem senha [1] [4]. O exploit público funciona em kernels anteriores a 13 de maio de 2026 [5]; o sucesso da escalada em 25 equipamentos indica, por inferência, que eles rodavam kernel sem a correção.
Um executor em lote atacava cinco alvos por vez, com 30 minutos de limite por alvo; cada sucesso recebia uma webshell, uma verificação de root com id e uma linha no registro [1]. Foram 24 firewalls com root e webshells PHP de 103 bytes [1] [6]. O operador deixou 22 deles parados e se concentrou em dois, ligados por dados de certificado à mesma organização afiliada ao governo dos EUA [1].
O PHP2Shell sozinho dava ao operador a conta nobody, sem acesso a chaves, configurações protegidas nem ao sistema. O que transformou a campanha em comprometimento total foi uma falha de kernel corrigida cinco meses antes [3] [4]. Appliances que embutem Linux recebem o kernel junto com o firmware do fabricante; se o firmware atrasa, a correção pública não chega ao equipamento. Trate escaladas locais com exploit público como urgentes também em appliances, e não só em servidores com usuários.
No firewall priorizado, o operador montou um túnel SSH reverso de oito portas até a sua infraestrutura, com um serviço systemd e um gancho em rc.local que sobrevivem a reinícios e reconectam sozinhos [1]. Os scripts do túnel ficavam em /usr/local/lib/.panops/ [1]. O túnel encaminhava acesso aos controladores de domínio (LDAP, LDAPS e RDP), ao servidor interno de gerenciamento, à infraestrutura de VPN GlobalProtect e a um proxy SOCKS5 [1]. A partir do servidor de gerenciamento, o operador atacou o Active Directory; a tabela 5 separa o que a Dream confirmou do que não pôde determinar [1].
| Atividade | Situação |
|---|---|
| Decifração da senha da conta de serviço LDAP com a chave mestra do dispositivo, guardada em texto claro nos scripts | Confirmada [1] |
| Enumeração completa de usuários e grupos do domínio | Confirmada [1] |
| Análise de caminhos de ataque por ACL | Confirmada [1] |
| Tentativa de extração da chave de assinatura SAML e sondagem de desvio de autenticação no Keycloak | Tentativa confirmada, resultado desconhecido [1] |
| Pulverização de senhas, num domínio sem bloqueio de conta | Desconhecido [1] |
| Criação de usuário de porta dos fundos, tentada em todas as OUs | Desconhecido [1] |
Criação de conta de máquina pela cota padrão MachineAccountQuota | Desconhecido [1] |
O operador também coletou do sistema de arquivos dos firewalls as chaves de replicação de alta disponibilidade, as chaves privadas TLS e as chaves de autenticação do dispositivo; o provedor SAML estava configurado com validate-idp-certificate: no [1].
A Dream não sabe se a pulverização de senhas, a criação de contas ou a extração da chave SAML deram certo [1]. Uma organização que encontre sinais desta campanha não deve concluir que o domínio está íntegro por falta de prova do contrário: audite contas, cotas de máquina e chaves SAML como se essas ações tivessem tido sucesso.
Os indícios de origem são prompts em chinês, carimbos de tempo em UTC+8, acesso ao FOFA com chaves de API e os modelos DeepSeek e Kimi configurados na infraestrutura do operador [1] [6]. A Dream não atribui a operação a um ator nomeado [1] [6].
Na infraestrutura de ataque havia ferramentas de IA: a plataforma ofensiva aiscan, configurada com DeepSeek e Kimi, e o Claude Code [1]. A Dream considera provável que a pós-exploração tenha sido assistida por IA, pela consistência dos scripts, mas declara não ter evidência direta de que IA escreveu o exploit ou os scripts e não descreve a operação como autônoma [1] [6]. A ferramenta de túnel iox, de origem chinesa, completava o conjunto [1].
Em 23 de outubro, a Unit 42 publicou uma atualização sobre atividade pós-exploração com IA agêntica ligada ao PHP2Shell, e a retirou em 25 de outubro por não conseguir confirmar a ligação do acesso inicial com as CVEs [2]. Esse episódio não se refere à campanha da Dream. Não misture as duas ao citar o envolvimento de IA.
A ordem vai do mais barato e abrangente ao mais caro e específico: rede, registros web, arquivos no equipamento e, por fim, identidade.
Procure sessões SSH de saída persistentes a partir de firewalls e portas encaminhadas para LDAP, RDP e serviços de gerenciamento internos [1]. Um firewall não tem motivo para abrir SSH de saída para a internet.
Revise os registros da interface de gerenciamento em busca de rajadas de POST multipart com nomes de arquivo muito grandes e campos de progresso de sessão, e de valores anormais de Set-Cookie [1]. Os sinais detalhados do PHP2Shell estão na seção 7 do relatório PHP2Shell.
As verificações abaixo cobrem os artefatos documentados pela Dream [1] [4]. Rode antes de qualquer reinício:
# Webshell da campanha e PHP inesperado em diretorios publicos
ls -la /unauth/php/change_password.php
find / -xdev -name '*.php' -newermt '2026-10-08' 2>/dev/null
# PAM reescrito em memoria: compare o que o sistema le
# com o que esta no disco (o cache some no reinicio)
grep -n pam_permit /etc/pam.d/su
# Persistencia do tunel
ls -la /usr/local/lib/.panops/
systemctl list-unit-files --state=enabled
cat /etc/rc.local
Qualquer entrada pam_permit em /etc/pam.d/su é sinal de alerta [1]. Como o Fragnesia altera só o cache, o arquivo pode parecer normal depois de um reinício ou de uma limpeza do cache; registre o conteúdo lido antes [4].
Revise os registros do firewall e do servidor de gerenciamento em busca de grande volume de consultas LDAP e de falhas de login em muitas contas, padrão de pulverização [1]. No Active Directory, procure usuários e contas de máquina criados a partir de 24 de outubro.
title: Configuracao PAM do su apontando para pam_permit
id: 9b1e4c77-2f3a-4d58-8e06-6a2c5d0f13b4
status: experimental
description: Alteracao de /etc/pam.d/su usada na escalada do Fragnesia
(CVE-2026-46300) apos o PHP2Shell
author: CiberLab (Ciência Embarcada)
references:
- https://dreamgroup.com/blog/chained-php2shell-exploit-roots-25-servers
logsource:
product: linux
category: file_event
detection:
selection:
TargetFilename: '/etc/pam.d/su'
condition: selection
falsepositives:
- Atualizacao legitima de pacotes PAM
level: high
tags:
- attack.persistence
- attack.t1556.003
- cve.2026-46300
Esta regra só vê alterações gravadas pelo caminho normal de arquivos. A escrita do Fragnesia no cache de páginas não passa por esse caminho e pode não gerar o evento; trate a regra como cobertura para variantes que gravem em disco, e não como detecção do Fragnesia [3] [4].
Tire da internet as interfaces de gerenciamento do PAN-OS e os portais GlobalProtect onde for possível, e restrinja o acesso de gerenciamento a IPs internos confiáveis [1] [2]. Bloqueie SSH de saída a partir dos firewalls.
Aplique as versões corrigidas do PAN-OS para o seu ramo, conforme o aviso do fabricante, que interrompem a cadeia observada [2]. Em servidores Linux comuns, atualize o PHP e o kernel; se o kernel não puder ser atualizado já, bloqueie os módulos esp4, esp6 e rxrpc, o que pode quebrar IPsec ou AFS no host [3]:
rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf
Trate o servidor de gerenciamento e todo firewall com webshell como comprometidos, e reconstrua a partir de imagens confiáveis [1].
ms-DS-MachineAccountQuota como 0 e aplique política de bloqueio de conta [1].O reinício limpa o cache de páginas e, com ele, a alteração do PAM feita pelo Fragnesia [3] [4]. A CISA exige triagem forense para esta CVE [4]. Colete o conteúdo de /etc/pam.d/su, a lista de processos, as conexões e os arquivos da seção 7.3 antes de reiniciar ou atualizar o equipamento.
IDs e nomes conferidos na base oficial do MITRE ATT&CK for Enterprise [8]; o mapeamento é do CiberLab, a partir das evidências descritas em [1]:
| Técnica | Nome | Relação com o caso |
|---|---|---|
| T1596.005 | Search Open Technical Databases: Scan Databases | Descoberta de cerca de 19.000 dispositivos no FOFA [1] |
| T1595.002 | Active Scanning: Vulnerability Scanning | Identificação de versão com varredor de 200 threads [1] |
| T1190 | Exploit Public-Facing Application | PHP2Shell na interface de gerenciamento [1] [2] |
| T1059.004 | Command and Scripting Interpreter: Unix Shell | Comandos via system() como nobody [6] |
| T1068 | Exploitation for Privilege Escalation | Fragnesia para chegar a root [1] [4] |
| T1556.003 | Modify Authentication Process: Pluggable Authentication Modules | /etc/pam.d/su reescrito com pam_permit.so [1] [4] |
| T1505.003 | Server Software Component: Web Shell | Webshells PHP de 103 bytes [1] [6] |
| T1543.002 | Create or Modify System Process: Systemd Service | Serviço que mantém o túnel [1] |
| T1037.004 | Boot or Logon Initialization Scripts: RC Scripts | Gancho em rc.local [1] |
| T1572 | Protocol Tunneling | Túnel SSH reverso de oito portas [1] |
| T1090 | Proxy | Proxy SOCKS5 para a rede interna [1] |
| T1552.001 | Unsecured Credentials: Credentials In Files | Senha LDAP decifrada da configuração [1] |
| T1552.004 | Unsecured Credentials: Private Keys | Chaves TLS, de alta disponibilidade e do dispositivo [1] |
| T1087.002 | Account Discovery: Domain Account | Enumeração completa de usuários e grupos [1] |
| T1110.003 | Brute Force: Password Spraying | Pulverização tentada, resultado desconhecido [1] |
| T1136.002 | Create Account: Domain Account | Criação de contas tentada, resultado desconhecido [1] |
| T1606.002 | Forge Web Credentials: SAML Tokens | Tentativa de extrair a chave de assinatura SAML [1] |
A Dream não publicou IPs, domínios ou hashes e remete os indicadores de rede à Unit 42, que também não os lista publicamente [1] [2]. Os indicadores abaixo são caminhos de arquivo, artefatos e comportamentos documentados:
| Tipo | Indicador | Severidade | Contexto e ação |
|---|---|---|---|
| Arquivo | /unauth/php/change_password.php | Crítica | Webshell PHP de 103 bytes com root, em diretório público [1]. |
| Arquivo | /etc/pam.d/su com pam_permit.so | Crítica | Escalada pelo Fragnesia; colete antes de reiniciar [1] [4]. |
| Diretório | /usr/local/lib/.panops/ | Crítica | Scripts do túnel, chamados por systemd e rc.local [1]. |
| Ferramenta | iox | Alta | Utilitário de túnel usado pelo operador [1]. |
| Rede | SSH de saída persistente a partir do firewall | Crítica | Túnel reverso de oito portas para a infraestrutura do operador [1]. |
| Configuração | validate-idp-certificate: no | Média | Validação SAML desligada, explorável para forjar asserções [1]. |
Da webshell ao root, a campanha PHP2Shell e Fragnesia. Relatório técnico de inteligência de ameaças, versão 1.0, emitido em 2 de novembro de 2026.
CiberLab, uma iniciativa do Ciência Embarcada.
Classificado TLP:CLEAR: distribuição livre, sem restrição de compartilhamento.