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:
- Deteta o sistema operativo
- Descarrega o payload de segunda fase a partir de
sfrclak.com:8000(IP:142.11.206.73) - Recolhe imediatamente credenciais do sistema (chaves cloud, passwords de bases de dados, tokens API)
- Apaga-se a si próprio e restaura o
package.jsonlegí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.ps1descarregado 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.pypersistido em/tmp/ld.py - Modifica
.bashrce.zshrcpara persistência
Indicadores de Comprometimento (IOC)
Pacotes Comprometidos
| Pacote | Versão | SHA1 |
|---|---|---|
axios | 1.14.1 | 2553649f232204966871cea80a5d0d6adc700ca |
axios | 0.30.4 | d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71 |
plain-crypto-js | 4.2.1 | 07d889e2dadce6f3910dcbc253317d28ca61c766 |
Infraestrutura C2
| Tipo | Valor |
|---|---|
| Domínio C2 primário | sfrclak.com |
| Domínio C2 secundário | callnrwise.com |
| Callback macOS | packages.npm.org/product0 |
| Callback Windows | packages.npm.org/product1 |
| Callback Linux | packages.npm.org/product2 |
| IP | 142.11.206.73 |
| Porta | 8000 |
| Path | /6202033 |
Hashes de Ficheiros Maliciosos (SHA256)
| Ficheiro | SHA256 |
|---|---|
setup.js (dropper) | e10b1fa84f1d6481625f741b69892780140d4e0e7769e7491e5f4d894c2e0e09 |
com.apple.act.mond (macOS) | 92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a |
stage2.ps1 (Windows) | 617b67a8e1210e4fc87c92d1d1da45a2f311c08d26e89b12307cf583c900d101 |
ld.py (Linux) | fcb81618bb15edfdedfb638b4c08a2af9cac9ecfa551af135a8402bf980375cf |
system.bat (Windows) | f7d335205b8d7b20208fb3ef93ee6dc817905dc3ae0c10a0b164f4e7d07121cd |
6202033.ps1 | ed8560c1ac7ceb6983ba995124d5917dc1a00288912387a6389296637d5f815c |
Artefactos no Sistema de Ficheiros
| SO | Caminho |
|---|---|
| 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 |
| Todos | node_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écnica | ID | Descrição |
|---|---|---|
| Supply Chain Compromise: Compromise Software Dependencies | T1195.002 | Injeção de dependência maliciosa no axios |
| Boot or Logon Autostart: Registry Run Keys | T1547.001 | Persistência via MicrosoftUpdate Run key |
| Unix Shell Configuration Modification | T1546.004 | Modificação de .bashrc/.zshrc |
| Command and Scripting: PowerShell | T1059.001 | Execução de stage2.ps1 |
| Command and Scripting: Python | T1059.006 | RAT Linux via ld.py |
| Command and Scripting: JavaScript | T1059.007 | Dropper setup.js |
| Application Layer Protocol: Web | T1071.001 | Comunicação C2 via HTTP porta 8000 |
| Create or Modify System Process | T1543 | RAT macOS como pseudo-serviço do sistema |
| Encrypted Channel | T1573 | Beaconing periódico ao C2 |
Ações Imediatas Recomendadas
- Auditar dependências: verificar todos os ficheiros
package-lock.jsoneyarn.lockpara as versões afetadas (axios@1.14.1,axios@0.30.4,plain-crypto-js@4.2.1) - Procurar artefactos: executar pesquisa forense nos endpoints por todos os ficheiros listados na tabela de IOC
- Bloquear na firewall/proxy: adicionar
sfrclak.com,callnrwise.come142.11.206.73a blocklists - 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
- Inspecionar pipelines CI/CD: verificar sistemas de build e runners — são alvos primários deste tipo de ataque
- Implementar regras Wazuh: aplicar as regras, listas CDB e active response apresentados neste artigo
- Atualizar axios: migrar para uma versão segura e verificada (consultar o advisory GHSA-fw8c-xr5c-95f9)
Referências
- Wiz Research — Axios npm compromised in supply chain attack
- SANS ISC — Axios npm Supply Chain Compromise
- GitHub Advisory — GHSA-fw8c-xr5c-95f9
- MITRE ATT&CK — T1195.002: Supply Chain Compromise
