Skip content
Visualização digital com linhas de código, conexões de dados e elementos de cibersegurança

Ataque à cadeia de suprimentos da Axios: o que aconteceu e como proteger seu ambiente de trabalho

Equipe de Inteligência de Ameaças Cibernéticas da LRQA

Em 01/04/2026, este relatório foi atualizado para observar que múltiplas sobreposições de confiança média indicam que esse acordo foi provavelmente realizado pelo ator estatal norte-coreano UNC1069, motivado por interesses financeiros.

 

Em 31 de março de 2026, atacantes usaram a conta npm comprometida do mantenedor principal do Axios para publicar duas versões maliciosas do pacote no registro. As versões comprometidas continham uma nova dependência que inclui um dropper multiplataforma que recupera e implanta um trojan de acesso remoto (RAT) específico para cada plataforma em qualquer máquina que tenha instalado o pacote via npm.

O dropper contata um servidor de comando e controle embutido no código, baixa payloads específicos para macOS, Windows ou Linux e, em seguida, apaga todos os vestígios de si mesmo e do conteúdo malicioso do pacote do disco, deixando apenas o RAT implantado.

 

O que é Axios?

Axios é a biblioteca cliente HTTP mais utilizada no ecossistema JavaScript. Frameworks de front-end, serviços de back-end, ferramentas de CI/CD, aplicativos internos corporativos — se algo faz uma requisição HTTP em Node.js ou no navegador, há uma grande chance de o Axios estar envolvido. Qualquer projeto que utilize um intervalo de versões padrão, como ^1.14.0, em seu package.json, teria silenciosamente resolvido para a versão maliciosa em sua próxima instalação, sem nenhuma alteração visível no código-fonte do Axios e sem qualquer indicação, pelo nome do pacote, editor ou número da versão, de que algo estava errado.

O Axios possui mais de 100 milhões de downloads semanais e está presente na árvore de dependências de quase todos os aplicativos Node.js que fazem requisições HTTP, o que torna essa vulnerabilidade potencialmente extremamente impactante.

 

Como isso foi descoberto?

O scanner automatizado da Socket Security sinalizou a dependência maliciosa plain-crypto-js@4.2.1 em seis minutos após a publicação. A StepSecurity identificou de forma independente ambas as versões comprometidas do Axios e publicou uma análise técnica completa, confirmando, por meio de análise em tempo de execução, que o malware fez sua primeira chamada de retorno de comando e controle (C2) 1,1 segundo após o início do `npm install`.

Feross Aboukhadijeh, cofundador da Socket, publicou o alerta público:

"Ataque ativo na cadeia de suprimentos do Axios – um dos pacotes mais utilizados pelo npm. Trata-se de um exemplo clássico de malware de instalação na cadeia de suprimentos."

A equipe de segurança do npm removeu ambas as versões infectadas e as substituiu por versões de segurança confiáveis. A versão axios@1.14.1 estava ativa há aproximadamente três horas, e a axios@0.30.4, há cerca de duas horas e quinze minutos. Durante esse período, o mantenedor legítimo, Jason Saayman, teve seu acesso à conta bloqueado, e um colaborador do Axios relatou no GitHub que não conseguiu revogar o acesso do atacante porque as permissões concedidas excediam as suas.

 

Detalhes técnicos

Versões afetadas

As duas versões comprometidas são axios@1.14.1 e axios@0.30.4. Tanto a versão moderna 1.x quanto a versão legada 0.x foram afetadas com apenas 39 minutos de diferença. As versões seguras para fixar são axios@1.14.0 e axios@0.30.3. O Socket também identificou dois pacotes adicionais que distribuem a mesma carga útil por meio de dependências: @shadanai/openclaw e @qqbrowser/openclaw-qbot@0.0.130.

Como o ataque se desenrolou 

O atacante comprometeu a conta npm jasonsaayman (principal mantenedor do Axios), alterou o e-mail registrado para um endereço anônimo do ProtonMail e publicou ambas as versões maliciosas diretamente via CLI do npm, ignorando completamente o pipeline normal do GitHub Actions do projeto. Não existem commits, tags ou releases correspondentes no repositório GitHub do Axios para nenhuma das versões.

Dezoito horas antes do comprometimento do Axios, uma conta descartável (nrwise, também usando ProtonMail) publicou plain-crypto-js@4.2.0. Esta é uma cópia limpa da biblioteca crypto-js legítima, projetada exclusivamente para gerar histórico de publicações no npm e evitar flags de verificação de histórico zero.

