L’Attacco alla Supply Chain di Axios e il RAT Multipiattaforma di Sapphire Sleet
好的,我需要帮用户总结这篇文章的内容,控制在100个字以内,而且不需要特定的开头。首先,我要快速浏览文章,抓住主要信息。 文章讲的是2026年3月31日,JavaScript生态系统遭受了一次严重的供应链攻击。攻击目标是Axios这个常用的HTTP客户端库,下载量每周高达1亿次。攻击者成功在npm上发布了两个恶意版本,植入了远程访问木马(RAT),影响了开发机器和CI/CD管道。 接下来,文章详细描述了攻击链的各个阶段。攻击者首先入侵了Axios维护者的npm账户,并通过修改package.json引入恶意依赖plain-crypto-js。利用npm的生命周期钩子,在安装或更新时触发恶意代码。 恶意软件采用了多层混淆技术,包括字符串反转、Base64解码和XOR加密,以隐藏C2服务器信息和文件路径。它还通过伪造请求头和删除自身脚本来逃避检测。 Stage 2阶段释放了针对不同操作系统的RATpayload,包括PowerShell、C++和Python版本。这些payload共享相同的C2协议和命令集,并使用过时的User-Agent来混淆视听。 文章还提到应对措施,如降级到安全版本、旋转密钥、锁定依赖版本以及禁用npm脚本执行。此外,还提供了网络和文件系统的IOC指标供威胁狩猎使用。 总结起来,这次攻击展示了供应链安全的重要性,并强调了采用零信任策略和加强安全措施的必要性。 </think> 2026年3月31日,JavaScript生态系统遭遇严重供应链攻击,Axios库被植入远程访问木马(RAT),影响开发环境和CI/CD管道。攻击者通过伪造npm账户发布恶意版本,并利用混淆技术和生命周期钩子触发攻击。Stage 2释放多平台RATpayload,采用过时User-Agent逃避检测。应对措施包括降级依赖、旋转密钥及禁用脚本执行。 2026-4-3 14:45:59 Author: blog.lobsec.com(查看原文) 阅读量:6 收藏

Il 31 marzo 2026, l’ecosistema JavaScript ha subito uno degli attacchi alla supply chain più critici della storia recente. axios, una delle librerie HTTP client più utilizzate al mondo con circa 100 milioni di download settimanali, è stata compromessa. Un threat actor è riuscito a pubblicare due versioni malevole del pacchetto su npm, distribuendo un Remote Access Trojan (RAT) multipiattaforma progettato per colpire silenziosamente macchine di sviluppo e pipeline CI/CD.

L’attacco, attribuito dalla threat intelligence al gruppo state-sponsored nordcoreano Sapphire Sleet (legato al cluster UNC1069), evidenzia un’incredibile sofisticazione nei meccanismi di offuscamento, anti-forensics ed execution.

Ecco l’analisi tecnica approfondita dell’intera kill chain, dai vettori di compromissione iniziale fino alle meccaniche di esecuzione dei payload di Stage-2.

Vettore di Infezione e Compromissione dell’Account

L’attacco è iniziato con la compromissione dell’account npm di uno dei primary maintainer del progetto (jasonsaayman). L’evidenza della compromissione è visibile dai metadati del registry npm:

  • Nelle release legittime (es. 1.14.0), la pubblicazione avveniva tramite GitHub Actions OIDC con attestazioni SLSA provenance.
  • Nelle versioni compromesse (1.14.1 taggata come latest e 0.30.4 taggata come legacy), il metodo di pubblicazione è degradato a un Direct CLI publish, e l’email dell’autore è stata modificata in ifstap@proton[.]me.

L’attaccante ha colpito in maniera chirurgica, introducendo una singola nuova dipendenza malevola nel package.json di Axios: plain-crypto-js@^4.2.1. Il codice sorgente di Axios è rimasto intatto, permettendo al pacchetto di mantenere il suo comportamento legittimo per non destare sospetti a runtime.

