Ataque à Cadeia de Fornecimento do Axios NPM: Análise Técnica e Deteção com Wazuh

Resumo Executivo

A 31 de março de 2026, o pacote npm axios — utilizado por mais de 100 milhões de downloads semanais e presente em cerca de 80% dos ambientes cloud e de desenvolvimento — foi comprometido num ataque à cadeia de fornecimento. As versões maliciosas 1.14.1 e 0.30.4 distribuíram um Remote Access Trojan (RAT) multiplataforma (Windows, macOS e Linux) através de uma dependência trojanizada chamada plain-crypto-js.

O ataque é atribuído ao grupo TeamPCP, um provável Initial Access Broker que nas semanas anteriores (19-27 de março) já tinha comprometido pacotes como Trivy, KICS, LiteLLM e Telnyx. A janela de exposição foi de aproximadamente 3 horas (00:21–03:15 UTC), mas a escala do axios significa que milhares de ambientes foram potencialmente afetados.


Anatomia do Ataque

Fase 1: Comprometimento de Credenciais

Os atacantes comprometeram a conta npm do maintainer jasonsaayman (email alterado para ifstap@proton.me). Com acesso à conta, publicaram duas versões maliciosas do axios que introduziam uma dependência oculta: plain-crypto-js@4.2.1, publicada pela conta nrwise (nrwise@proton.me).

Fase 2: Dropper (setup.js)

Ao instalar o pacote comprometido, o script setup.js executa automaticamente e:

  1. Deteta o sistema operativo
  2. Descarrega o payload de segunda fase a partir de sfrclak.com:8000 (IP: 142.11.206.73)
  3. Recolhe imediatamente credenciais do sistema (chaves cloud, passwords de bases de dados, tokens API)
  4. Apaga-se a si próprio e restaura o package.json legítimo para evitar deteção

Fase 3: RAT Multiplataforma

Os payloads de segunda fase são específicos por plataforma e comunicam com o C2 (Command & Control) a cada 60 segundos, enviando inventário do sistema e aguardando comandos:

Windows

  • Script PowerShell stage2.ps1 descarregado para %TEMP%\6202033.ps1
  • Persistência via chave de registo: HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate%PROGRAMDATA%\system.bat
  • Artefactos: %TEMP%\6202033.vbs, %PROGRAMDATA%\wt.exe, %PROGRAMDATA%\system.bat

macOS

  • Binário Mach-O universal: com.apple.act.mond
  • Persistência em: /Library/Caches/com.apple.act.mond
  • Capacidades: execução remota de shell, injeção de binários, browsing de diretórios, listagem de processos, reconhecimento do sistema
  • Auto-assina payloads injetados via codesign

Linux

  • Script Python: ld.py persistido em /tmp/ld.py
  • Modifica .bashrc e .zshrc para persistência

Indicadores de Comprometimento (IOC)

Pacotes Comprometidos

PacoteVersãoSHA1
axios1.14.12553649f232204966871cea80a5d0d6adc700ca
axios0.30.4d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71
plain-crypto-js4.2.107d889e2dadce6f3910dcbc253317d28ca61c766

Infraestrutura C2

TipoValor
Domínio C2 primáriosfrclak.com
Domínio C2 secundáriocallnrwise.com
Callback macOSpackages.npm.org/product0
Callback Windowspackages.npm.org/product1
Callback Linuxpackages.npm.org/product2
IP142.11.206.73
Porta8000
Path/6202033

Hashes de Ficheiros Maliciosos (SHA256)

FicheiroSHA256
setup.js (dropper)e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09
com.apple.act.mond (macOS)92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a
stage2.ps1 (Windows)617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101
ld.py (Linux)fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf
system.bat (Windows)f7d335205b8d7b20208fb3ef93ee6dc817905dc3ae0c10a0b164f4e7d07121cd
6202033.ps1ed8560c1ac7ceb6983ba995124d5917dc1a00288912387a6389296637d5f815c

Artefactos no Sistema de Ficheiros

SOCaminho
Windows%PROGRAMDATA%\system.bat
Windows%PROGRAMDATA%\wt.exe
Windows%TEMP%\6202033.vbs
Windows%TEMP%\6202033.ps1
macOS/Library/Caches/com.apple.act.mond
macOS/tmp/.XXXXXX.scpt
Linux/tmp/ld.py
Todosnode_modules/plain-crypto-js/

Referências de tracking: GHSA-fw8c-xr5c-95f9 | MAL-2026-2306


Deteção e Mitigação com Wazuh

Apresentamos um conjunto completo de regras, listas CDB, configurações de FIM e active response para detetar e responder a este ataque no Wazuh.

1. Listas CDB de IOC