Às 23:59 UTC do dia 30 de março, o atacante publicou plain-crypto-js@4.2.1 com um payload dropper ofuscado e um arquivo package.json limpo pré-configurado, pronto para destruição de evidências após a execução.

Vinte e dois minutos depois, o axios@1.14.1 entrou em produção com uma única nova dependência adicionada: "plain-crypto-js": "^4.2.1", um pacote nunca importado ou referenciado em nenhum lugar no código-fonte do Axios. Seu único propósito era acionar o gancho postinstall do npm.

Fluxo de exploração

O dropper (setup.js) utiliza ofuscação em duas camadas, inversão de strings e base64, seguida de descriptografia XOR para ocultar todas as strings sensíveis em repouso e decodificá-las somente em tempo de execução. Ele importa dinamicamente child_process, os e fs para evitar a detecção por meio de análise estática e, em seguida, ramifica o processo com base no sistema operacional alvo:

  1. O npm resolve plain-crypto-js@4.2.1 como uma dependência da versão comprometida do Axios e o instala automaticamente.
  2. O gancho postinstall é acionado, executando node setup.js antes que o npm install termine.
  3. O dropper identifica o sistema operacional por meio de os.platform() e contata o servidor C2 em sfrclak[.]com:8000 com um identificador de plataforma, disfarçado como uma URL de registro do npm no corpo da requisição POST
  4. Entrega de RAT específica para cada plataforma: 
    • macOS: O AppleScript baixa um binário para /Library/Caches/com.apple.act.mond (imitando o nome de um daemon da Apple), o torna executável e o inicia via /bin/zsh.
    • Windows: Copia o powershell.exe legítimo para %PROGRAMDATA%\wt.exe (disfarçado de Terminal do Windows) e, em seguida, executa uma cadeia oculta de VBScript/PowerShell para buscar e executar o RAT com -ExecutionPolicy Bypass.
    • Linux: O curl busca um RAT em Python para /tmp/ld.py e o executa de forma separada com nohup python3, garantindo que ele sobreviva após o término do processo pai.
  5. Autodestruição: O dropper exclui o arquivo setup.js, remove o package.json que contém o hook postinstall e renomeia um stub limpo pré-configurado para o seu lugar. A inspeção pós-infecção da pasta node_modules/plain-crypto-js/ não revela nada suspeito.

A análise estática e de tempo de execução completa da StepSecurity, incluindo as strings decodificadas do dropper e a árvore de processos do Harden-Runner, está disponível em https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan.

A análise da Socket pode ser encontrada em https://socket.dev/blog/axios-npm-package-compromised.

Uma característica importante do RAT é a ausência de um mecanismo de persistência. Se um dispositivo infectado for reiniciado, embora o binário ainda exista no disco, ele não será executado. Isso pode ser intencional por parte do atacante, já que a implementação de um mecanismo de persistência tornaria o RAT mais visível para sistemas de detecção e resposta a incidentes (EDR) e defesas cibernéticas. Alternativamente, o RAT pode ter sido projetado para se conectar ao servidor de comando e controle (C2) e obter uma carga útil secundária ou receber comandos que configurariam a persistência.

É possível que o atacante tenha planejado reservar a funcionalidade de persistência apenas para seus alvos específicos ou vítimas de alto valor. Alguns relatos identificaram mecanismos de persistência do Windows em dispositivos comprometidos, mas ainda não está claro se esses mecanismos são criados por meio de comandos C2 pós-infecção ou por uma alteração no processo genérico inicial de infecção.

 

Atribuição e propósito

ATUALIZAÇÃO DE 01/04/2026: Esta invasão foi provavelmente realizada pelo grupo de ameaças UNC1069, patrocinado pelo Estado da Coreia do Norte e com motivações financeiras. Esta atribuição baseia-se em múltiplos alinhamentos de confiança média com atividades anteriores do UNC1069, tais como:

Malware

  • Os URLs do C2 são fornecidos dinamicamente na linha de comando.
  • Mesma string de agente de usuário incomum usada para beaconing.
  • Mesmo local de diretório temporário usado no MacOS.

C2

  • Foram observadas conexões com o endereço C2 do Axios a partir de um nó VPN Astrill usado anteriormente pelo UNC1069.
  •  A infraestrutura adjacente no mesmo ASN que o endereço C2 do Axios tem sido historicamente associada ao UNC1069.