Stage 1: Il Dropper “plain-crypto-js” e il postinstall Hook

Il cuore del delivery iniziale si basa sull’abuso dei lifecycle hook di npm. La dipendenza fake plain-crypto-js contiene il seguente blocco nel proprio manifest:

"scripts": {
  "postinstall": "node setup.js"
}

Questo innesca l’esecuzione silente senza alcuna interazione dell’utente durante un banale npm install axios o in un aggiornamento automatico generato da bot come Dependabot.

Offuscamento a Doppio Strato

Il file setup.js non espone stringhe in chiaro. Al contrario, adotta uno schema di decodifica a runtime a due layer per mascherare URL del C2, identificatori di piattaforma e percorsi filesystem:

  1. Layer 1: Inversione della stringa seguita da decodifica Base64.
  2. Layer 2: Un cifrario XOR utilizzando la chiave hardcodata OrDeR_7077, con un indice dipendente dalla posizione basato sulla formula (7 * i² % 10).

Delivery Selettivo e Mascheramento di Rete

Una volta de-offuscato, il dropper identifica l’architettura tramite os.platform() e avvia la fase di fetching effettuando richieste HTTP POST verso l’infrastruttura C2 hxxp://sfrclak[.]com:8000/6202033 (risolto sull’IP 142.11.206.73, ospitato su una VPS Hostwinds).

Per eludere l’analisi del traffico egress, il dropper falsifica i body della POST facendoli apparire come telemetria o richieste legittime al registry npm:

  • macOS: packages.npm.org/product0
  • Windows: packages.npm.org/product1
  • Linux: packages.npm.org/product2

Tecniche Anti-Forensics Avanzate

Immediatamente dopo l’esecuzione, il dropper cancella le sue tracce:

  1. Self-deletion: Esegue fs.unlink(__filename) per eliminare setup.js.
  2. Manifest Swapping: Rinomina uno stub benigno (package.md preparato appositamente) in package.json, sovrascrivendo la dichiarazione del postinstall. Un analista o un tool EDR che ispeziona node_modules/plain-crypto-js/ post-infezione non troverà alcuna traccia dell’hook malevolo.

Stage 2: Il RAT Multipiattaforma

Nonostante l’OS target generi payload in tre linguaggi differenti (PowerShell, C++ nativo, Python), le indagini di Elastic Security e Microsoft evidenziano che si tratta di tre implementazioni dello stesso framework RAT. Condividono infatti il medesimo protocollo C2 (JSON Base64 su HTTP POST), la stessa cadenza di beaconing (60 secondi), e un set identico di comandi (kill, runscript, peinject, rundir).

Un indicatore di compromissione (IoC) estremamente caratteristico è lo spoofing anacronistico dello User-Agent hardcodato per tutte le varianti: mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0) (Internet Explorer 8 su Windows XP). La presenza di questo User-Agent proveniente da sistemi macOS o Linux moderni rappresenta un alert di rilevamento critico.

Variante macOS (C++ Mach-O)

Delivery: Il post-install utilizza un AppleScript (scritto in /tmp ed eseguito silente tramite nohup osascript) per scaricare l’eseguibile.

Payload: Il file Mach-O viene salvato in /Library/Caches/com.apple.act.mond, vengono concessi permessi chmod 770 e viene lanciato in background tramite /bin/zsh.

Attribuzione: Reverse engineering del binario ha rivelato significative sovrapposizioni a livello di codice con WAVESHAPER, un noto backdoor C++ del cluster nordcoreano UNC1069.

Variante Windows (PowerShell e VBScript)

Delivery: Viene droppato un file .vbs temporaneo che avvia una shell cmd.exe nascosta. Tramite curl, scarica la risposta del C2 in uno script PowerShell transitorio (%TEMP%\6202033.ps1).