Criar as seguintes listas CDB em /var/ossec/etc/lists/:

Lista de IPs maliciosos — axios-ioc-ip

# /var/ossec/etc/lists/axios-ioc-ip
142.11.206.73:axios-supply-chain-c2

Lista de domínios C2 — axios-ioc-domains

# /var/ossec/etc/lists/axios-ioc-domains
sfrclak.com:axios-c2-primary
callnrwise.com:axios-c2-secondary
packages.npm.org:axios-c2-callback-disguised

Lista de hashes SHA256 — axios-ioc-hashes

# /var/ossec/etc/lists/axios-ioc-hashes
e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09:setup.js-dropper
92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a:macos-rat-binary
617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101:windows-stage2-ps1
fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf:linux-rat-ld-py
f7d335205b8d7b20208fb3ef93ee6dc817905dc3ae0c10a0b164f4e7d07121cd:windows-system-bat
ed8560c1ac7ceb6983ba995124d5917dc1a00288912387a6389296637d5f815c:windows-6202033-ps1
e49c2732fb9861548208a78e72996b9c3c470b6b562576924bcc3a9fb75bf9ff:windows-system-bat-v2

Registar as listas em /var/ossec/etc/ossec.conf:

<ruleset>
  <list>etc/lists/axios-ioc-ip</list>
  <list>etc/lists/axios-ioc-domains</list>
  <list>etc/lists/axios-ioc-hashes</list>
</ruleset>

2. Monitorização de Integridade de Ficheiros (FIM)

Adicionar à secção <syscheck> do ossec.conf dos agentes:

Agentes Windows

<syscheck>
  <!-- Artefactos RAT axios -->
  <directories check_all="yes" realtime="yes" report_changes="yes">
    %PROGRAMDATA%
  </directories>
  <directories check_all="yes" realtime="yes">
    %TEMP%
  </directories>

  <!-- Chave de registo de persistência -->
  <windows_registry arch="both">
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
  </windows_registry>

  <!-- Detetar plain-crypto-js em projetos node -->
  <directories check_all="yes" realtime="yes" recursion_level="6">
    C:\Users
  </directories>
</syscheck>

Agentes Linux/macOS

