Selon des chercheurs de ReversingLab, 19 extensions malveillantes ont été identifiées sur le Marketplace VS Code, la majorité embarquant un fichier malveillant se faisant passer pour une image PNG.
Campagne malveillante ciblant VS Code via des dépendances piégées
1. Contexte général
Les chercheurs de ReversingLabs ont identifié une campagne active depuis février 2025, découverte le 2 décembre 2025, impliquant 19 extensions malveillantes Visual Studio Code publiées sur le VS Code Marketplace.
Cette campagne s’inscrit dans une tendance plus large :
- Forte hausse des extensions malveillantes en 2025
- Passage de 27 détections en 2024 à 105 en 2025 (+~4x)
- Attaques de plus en plus profondes dans la supply chain, via dépendances
2. Vecteur d’attaque principal
🎯 Abus du dossier node_modules
Les attaquants exploitent un point de confiance implicite :
- Les extensions VS Code sont livrées avec leurs dépendances pré-packagées
- Les utilisateurs ne vérifient généralement pas le contenu réel de ces dépendances
👉 Les attaquants ont modifié localement une dépendance légitime très populaire :
path-is-absolute- +9 milliards de téléchargements cumulés depuis 2021
- Le package officiel sur npm est intact
- La version piégée existe uniquement à l’intérieur des extensions malveillantes
Dans 4 cas, le package @actions/io est utilisé avec une technique similaire.
3. Chaîne d’infection technique
Étape 1 — Modification de la dépendance
- Le fichier
index.jsdepath-is-absoluteest modifié - Ajout d’une classe malveillante exécutée au démarrage de VS Code
- Cette classe décode et exécute un dropper JavaScript dissimulé
Étape 2 — Obfuscation du dropper
- Code JavaScript :
- Encodé en Base64
- Puis inversé caractère par caractère
- Stocké dans un fichier nommé
lock
Étape 3 — Faux fichier image
- Ajout d’un fichier
banner.png - Ce fichier :
- N’est pas une image valide
- Est en réalité une archive contenant deux binaires malveillants
Étape 4 — Exécution via LOLBIN
- Les binaires sont lancés via
cmstp.exe(Living-off-the-Land Binary) - Rôles des binaires :
- Binaire 1 : ferme cmstp.exe en simulant une frappe clavier
- Binaire 2 : cheval de Troie Rust (analyse encore en cours)
Variante
- Dans les extensions utilisant
@actions/io, les binaires sont :- Dissimulés dans des fichiers
.tset.map - Toujours chargés de manière détournée
- Dissimulés dans des fichiers
4. Pourquoi cette attaque est particulièrement dangereuse
- Exploitation d’un package npm de confiance
- Aucun changement côté npm → réputation intacte
- Malware enfoui dans une dépendance
- Binaire caché sous une fausse image PNG
- Usage de LOLBIN Windows pour l’exécution
- Déploiement via un outil très répandu chez les développeurs
➡️ Un exemple typique de supply chain attack furtive.
5. TTPs observées (MITRE ATT&CK)
🛠️ Tactiques & techniques
- T1195.002 – Compromise Software Supply Chain (extensions VS Code)
- T1059.007 – JavaScript execution
- T1140 – Deobfuscate / Decode Files or Information
- T1027 – Obfuscated / Encrypted Payloads
- T1218.003 – Signed Binary Proxy Execution (cmstp.exe)
- T1036 – Masquerading (PNG factice)
- T1105 – Ingress Tool Transfer (chargement de payloads)
- T1204.002 – User Execution (installation d’extension)
6. Indicators of Compromise (IoCs)
🔹 Extensions VS Code malveillantes
| Package | Version | SHA1 |
|---|---|---|
| malkolm.theme-artschool-remake | 1.0.0 | edcbdb65d8653c11be197bd188241813bf431bc7 |
| malkolm.theme-ascetic-remake | 1.0.0 | c6e5b9c41e5dd7cadc7247bcfbaeb643ade61e46 |
| malkolm.theme-aurora-remake | 1.0.0 | 71c241a7110abb70bff59d22e0238bc5553d495a |
| malkolm.theme-azure-remake | 1.0.0 | 9985d8e1c820cf4bdf25f7b0023d2b879c8af722 |
| malkolm.theme-bashling-remake | 1.0.0 | 7cb116b08bda294d962b28bf47ece4b40d9ed2a8 |
| pandaexpress.theme-anarchist-plugin | 1.0.0 | 77c76d6d067821bc3a34b734a719df44a39c12df |
| pandaexpress.theme-anarchisteighties-plugin | 1.0.0 | 451dc570125d4e0db47217d5e177d0fa94c8bbb3 |
| pandaexpress.theme-ant-plugin | 1.0.0 | 578b6b117d433b71e3cb69c2062ab61f29171ae6 |
| pandaexpress.theme-array-plugin | 1.0.0 | dc40c33ffbca097917f17f7482eef295856d8076 |
| pandaexpress.theme-arstotzka-plugin | 1.0.0 | 6a1fc337ec7fdfaa89604d686cf5afef5057dc90 |
| prada555.theme-abyss-ported | 1.0.0 | 0aad0649f74872d37fbce2369f4de3a5212f47de |
| prada555.theme-acai-ported | 1.0.0 | 21a53bcb9d97ae04ed9247063485f441bd072f15 |
| prada555.theme-active4d-ported | 1.0.0 | 3be8024c4fa34f7d7d100fd783df1a95e0c9dbbe |
| prada555.theme-afterglow-ported | 1.0.0 | 35080681cf76a5715ea4c04ec1aa126af53a3238 |
| priskinski.Theme-Afterglow-remake | 1.0.0 | 9252d278a3e693d1a41b99c2aeca05347a3ba107 |
| priskinski.Theme-AgolaDark-remake | 1.0.0 | 772d1159c93b097b449b17a20e4b60bfd038adc8 |
| priskinski.Theme-AllHallowsEve-remake | 1.0.0 | 6a2e4e2668dfcae345dad3694b2631fffae7d132 |
| priskinski.Theme-Amber-remake | 1.0.0 | d85271c013499ab45b3e6fa1820f79d268ea3a7e |
| priskinski.Theme-Amy-remake | 1.0.0 | 40fb5d1cedcd5342e0d9b899ac18388886bcb4f0 |
7. Recommandations clés
- 🔍 Auditer systématiquement les extensions, y compris leurs dépendances
- ⚠️ Se méfier des extensions :
- récentes
- peu téléchargées
- sans avis
- 🧰 Utiliser des outils d’analyse supply chain (ex. Spectra Assure)
- 👨💻 Sensibiliser les développeurs : les dépendances sont une surface d’attaque
🎯 Conclusion
Cette campagne illustre une évolution majeure des attaques supply chain :
les dépendances de confiance deviennent des vecteurs d’infection silencieux.
Dans l’écosystème développeur, la confiance implicite est désormais un risque.
- Il s’agit d’une publication de recherche signalant l’identification d’extensions malveillantes et décrivant la technique de dissimulation d’un fichier malveillant en PNG.
🔗 Source originale : https://www.reversinglabs.com/blog/malicious-vs-code-fake-image
🖴 Archive : https://web.archive.org/web/20251213160023/https://www.reversinglabs.com/blog/malicious-vs-code-fake-image