Mascheramento: Il payload individua l’interprete PowerShell nel sistema e lo copia in %PROGRAMDATA%\wt.exe per confondersi con Windows Terminal, eseguendo il bypass delle policy di esecuzione (-ep bypass -w hidden).

Persistenza e Capabilities: È l’unica variante a mantenere persistenza tramite Registry Run key (HKCU:\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate). Il comando peinject del RAT su Windows utilizza il loading riflessivo .NET tramite [System.Reflection.Assembly]::Load() per eseguire assembly in memoria senza toccare il disco, pur non implementando hook per disabilitare AMSI.

Variante Linux (Python)

Delivery: Una one-liner in shell usa curl per scaricare lo stage in /tmp/ld.py.

Esecuzione: Viene lanciato come processo detached tramite nohup python3 /tmp/ld.py ... & > /dev/null 2>&1. Anche in caso di peinject, la variante Linux scrive binari temporanei nascosti in directory /tmp/ ed esegue chiamate a subprocess.Popen().

Ricognizione Iniziale (Reconnaissance)

All’avvio, ogni RAT genera un UID di 16 caratteri alfanumerici e invia un primo heartbeat (tipo FirstInfo) profilando intensamente il sistema. I dati raccolti includono:

  • Variabili d’ambiente, Hostname e Username (tramite WMI, getuid/getpwuid, ecc.).
  • System uptime e tempo di boot.
  • Enumerazione completa dei processi.
  • Snapshot dei contenuti di directory critiche (Documenti, Desktop, Profile).

Mitigazione, Detection e Incident Response

Un attacco con una superficie esposta potenziale di milioni di host impone una risposta drastica, specialmente in ambienti Enterprise e CI/CD.

Immediate Action Items

  1. Downgrade ed Eradicazione: Le uniche versioni sicure adiacenti all’incidente sono 1.14.0 (o patch inferiori) e 0.30.3. Rimuovere fisicamente node_modules e reinstallare usando versioni verificate.
  2. Rotazione dei Secret: Essendo l’esecuzione avvenuta nel contesto dello sviluppatore o del runner CI/CD, qualsiasi secret, token AWS/GCP, chiave SSH o variabile d’ambiente esposta deve considerarsi compromessa e va immediatamente revocata.
  3. Pinning delle Dipendenze: Forzare il pinning assoluto (rimuovendo i caratteri ^ o ~ nel package.json) ed utilizzare l’istruzione overrides per bloccare eventuali aggiornamenti transitivi:
"overrides": {
  "axios": "1.14.0"
}

Prevenzione Proattiva sui Lifecycle Hooks

Questa tipologia di attacco può essere neutralizzata preventivamente alla radice bloccando l’esecuzione automatica degli script:

  • A livello di comando: npm ci --ignore-scripts
  • A livello di global config: npm config set ignore-scripts true

Threat Hunting e IOC (Indicators of Compromise)

Network:

  • Traffico in uscita (specialmente HTTP POST) verso sfrclak[.]com o 142.11.206.73 sulla porta 8000.
  • Traffico di rete inusuale caratterizzato dallo User-Agent hardcodato: mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0).

File & System:

  • Presenza di plain-crypto-js nelle path node_modules/.
  • Windows: File sospetti in %PROGRAMDATA%\wt.exe, chiavi in HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate.
  • macOS: Processi zsh o osascript anomali, esecuzione di /Library/Caches/com.apple.act.mond.
  • Linux: Presenza ed esecuzione in background di /tmp/ld.py.

L’incidente di Axios si qualifica come l’ennesimo duro promemoria: il trust implicito nei package registry è un debito di sicurezza insostenibile. L’adozione di un approccio zero-trust, della verifica della provenance SLSA e di hardening delle pipeline (es. disabilitazione script e network egress lockdown per i runner) non è più opzionale.


文章来源: https://blog.lobsec.com/2026/04/analisi-tecnica-attacco-supply-chain-axios-rat/
如有侵权请联系:admin#unsafe.sh