<syscheck>
  <!-- Artefactos RAT axios -->
  <directories check_all="yes" realtime="yes" report_changes="yes">/tmp</directories>
  <directories check_all="yes" realtime="yes">/Library/Caches</directories>

  <!-- Detetar modificações a shell profiles (persistência) -->
  <directories check_all="yes" realtime="yes" report_changes="yes">
    /home,/root
  </directories>
  <nodiff>/home/*/.bash_history</nodiff>
  <nodiff>/root/.bash_history</nodiff>
</syscheck>

3. Regras de Deteção Personalizadas

Adicionar ao ficheiro /var/ossec/etc/rules/axios_supply_chain.xml:

<group name="axios_supply_chain,supply_chain_attack,">

  <!-- ============================================ -->
  <!-- FIM: Artefactos RAT no filesystem            -->
  <!-- ============================================ -->

  <!-- Windows: system.bat ou wt.exe em ProgramData -->
  <rule id="100200" level="14">
    <if_sid>550,554</if_sid>
    <field name="file">system\.bat$|\\wt\.exe$</field>
    <match>ProgramData</match>
    <description>[Axios Supply Chain] Artefacto RAT detetado em ProgramData: $(file)</description>
    <mitre>
      <id>T1195.002</id>
      <id>T1059.001</id>
    </mitre>
    <group>axios_supply_chain,artifact_detected,</group>
  </rule>

  <!-- Windows: ficheiros 6202033 em TEMP -->
  <rule id="100201" level="14">
    <if_sid>550,554</if_sid>
    <field name="file">6202033\.(vbs|ps1)$</field>
    <description>[Axios Supply Chain] Dropper stage2 detetado: $(file)</description>
    <mitre>
      <id>T1195.002</id>
      <id>T1059.001</id>
    </mitre>
    <group>axios_supply_chain,dropper_detected,</group>
  </rule>

  <!-- macOS: RAT binary -->
  <rule id="100202" level="14">
    <if_sid>550,554</if_sid>
    <field name="file">com\.apple\.act\.mond</field>
    <description>[Axios Supply Chain] RAT macOS detetado: $(file)</description>
    <mitre>
      <id>T1195.002</id>
      <id>T1543</id>
    </mitre>
    <group>axios_supply_chain,rat_detected,</group>
  </rule>

  <!-- Linux: ld.py em /tmp -->
  <rule id="100203" level="14">
    <if_sid>550,554</if_sid>
    <field name="file">/tmp/ld\.py$</field>
    <description>[Axios Supply Chain] RAT Linux detetado: /tmp/ld.py</description>
    <mitre>
      <id>T1195.002</id>
      <id>T1059.006</id>
    </mitre>
    <group>axios_supply_chain,rat_detected,</group>
  </rule>

  <!-- Todos: plain-crypto-js em node_modules -->
  <rule id="100204" level="12">
    <if_sid>550,554</if_sid>
    <field name="file">plain-crypto-js</field>
    <description>[Axios Supply Chain] Dependência trojanizada plain-crypto-js detetada: $(file)</description>
    <mitre>
      <id>T1195.002</id>
    </mitre>
    <group>axios_supply_chain,malicious_package,</group>
  </rule>

  <!-- ============================================ -->
  <!-- Persistência: Registo Windows                -->
  <!-- ============================================ -->

  <rule id="100205" level="14">
    <if_sid>61613,61614</if_sid>
    <field name="win.eventdata.targetObject">CurrentVersion\\\\Run\\\\MicrosoftUpdate</field>
    <description>[Axios Supply Chain] Persistência via registo: MicrosoftUpdate Run key</description>
    <mitre>
      <id>T1547.001</id>
      <id>T1195.002</id>
    </mitre>
    <group>axios_supply_chain,persistence,</group>
  </rule>

  <!-- ============================================ -->
  <!-- Persistência: Shell profiles (Linux/macOS)   -->
  <!-- ============================================ -->

  <rule id="100206" level="10">
    <if_sid>550</if_sid>
    <field name="file">\.(bashrc|zshrc)$</field>
    <field name="changed_content">sfrclak|callnrwise|ld\.py|6202033</field>
    <description>[Axios Supply Chain] Shell profile modificado com referência a IOC</description>
    <mitre>
      <id>T1546.004</id>
      <id>T1195.002</id>
    </mitre>
    <group>axios_supply_chain,persistence,</group>
  </rule>

  <!-- ============================================ -->
  <!-- Rede: Comunicação C2                         -->
  <!-- ============================================ -->

  <!-- DNS lookup para domínios C2 -->
  <rule id="100210" level="14">
    <if_sid>86601</if_sid>
    <field name="query">sfrclak\.com|callnrwise\.com</field>
    <description>[Axios Supply Chain] Resolução DNS para domínio C2: $(query)</description>
    <mitre>
      <id>T1071.001</id>
      <id>T1195.002</id>
    </mitre>
    <group>axios_supply_chain,c2_communication,</group>
  </rule>

  <!-- Conexão à porta 8000 do IP C2 (via Sysmon/network logs) -->
  <rule id="100211" level="14">
    <if_sid>61600,61601,61603</if_sid>
    <field name="win.eventdata.destinationIp">142.11.206.73</field>
    <description>[Axios Supply Chain] Conexão de rede ao IP C2 142.11.206.73</description>
    <mitre>
      <id>T1071.001</id>
      <id>T1195.002</id>
    </mitre>
    <group>axios_supply_chain,c2_communication,</group>
  </rule>

  <!-- Firewall/proxy: tráfego para C2 via CDB lookup -->
  <rule id="100212" level="14">
    <if_sid>1002</if_sid>
    <list field="srcip" lookup="address_match_key">etc/lists/axios-ioc-ip</list>
    <description>[Axios Supply Chain] Tráfego de/para IP C2 detetado via lista CDB</description>
    <mitre>
      <id>T1071.001</id>
    </mitre>
    <group>axios_supply_chain,c2_communication,</group>
  </rule>

  <rule id="100213" level="14">
    <if_sid>1002</if_sid>
    <list field="dstip" lookup="address_match_key">etc/lists/axios-ioc-ip</list>
    <description>[Axios Supply Chain] Tráfego de/para IP C2 detetado via lista CDB</description>
    <mitre>
      <id>T1071.001</id>
    </mitre>
    <group>axios_supply_chain,c2_communication,</group>
  </rule>

  <!-- ============================================ -->
  <!-- Processos: Execução suspeita                 -->
  <!-- ============================================ -->

  <!-- PowerShell a executar script com path 6202033 -->
  <rule id="100220" level="14">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.commandLine">6202033|system\.bat|wt\.exe</field>
    <description>[Axios Supply Chain] Execução de processo malicioso: $(win.eventdata.commandLine)</description>
    <mitre>
      <id>T1059.001</id>
      <id>T1195.002</id>
    </mitre>
    <group>axios_supply_chain,execution,</group>
  </rule>

  <!-- Node.js a executar setup.js de plain-crypto-js -->
  <rule id="100221" level="12">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.commandLine">plain-crypto-js.*setup\.js</field>
    <description>[Axios Supply Chain] Node.js a executar dropper plain-crypto-js</description>
    <mitre>
      <id>T1195.002</id>
      <id>T1059.007</id>
    </mitre>
    <group>axios_supply_chain,dropper_execution,</group>
  </rule>

  <!-- Linux: python a executar ld.py -->
  <rule id="100222" level="14">
    <if_group>syslog</if_group>
    <match>python.*ld\.py|/tmp/ld\.py</match>
    <description>[Axios Supply Chain] Execução de RAT Linux: ld.py</description>
    <mitre>
      <id>T1059.006</id>
      <id>T1195.002</id>
    </mitre>
    <group>axios_supply_chain,rat_execution,</group>
  </rule>

  <!-- macOS: com.apple.act.mond -->
  <rule id="100223" level="14">
    <if_group>syslog</if_group>
    <match>com.apple.act.mond</match>
    <description>[Axios Supply Chain] Execução de RAT macOS: com.apple.act.mond</description>
    <mitre>
      <id>T1195.002</id>
      <id>T1543</id>
    </mitre>
    <group>axios_supply_chain,rat_execution,</group>
  </rule>

  <!-- ============================================ -->
  <!-- Hash match via FIM/Syscheck                  -->
  <!-- ============================================ -->

  <rule id="100230" level="15">
    <if_sid>550,554</if_sid>
    <list field="sha256" lookup="match_key">etc/lists/axios-ioc-hashes</list>
    <description>[Axios Supply Chain] Ficheiro com hash malicioso confirmado: $(file)</description>
    <mitre>
      <id>T1195.002</id>
    </mitre>
    <group>axios_supply_chain,confirmed_malware,</group>
  </rule>

  <!-- ============================================ -->
  <!-- Beaconing: Conexões periódicas (60s)         -->
  <!-- ============================================ -->

  <rule id="100240" level="12" frequency="5" timeframe="600">
    <if_matched_sid>100211</if_matched_sid>
    <description>[Axios Supply Chain] Beaconing C2 detetado — múltiplas conexões ao IP 142.11.206.73</description>
    <mitre>
      <id>T1071.001</id>
      <id>T1573</id>
    </mitre>
    <group>axios_supply_chain,beaconing,</group>
  </rule>

</group>

4. Active Response

Bloquear automaticamente o IP C2 quando detetado. Adicionar ao ossec.conf do manager:

<active-response>
  <command>firewall-drop</command>
  <location>all</location>
  <rules_id>100211,100212,100213,100240</rules_id>
  <timeout>86400</timeout>
</active-response>

<!-- Isolar máquina se RAT confirmado -->
<active-response>
  <command>firewall-drop</command>
  <location>local</location>
  <rules_id>100230</rules_id>
  <timeout>0</timeout>
</active-response>

Mapeamento MITRE ATT&CK

TécnicaIDDescrição
Supply Chain Compromise: Compromise Software DependenciesT1195.002Injeção de dependência maliciosa no axios
Boot or Logon Autostart: Registry Run KeysT1547.001Persistência via MicrosoftUpdate Run key
Unix Shell Configuration ModificationT1546.004Modificação de .bashrc/.zshrc
Command and Scripting: PowerShellT1059.001Execução de stage2.ps1
Command and Scripting: PythonT1059.006RAT Linux via ld.py
Command and Scripting: JavaScriptT1059.007Dropper setup.js
Application Layer Protocol: WebT1071.001Comunicação C2 via HTTP porta 8000
Create or Modify System ProcessT1543RAT macOS como pseudo-serviço do sistema
Encrypted ChannelT1573Beaconing periódico ao C2

Ações Imediatas Recomendadas

  1. Auditar dependências: verificar todos os ficheiros package-lock.json e yarn.lock para as versões afetadas (axios@1.14.1, axios@0.30.4, plain-crypto-js@4.2.1)
  2. Procurar artefactos: executar pesquisa forense nos endpoints por todos os ficheiros listados na tabela de IOC
  3. Bloquear na firewall/proxy: adicionar sfrclak.com, callnrwise.com e 142.11.206.73 a blocklists
  4. Rodar credenciais: se confirmada a execução, assumir que TODAS as credenciais foram exfiltradas — rodar tokens npm, chaves cloud (AWS/Azure/GCP), chaves SSH, passwords de bases de dados e tokens API
  5. Inspecionar pipelines CI/CD: verificar sistemas de build e runners — são alvos primários deste tipo de ataque
  6. Implementar regras Wazuh: aplicar as regras, listas CDB e active response apresentados neste artigo
  7. Atualizar axios: migrar para uma versão segura e verificada (consultar o advisory GHSA-fw8c-xr5c-95f9)

Referências