Selon Socket (socket.dev), l’équipe Threat Research a identifié 10 paquets npm typosquattés, publiés le 4 juillet 2025 et totalisant plus de 9 900 téléchargements en plus de quatre mois, qui orchestrent une opération de vol d’identifiants multi‑étapes. Les paquets imitent des bibliothèques populaires (TypeScript, discord.js, ethers.js, nodemon, react-router-dom, zustand) et ont été publiés par l’acteur « andrew_r1 ».
Le vecteur d’exécution abuse du hook npm postinstall pour lancer un script install.js qui détecte l’OS et ouvre un nouveau terminal afin d’exécuter un payload obfusqué (app.js), masquant l’activité durant l’installation. Le code est protégé par quatre couches d’obfuscation: wrapper eval auto‑décodant, XOR à clé dynamique dérivée du code du déchiffreur, encodage URL et obfuscation du flot de contrôle (switch-case, bases mixtes hex/octal).
Chaîne d’attaque en trois étapes: 1) Ingénierie sociale via une fausse CAPTCHA et de faux messages d’installation de bibliothèques légitimes pour paraître crédible et retarder l’exécution; 2) Fingerprinting IP avec un GET vers http://195[.]133[.]79[.]43/get_current_ip; 3) Téléchargement/exécution automatique de « data_extracter » depuis http://195[.]133[.]79[.]43/data_extracter, un binaire PyInstaller (~24 MB) adapté à l’OS (win32/linux/darwin).
Le binaire « data_extracter » est un information stealer multiplateforme qui cartographie le système de fichiers (profils Firefox/Chromium, clés SSH, fichiers de config tels que ~/.aws/credentials, ~/.kube/config, ~/.docker/config.json, .env, etc.), cible les trousseaux système (Windows Credential Manager, macOS Keychain, Linux SecretService/KWallet) et extrait des cookies de session et mots de passe navigateurs, ainsi que des tokens OAuth/JWT. Les artefacts volés sont compressés (ZIP), mis en staging dans /var/tmp ou /usr/tmp, puis exfiltrés vers le C2 195[.]133[.]79[.]43. Socket a saisi le registre npm pour leur retrait et formule des recommandations de rotation d’identifiants, révocation de tokens et audits d’accès.
IOCs (Indicators of Compromise) 🔎
- Paquets npm malveillants: deezcord.js; dezcord.js; dizcordjs; etherdjs; ethesjs; ethetsjs; nodemonjs; react-router-dom.js; typescriptjs; zustand.js
- Infrastructure réseau: C2 195[.]133[.]79[.]43 (endpoints: /get_current_ip, /data_extracter)
- Fichier malveillant: data_extracter
- Empreinte SHA256: 80552ce00e5d271da870e96207541a4f82a782e7b7f4690baeca5d411ed71edb
- Identifiants de l’acteur: npm alias andrew_r1; email parvlhonor@gmx[.]com
TTPs (MITRE ATT&CK) 🧰
- T1195.002 (Supply Chain Compromise) • T1027 / T1027.002 / T1027.009 (Obfuscation & Packing/Embedded Payloads)
- T1204.002 (User Execution: Malicious File) • T1059.007/.004/.006 (JavaScript/Unix Shell/Python)
- T1555 / T1555.003 / T1555.001 (Credentials from Password Stores, Web Browsers, Keychain)
- T1539 (Steal Web Session Cookie) • T1552.001/.004 (Credentials in Files, Private Keys)
- T1071.001 (Web Protocols) • T1041 (Exfiltration Over C2 Channel) • T1560.001 (Archive via Utility)
- T1140 (Deobfuscate/Decode) • T1082 (System Information Discovery) • T1083 (File and Directory Discovery)
Il s’agit d’une analyse de menace visant à documenter une campagne de typosquatting npm, détailler sa chaîne d’infection, et partager ses IOCs/TTPs pour faciliter la détection et la réponse.
🧠 TTPs et IOCs détectés
TTP
[‘T1195.002 (Supply Chain Compromise)’, ‘T1027 / T1027.002 / T1027.009 (Obfuscation & Packing/Embedded Payloads)’, ‘T1204.002 (User Execution: Malicious File)’, ‘T1059.007 (JavaScript)’, ‘T1059.004 (Unix Shell)’, ‘T1059.006 (Python)’, ‘T1555 (Credentials from Password Stores)’, ‘T1555.003 (Web Browsers)’, ‘T1555.001 (Keychain)’, ‘T1539 (Steal Web Session Cookie)’, ‘T1552.001 (Credentials in Files)’, ‘T1552.004 (Private Keys)’, ‘T1071.001 (Web Protocols)’, ‘T1041 (Exfiltration Over C2 Channel)’, ‘T1560.001 (Archive via Utility)’, ‘T1140 (Deobfuscate/Decode)’, ‘T1082 (System Information Discovery)’, ‘T1083 (File and Directory Discovery)’]
IOC
{‘hash’: ‘80552ce00e5d271da870e96207541a4f82a782e7b7f4690baeca5d411ed71edb’, ‘domain’: ‘gmx[.]com’, ‘ip’: ‘195[.]133[.]79[.]43’}
🔗 Source originale : https://socket.dev/blog/10-npm-typosquatted-packages-deploy-credential-harvester