Rootkit PoisonedRefresh injeta web shell na memória do BIG-IP
A Sophos X-Ops dissecou um implante Linux que altera como o Apache enxerga arquivos PHP em memória. O arquivo em disco continua limpo, e o web shell só existe dentro do processo — quebrando a premissa das ferramentas de varredura.
Imagem editorial original do Plugged Ninja.
A Sophos X-Ops publicou em 7 de setembro de 2026 a análise técnica de um implante Linux recuperado de ambientes F5 BIG-IP APM comprometidos. Assinado pelo pesquisador Luke Mitchell, o texto descreve um malware que entrega ao atacante uma capacidade familiar — execução remota de código no servidor, o que qualquer defensor chamaria de web shell — mas por um caminho que praticamente anula as ferramentas de inspeção de arquivos.
O ponto central é este: o web shell não precisa existir em disco. O implante intercepta o momento em que o PHP mapeia determinados arquivos para a memória e antepõe o código malicioso a essa representação em memória. O arquivo continua íntegro no sistema de arquivos; o processo do Apache executa outra coisa.
Durante a pesquisa, a Sophos soube que a ESET havia analisado a mesma família de forma independente e a batizou de PoisonedRefresh. A Sophos detecta a amostra como Linux/Agnt-IC. O hash SHA-256 divulgado é 26bd5b0722d1dbab5db749a063c49bc8638653ac2addfead7a9cb3d6d57bccc9.
O contexto: CVE-2025-53521 e os appliances expostos
O implante não é o vetor de entrada. Segundo a Sophos, ele aparenta ser uma carga de segundo estágio, e a F5 associa a atividade relacionada a sistemas BIG-IP APM afetados pela CVE-2025-53521.
O histórico dessa vulnerabilidade explica por que ainda há ambientes expostos. Ela foi divulgada pela F5 em outubro de 2025 no ciclo trimestral de avisos e classificada inicialmente como falha de negação de serviço, com CVSS v4 de 8,7. Em março de 2026, a F5 revisou o aviso e a reclassificou como execução remota de código sem autenticação, elevando as notas para 9,8 no CVSS v3.1 e 9,3 no CVSS v4. A CISA incluiu a falha no catálogo de vulnerabilidades exploradas conhecidas (KEV) em 27 de março de 2026.
A condição de exposição é específica: o BIG-IP precisa ter uma política de acesso do módulo APM configurada em um servidor virtual. Segundo os avisos públicos, os ramos afetados são 17.5.0 a 17.5.1, 17.1.0 a 17.1.2, 16.1.0 a 16.1.6 e 15.1.0 a 15.1.10. O aviso da F5 é o K000156741.
O tamanho da superfície ainda exposta é o dado mais desconfortável. A ShadowServer Foundation, que mantém um rastreador para sistemas BIG-IP APM vulneráveis à CVE-2025-53521, reportou 795 endpoints expostos na internet em 7 de setembro de 2026 — mais de cinco meses depois da entrada no catálogo da CISA.
O que muda em relação a um web shell tradicional
Quando um defensor ouve “web shell”, pensa em um script pequeno em PHP, JSP ou ASP, colocado em um diretório acessível pela web — mas presente em disco e, portanto, encontrável. Foi essa premissa que moldou anos de lógica de detecção: varrer diretórios de web root, procurar nomes de parâmetro característicos em requisições HTTP, monitorar integridade de arquivos. A Sophos aponta três formas pelas quais esta amostra quebra esse modelo:
- Entrega sem arquivo. A capacidade de web shell continua existindo, mas não está ancorada em um script estático. O implante intercepta o carregamento de arquivos PHP específicos e antepõe o web shell à representação em memória no momento do
mmap(). - Comprometimento no nível do processo, não da aplicação. O implante redireciona chamadas selecionadas da libc e da libphp dentro dos processos worker do Apache. Todo componente PHP executado naquele processo — plugins, scanners, scripts locais — passa a rodar dentro de um ambiente de execução manipulado.
- Dois canais de acesso. Além da carga PHP acionada por HTTP, existe um backdoor em socket UNIX local que entrega shell interativo sem abrir nenhuma porta TCP em escuta.
A consequência prática é severa: em um host comprometido, qualquer coisa que execute através da libphp adulterada pode enxergar uma versão diferente dos arquivos PHP daquela que realmente está em disco. Ferramentas de inspeção de arquivos passam a operar sobre uma verdade que não é a verdade do processo.
A cadeia técnica, passo a passo
O binário analisado é stripped e estaticamente ligado, o que reduz o valor da triagem convencional por análise de imports ou busca simples de strings, e contorna o caminho normal do carregador dinâmico trazendo a própria lógica de carregamento.
Strings cifradas com RC4. Boa parte das strings operacionais fica cifrada na seção .rodata e só é decifrada em tempo de execução, com uma rotina RC4 compacta e chave fixa de 16 bytes. Decifradas, revelam o escopo: /proc/self/exe, /proc/self/maps, __libc_start_main, apr_dso_load, apr_time_now, libphp, além de APIs de arquivo e memória (open, close, mmap) e primitivas de threading. Isoladamente nenhuma é notável; juntas, desenham um malware que conhece internamente o processo Linux, o runtime do Apache e o modelo de execução do PHP.
Execução antes da main. Em Linux, a maioria dos programas não chama main diretamente: o fluxo passa pela inicialização da libc, e a __libc_start_main prepara o ambiente e invoca o ponto de entrada. Esta amostra desvia disso duas vezes. No ponto de entrada bruto ela salta para uma rotina de carregamento própria, que reabre a própria imagem via /proc/self/exe, localiza o offset do executável original preservado e carrega esse ELF embutido manualmente na memória. Depois substitui a __libc_start_main por um wrapper. O fluxo passa de _start → __libc_start_main(main) → main() para _start → carregador próprio → __libc_start_main real(wrapper) → wrapper() → main() real, com a inicialização do implante dentro do wrapper.
Ativação seletiva pelo APR. Em vez de agir imediatamente, o implante espera o Apache carregar o módulo PHP. Ele engancha apr_dso_load, função do Apache Portable Runtime que carrega objetos compartilhados em tempo de execução, e inspeciona os caminhos dos módulos; só ao detectar a libphp altera comportamento. Paralelamente engancha apr_time_now — função de “hora atual”, inócua em aparência mas chamada com muita frequência em um Apache vivo — e a usa como gatilho atrasado.
Localização da libphp e patching. O implante lê /proc/self/maps para descobrir os endereços do mapeamento da libphp, muda temporariamente as proteções daquela região para RWX, aplica patches em relocações e alvos de chamada e restaura para RX. Resumidamente: ler /proc/self/maps → localizar libphp → mprotect RWX → aplicar patches → mprotect RX.
Injeção via mmap. Dentro do contexto do módulo PHP, o implante redireciona chamadas a open, close, mmap e __fxstat. Ele intercepta a abertura de três scripts específicos — apm_css.php3, full_wt.php3 e webtop_popup_css.php3 — registra o descritor e, quando o arquivo é mapeado em memória, cria uma visão modificada contendo o web shell embutido seguido do conteúdo original. A escolha dos nomes não é aleatória: são arquivos presentes em ambientes webtop do BIG-IP APM, portanto pouco propensos a levantar suspeita.
O payload PHP resultante se comporta como um web shell clássico: lê os bytes brutos da requisição via php://input, verifica um prefixo mágico curto no início do corpo, decifra o restante com uma cifra de fluxo simples, executa o conteúdo via eval e devolve HTTP 201 com Content-Type: text/css; charset=utf-8, para se confundir com requisições normais de asset. O marcador de requisição e a chave são gravados no PHP em tempo de execução, o que complica a correspondência estática de assinaturas.
Backdoor em socket UNIX. Acionado pelo gatilho da apr_time_now, um thread separado cria um socket AF_UNIX local em /run/bigtlog.pipe. Após checagem de autenticação por token, o implante redireciona entrada, saída e erro padrão para o socket e executa /bin/bash, entregando shell interativo sem qualquer porta TCP em escuta, com fork() para atender múltiplas conexões.
A Sophos registra aqui uma limitação honesta da própria análise: não foi localizado nenhum mecanismo embutido que permita ao atacante se conectar a esse socket — não há código de cliente nem outras referências ao token. A hipótese de acesso através do web shell é plausível, mas a empresa afirma não ter evidência para confirmá-la nem refutá-la. Como o socket não está exposto à internet, o atacante precisaria de outro ponto de apoio no dispositivo.
Arquitetura em estágios e o que ainda não se sabe
Durante a análise de uma amostra relacionada, um binário umount, a Sophos identificou um componente distinto de instalação e propagação. Esse primeiro estágio seria responsável por infectar /usr/sbin/httpd, persistir através de imagens de atualização do BIG-IP, modificar configurações do SELinux e implantar a carga analisada no artigo. Um detalhe reforça a ligação: o tamanho do prefixo malicioso usado pelo httpd infectado (0x5430) coincide com o tamanho do payload embutido na amostra umount.
A Sophos não atribui o malware a um ator específico. O que a empresa afirma é que a segmentação e a implementação sugerem maturidade operacional, e que o alvo observado se concentra em ambientes webtop do BIG-IP APM — não em instalações genéricas de Apache/PHP nem em CMS comuns. Essa distinção importa para não gerar alarme desnecessário em quem opera servidores web convencionais.
Sinais para caça e resposta
A Sophos é explícita ao dizer que os sinais abaixo devem ser tratados como pistas de investigação, correlacionadas com evidências de integridade de arquivos, processo, memória e do próprio BIG-IP — não como confirmação isolada.
Na camada web:
- Requisições aos endpoints
.php3citados, sobretudo se forem raras no ambiente. - Endpoints PHP devolvendo HTTP 201 enquanto declaram ser CSS (
Content-Type: text/css; charset=utf-8). - Requisições POST repetidas, com estrutura consistente ou tamanhos de corpo incomuns, para caminhos PHP que se apresentam como CSS.
Na camada de host:
- Processos worker do Apache lendo
/proc/self/maps. - Mudanças temporárias de permissão de memória nos mapeamentos do módulo PHP (RWX seguido de RX) em torno da
libphp. - Criação de socket de domínio UNIX em
/run/bigtlog.pipe. - Processos com linhagem do Apache redirecionando stdio e executando
/bin/bash.
Recomendações
A primeira medida é a mais importante e vem antes de qualquer endurecimento genérico: se você usa ou usou versões afetadas do BIG-IP APM, siga a orientação de remediação e avaliação de comprometimento da própria F5, referente à CVE-2025-53521, antes de aplicar recomendações gerais de Apache ou PHP. A Sophos alerta especificamente contra aplicar mitigações amplas em appliances BIG-IP sem seguir a orientação do fabricante — o risco de quebrar o produto é real.
Feito isso, valem as medidas de redução de superfície e visibilidade:
- Se a execução de
.php3não for necessária, considerar desabilitá-la após controle de mudança e análise de impacto — em Apache, com uma diretivaFilesMatchrestrita à extensão, negando acesso. - Restringir
ptrace(kernel.yama.ptrace_scope = 1) reduz oportunidades de inspeção e injeção entre processos. Não mitiga o comportamento de carregador e patching dentro do próprio processo, mas eleva o custo do atacante. - Alertar sobre combinações incomuns em workers do Apache: leitura de
/proc/self/maps, mudança de proteção de memória sobre alibphp, criação de sockets UNIX sob/rune execução de/bin/bash. - Em resposta a incidentes, capturar evidência volátil primeiro, assumir acesso duplo e não tratar o reinício do serviço como garantia de erradicação, dado o componente de persistência através de imagens de atualização.
- Incorporar coleta de memória de processo e comparação entre conteúdo em disco e em memória aos playbooks de resposta para servidores web críticos.
Conclusão
O PoisonedRefresh não inventa técnicas. Carregador ELF próprio, hook de __libc_start_main, patch de relocações, interceptação de mmap — cada peça é razoavelmente conhecida isoladamente. A sofisticação está na combinação e no alvo: um conjunto coerente de mecanismos que o mantém estável dentro de um processo Apache específico, em um appliance de borda que muitas organizações tratam como caixa-preta.
O achado mais relevante para o defensor é conceitual. Se o conteúdo que o Apache executa pode diferir do conteúdo que existe em disco, então a resposta a incidentes apoiada exclusivamente no sistema de arquivos pode passar ao lado da evidência principal. Isso empurra a prática na direção de correlação entre camadas — telemetria de rede, inspeção de protocolo, monitoramento de processo, análise de memória e verificação de integridade, cada uma revelando um pedaço diferente da cadeia.
O que observar a seguir: se a ESET publicar sua análise completa, se surgir atribuição a algum ator conhecido e, sobretudo, se o número de appliances BIG-IP APM expostos e sem correção começa a cair. Com 795 endpoints ainda visíveis em setembro de 2026, o estoque de alvos para o primeiro estágio segue confortável.
Fontes e referências
- Sophos X-Ops — “Dissecting a PHP web server rootkit”, por Luke Mitchell (7 de setembro de 2026): sophos.com
- BleepingComputer — “Hackers breach F5 BIG-IP APM devices to deploy Linux rootkit”, por Bill Toulas (8 de setembro de 2026): bleepingcomputer.com
- F5 — Aviso de segurança K000156741: BIG-IP APM vulnerability CVE-2025-53521: my.f5.com
- CISA — Known Exploited Vulnerabilities Catalog: cisa.gov
- NCSC (Reino Unido) — “Vulnerability affecting F5 BIG-IP APM”: ncsc.gov.uk
- ShadowServer Foundation — Estatísticas de dispositivos F5 BIG-IP APM expostos: dashboard.shadowserver.org
- ESET Research — perfil onde a família foi nomeada PoisonedRefresh: infosec.exchange