A funcionalidade do RAT é genérica e versátil, como esperado de um RAT em estágio inicial, com comandos pré-definidos para:

  1. Auto-remoção
  2. Download e execução de um binário
  3. Execução de scripts e comandos
  4. Enumeração de diretórios (os alvos pré-definidos foram /home/user/.ssh e /etc/passwd)

A funcionalidade RAT poderia ser útil para qualquer atacante e, ao não incluir funcionalidades maliciosas específicas (como mineração de criptomoedas ou roubo de credenciais), é menos provável que o RAT seja detectado pelo EDR. A violação dos pacotes foi rápida e as ações realizadas relativamente furtivas; no entanto, isso não restringe o agente a um Estado-nação ou a um atacante com motivação financeira, já que qualquer um deles poderia ser capaz de realizar esse ataque se tivesse acesso à conta do mantenedor.

Atores da Coreia do Norte têm realizado repetidamente ataques à cadeia de suprimentos de software visando desenvolvedores de criptomoedas. Embora o Axios não seja usado exclusivamente para projetos de software relacionados a criptomoedas, ele é extremamente utilizado e, portanto, provavelmente se sobrepõe a esse subconjunto de desenvolvedores.

A chave XOR usada inclui múltiplos setes, o que geralmente indica que o agente é chinês, mas também parece fazer referência à "Ordem 66" de Star Wars, uma franquia pouco popular na China.

Mais evidências de atribuição podem ser encontradas em breve por meio de análises forenses das ações da conta do mantenedor comprometida no npm e/ou GitHub, ou do método de comprometimento da conta do mantenedor, embora a atribuição do ataque possa não trazer muita clareza adicional.

 

Como detectar se você foi afetado 

  1. Verifique seu arquivo de bloqueio em busca de referências a axios@1.14.1, axios@0.30.4 ou plain-crypto-js. Se node_modules/plain-crypto-js/ existir em algum projeto, o dropper foi executado nessa máquina, mesmo que a rotina de limpeza tenha substituído seu conteúdo por um stub aparentemente inofensivo.
  2. Verifique se há artefatos RAT nos caminhos específicos da plataforma: /Library/Caches/com.apple.act.mond no macOS, %PROGRAMDATA%\wt.exe no Windows e /tmp/ld.py no Linux. Observe que a autolimpeza do dropper significa que esses arquivos podem já ter sido removidos.
  3. Verifique a telemetria de rede em busca de conexões de saída para sfrclak[.]com ou 142.11.206.73 na porta 8000. Este é o indicador mais confiável, já que os artefatos do sistema de arquivos se autoexcluem, mas os logs de rede persistem.
  4. Audite os pipelines de CI/CD em busca de qualquer fluxo de trabalho que tenha executado o comando `npm install` entre aproximadamente 00:21 e 03:15 UTC do dia 31 de março. Esses fluxos tiveram acesso a segredos injetados e chaves de implantação.

 

Se suspeitar que foi afetado

Faça o downgrade para a versão axios@1.14.0 ou axios@0.30.3, remova o diretório node_modules/plain-crypto-js e reinstale-o com o comando npm install --ignore-scripts. Se encontrar artefatos de RAT, considere o sistema totalmente comprometido e reconstrua-o a partir de uma imagem confiável.

Alterne todas as credenciais acessíveis na máquina comprometida: senhas salvas, tokens do npm ou outros tokens, chaves SSH, chaves de acesso à nuvem, conteúdo do arquivo .env e segredos de CI/CD.

Bloqueie sfrclak[.]com e 142.11.206.73 no seu firewall e na camada DNS.

 

Reforçando sua cadeia de suprimentos 

  1. Fixar versões exatas de dependências e confirmar seu arquivo de bloqueio. Os intervalos de acento circunflexo permitiram a resolução automática da versão maliciosa. Use o npm ci em CI/CD para impor instalações somente com arquivo de bloqueio.
  2. Desativar scripts de pós-instalação em builds automatizados com npm ci --ignore-scripts. Toda a cadeia de ataque depende do gancho de ciclo de vida de pós-instalação do npm, e a maioria dos pacotes não precisa dele.
  3. Impor uma idade mínima para o pacote, por exemplo, definindo min-release-age=7 em .npmrc. Ferramentas como o Safe Chain do Aikido também podem bloquear pacotes publicados dentro de um período de espera configurável. A versão maliciosa do pacote plain-crypto-js@4.2.1 existia há menos de 24 horas, e mesmo um limite de idade de 48 horas para novos pacotes teria impedido a exploração.
  4. Controlar o tráfego de saída dos executores de CI/CD – o dropper se comunica com o servidor em 1,1 segundos após a instalação. Se seus servidores de execução permitirem conexões de saída irrestritas, qualquer script de pós-instalação poderá alcançar qualquer servidor C2.

 

