Selon un billet de blog publié par Daniel Tofan (Blog de Daniel Tofan, 26 janvier 2026), une fausse offre freelance sur LinkedIn l’a conduit vers un dépôt GitLab contenant une application Node.js trojanisée, conçue pour déployer un malware via les hooks du cycle de vie npm.
L’attaque s’appuie sur un hook npm postinstall dans package.json qui lance automatiquement l’application et, avec elle, la charge malveillante. Un loader obfusqué dissimulé en fin de fichier (server/controllers/userController.js) décode des variables d’environnement en Base64, récupère un payload distant hébergé sur jsonkeeper.com et l’exécute dynamiquement via Function.constructor. La configuration (server/config/.config.env) encode l’URL du payload et des en-têtes HTTP dédiés.
Le payload met en œuvre trois modules : un backdoor C2 (socket.io) vers 144.172.108.57:4891 capable d’exécuter des commandes (child_process) et d’assurer une persistence (fichier PID dans .npm) ; un module d’exfiltration qui recherche des fichiers sensibles (.env, .secret, .pem, .json, .docx, .xlsx, .pdf) et les envoie vers http://144.172.108.57:4896/upload ; et un pilleur de presse-papiers (PowerShell Get-Clipboard) envoyant en continu les contenus copiés.
Plusieurs signaux faibles ont précédé la découverte : profil LinkedIn silencieux (500+ relations, aucune publication), rendez-vous technique manqué après partage du code, historique Git minimal (2 commits, création fin 2025) suggérant un historique écrasé, et le fait qu’un audit générique (y compris via IA) n’a pas détecté la charge jusqu’à une analyse sécurité ciblée. Après identification, l’auteur a supprimé le dépôt cloné, nettoyé .npm, roté ses clés (OpenAI, Anthropic, Stripe, Supabase, Firebase, Cloudflare, Twilio, SendGrid, etc.) et signalé le dépôt à GitLab (supprimé depuis) ainsi que le profil LinkedIn.
IOCs
- C2: 144.172.108.57 (reverse DNS: 57.108.172.144.static.cloudzy.com, Cloudzy VPS)
- Ports/Endpoints: socket.io 4891 ; upload http://144.172.108.57:4896/upload
- Payload host: https://jsonkeeper.com/b/ARL7M
- Dépôt GitLab: https://gitlab.com/nielsottore-oss/realestatevc (supprimé)
- Utilisateur GitLab: nielsottore-oss
- Email contact “tech”: jack.million.eth@gmail.com
- Calendly: https://calendly.com/jack-murray-tech
- Campaign ID: 098f6bcd4621d373cade4e832627b4f6 (MD5 de “test”)
TTPs observés
- Ingénierie sociale via offre LinkedIn crédible
- Attaque chaîne d’approvisionnement ciblant le workflow développeur
- Abus des hooks npm (postinstall) pour exécution automatique
- Obfuscation Base64 et exécution dynamique (Function.constructor)
- C2 en temps réel (socket.io), exfiltration de fichiers et vol du presse-papiers
- Persistence par fichier PID dans .npm
- Usage de services légitimes (jsonkeeper.com) pour camoufler le trafic
- Historique Git écrasé pour masquer les modifications
L’article est une analyse technique et un partage d’IOCs/indicateurs visant à documenter et alerter sur une campagne ciblant des développeurs.
🧠 TTPs et IOCs détectés
TTP
[‘Ingénierie sociale via offre LinkedIn crédible’, ‘Attaque chaîne d’approvisionnement ciblant le workflow développeur’, ‘Abus des hooks npm (postinstall) pour exécution automatique’, ‘Obfuscation Base64 et exécution dynamique (Function.constructor)’, ‘C2 en temps réel (socket.io), exfiltration de fichiers et vol du presse-papiers’, ‘Persistence par fichier PID dans .npm’, ‘Usage de services légitimes (jsonkeeper.com) pour camoufler le trafic’, ‘Historique Git écrasé pour masquer les modifications’]
IOC
{‘ip’: ‘144.172.108.57’, ‘domain’: ‘57.108.172.144.static.cloudzy.com’, ‘url’: [‘http://144.172.108.57:4896/upload’, ‘https://jsonkeeper.com/b/ARL7M’, ‘https://gitlab.com/nielsottore-oss/realestatevc’], ’email’: ‘jack.million.eth@gmail.com’, ‘calendly’: ‘https://calendly.com/jack-murray-tech', ‘campaign_id’: ‘098f6bcd4621d373cade4e832627b4f6’}
🔗 Source originale : https://codecrank.ai/blog/linkedin-malware-warning/