Uma história familiar 

A violação de segurança do Axios segue o mesmo padrão de todos os grandes ataques à cadeia de suprimentos do npm no último ano: credenciais de mantenedores comprometidas, uma pequena alteração no manifesto de dependências e um gancho de pós-instalação executando um payload autodestrutivo. Em setembro de 2025, credenciais obtidas por phishing levaram à violação do Chalk e do Debug (mais de 2 bilhões de downloads semanais combinados). No mesmo mês, o worm Shai-Hulud se tornou o primeiro malware do npm a se propagar como um worm na história. Em dezembro, sua segunda versão já havia coletado cerca de 400.000 segredos de desenvolvedores.

Recentemente, o npm anunciou melhorias de segurança planejadas, como a autenticação de dois fatores FIDO obrigatória, a desativação de tokens de automação por padrão e a imposição de publicação confiável. No momento, porém, essas melhorias ainda estão em desenvolvimento. Até que sejam implementadas, ferramentas de terceiros e a conscientização dos desenvolvedores devem detectar o que o npm não detecta.

 

Precisa de ajuda?

Se suspeita que a sua organização foi afetada por este incidente e precisa de assistência urgente, ou se pretende avaliar a vulnerabilidade da sua cadeia de abastecimento antes do próximo ataque, a LRQA pode ajudar.

Entre em contato 

 

 

 

Indicadores de Compromisso (IOCs)

Network

 

C2 domain - hxxp

//sfrclak[.]com:8000

C2 IP

 142.11.206.73:8000

C2 URL

 hxxp:////sfrclak[.]com:8000/6202033

User-Agent string

 mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)

Mac C2 payload retrieval POST body

 packages.npm.org/product0

Windows C2 payload retrieval POST body

 packages.npm.org/product1

Linux C2 payload retrieval POST body

 packages.npm.org/product2

   

Mac Host

 

MacOS temporary file (deleted after use)

 /tmp/6202033

MacOS RAT binary file

 /Library/Caches/com.apple.act.mond

Injected binaries from RAT activity

 /private/tmp/.[XXXXXX]

Mac RAT SHA256

 92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a

Mac RAT SHA1

 13ab317c5dcab9af2d1bdb22118b9f09f8a4038e

Mac RAT MD5

 7a9ddef00f69477b96252ca234fcbeeb

   

Windows Host

 

Copies powershell.exe to

 %PROGRAMDATA%\wt.exe

VBS wrapper, deleted after use

 %TEMP%\6202033.vbs

Powershell payload, deleted after use

 %TEMP%\6202033.ps1

   

Linux Host

 

Linux temporary file

 /tmp/ld.py

   

NPM Packages

 

axios@1.14.1 shasum

 2553649f232204966871cea80a5d0d6adc700ca

axios@0.30.4 shasum

 d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71

plain-crypto-js@4.2.1 shasum

 07d889e2dadce6f3910dcbc253317d28ca61c766

Atividade pós-acordo

Após a execução do payload, o dropper remove qualquer indício do código malicioso do diretório do pacote, excluindo os arquivos setup.js e package.json e substituindo o package.json por um arquivo legítimo/limpo.

   

Notable strings

 

XOR key - OrDeR_7077

 

XOR constant - 333

 

Campaign id

6202033

Plain-crypto-js@4.2.0 publisher

 nrwise@proton.me

O endereço de e-mail controlado pelo atacante foi usado no sequestro da conta de manutenção do Axios.

 ifstap@proton.me

Endereço de e-mail controlado pelo atacante foi usado para publicar o arquivo plain-crypto-js.

 nrwise@proton.me

   

Npm comandos de auditoria

 

Verificar a existência do arquivo plain-crypto-js

npm ls plain-crypto-js

Verificar a existência do plain-crypto-js

cat package-lock.json | grep -A3 "plain-crypto-js"

Verificar a existência de versões maliciosas do Axios.

grep -E '"axios".*"(1\.14\.1|0\.30\.4)"' package-lock.json

 

Últimas notícias, informações e eventos futuros