Interview Contagieuse : Suivi du Vecteur d’Infection des Tâches de VS Code
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Le rapport détaille une campagne attribuée à la Corée du Nord qui utilise les définitions de tâche de Visual Studio Code (tasks.json) pour obtenir une exécution initiale de code sur les points d’extrémité des développeurs. Les entrées de tâches malveillantes exécutent des commandes qui récupèrent des charges utiles supplémentaires depuis des plateformes d’hébergement telles que Vercel, Render et des services similaires, ou elles intègrent des dépendances NPM malveillantes. Cette chaîne d’exécution permet finalement le déploiement de portes dérobées comprenant BeaverTail et InvisibleFerret.
Investigation
Les chercheurs ont utilisé la recherche de code GitHub pour identifier des dépôts contenant des fichiers tasks.json avec des exécutions intégrées de curl ou wget. Ils ont analysé les domaines d’hébergement des charges utiles, documenté des méthodes d’obfuscation qui cachent des scripts à l’intérieur de fichiers image et police, et découvert un package NPM malveillant nommé jsonwebauth. L’étude a également mis en corrélation les adresses e-mail des auteurs de commits et a élargi la cartographie de l’infrastructure au-delà de la livraison basée sur Vercel.
Atténuation
Désactivez l’exécution automatique des tâches dans VS Code et examinez le contenu des tasks.json avant de faire confiance ou d’ouvrir un espace de travail. Utilisez l’environnement github.dev dans votre navigateur pour inspecter les dépôts sans exécuter de tâches locales. Surveillez les processus enfants suspects de VS Code, les requêtes réseau inattendues vers des domaines connus de charges utiles et les chemins d’exécution Node.js qui tentent d’exécuter des fichiers non-JavaScript.
Réponse
Si identifié, isolez le point d’extrémité, terminez les processus suspects générés par VS Code et bloquez le trafic sortant vers les domaines malveillants associés. Collectez et analysez les charges utiles téléchargées, et effectuez une validation judiciaire pour l’activité de persistance et de backdoor liée à BeaverTail et InvisibleFerret.
graph TB %% Class Definitions classDef technique fill:#ffcc99 classDef action fill:#c2f0c2 %% Nodes – Techniques node_initial_access[« <b>Technique</b> – <b>T1195.001 Compromission de la chaîne d’approvisionnement</b><br><b>Description</b>: Les adversaires compromettent la chaîne logicielle pour diffuser le package NPM malveillant \ »jsonwebauth\ ». »] class node_initial_access technique node_ide_abuse[« <b>Technique</b> – <b>T1176.002 Abus d’extension IDE : Tâches VS Code</b><br><b>Description</b>: Une extension VS Code malveillante utilise tasks.json pour exécuter des actions lors de l’ouverture d’un dossier. »] class node_ide_abuse technique node_execution[« <b>Technique</b> – <b>T1202 Exécution indirecte de commandes</b><br><b>Description</b>: Les commandes sont exécutées indirectement via des tâches VS Code déclenchées par l’événement folderOpen. »] class node_execution technique node_command_exec[« <b>Technique</b> – <b>T1059.004 Shell Unix / T1059.003 Shell de commandes Windows</b><br><b>Description</b>: Utilise des pipelines curl ou wget dans des shells Unix ou Windows pour récupérer du code supplémentaire. »] class node_command_exec technique node_obfuscation[« <b>Technique</b> – <b>T1027.009 Payloads obfusqués intégrés dans des polices/images</b><br><b>Description</b>: Les payloads malveillants sont dissimulés dans des fichiers de police ou d’image afin d’échapper à la détection. »] class node_obfuscation technique node_masquerading[« <b>Technique</b> – <b>T1036.008 Masquage des types de fichiers</b><br><b>Description</b>: Les fichiers sont déguisés en types légitimes pour se fondre dans le contenu normal. »] class node_masquerading technique %% Nodes – Actions node_download[« <b>Action</b> – Télécharger les payloads<br><b>Détails</b>: Récupère des payloads malveillants depuis Vercel ou des services de stockage JSON. »] class node_download action node_persistence[« <b>Action</b> – Exécution supplémentaire / Persistance<br><b>Détails</b>: Exécute et maintient le code malveillant sur le système compromis. »] class node_persistence action %% Connections node_initial_access –>|mène_à| node_ide_abuse node_ide_abuse –>|permet| node_execution node_execution –>|exécute| node_command_exec node_command_exec –>|télécharge| node_download node_download –>|contient| node_obfuscation node_obfuscation –>|utilise| node_masquerading node_masquerading –>|mène_à| node_persistence
Flux d’Attaque
Détections
Création ou Modification de Fichier de Tâches VS Code (via file_event)
Voir
Détection de l’Exécution Malveillante de Node.js dans les Tâches VS Code [Création de Processus Windows]
Voir
Détection de l’Exécution Malveillante de Tâches VS Code [Création de Processus Linux]
Voir
Exécution de la Simulation
Condition Préalable : Le Test Préliminaire de Télémétrie et Baseline doit avoir été réussi.
Justification : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTPs identifiés et viser à générer exactement la télémétrie attendue par la logique de détection. Des exemples abstraits ou non liés conduiront à des erreurs de diagnostic.
-
Narration et Commandes de l’Attaque :
Un attaquant qui a déjà compromis le poste de travail de l’utilisateur exploite VS Code’s tasks.json fonctionnalité pour exécuter un exécutable Windows malveillant (payload.exe) via Node.js. L’attaquant crée une tâche qui invoquecmd.exe /c node payload.exe, satisfaisant ainsi l’exigence de trois mots-clés de la règle (VS Code’s tasks.json,node,cmd). Après avoir enregistré la définition de la tâche malveillante sous ledossier .vscode de l'utilisateur, l’attaquant exécute la tâche via la palette de commandes de VS Code, provoquant l’apparition des processuscmd.exeandnode.exedans le journal de sécurité Windows avec une ligne de commande contenant les trois chaînes requises. -
Script de Test de Régression : (PowerShell – autonome)
# --------------------------------------------------------- # Simulation de Tâche Malveillante VS Code – Déclenche la Règle Sigma # --------------------------------------------------------- # 1. Préparer une charge utile malveillante factice (exécutable non-JS) $payloadPath = "$env:USERPROFILEDesktoppayload.exe" # Créer un petit exécutable en utilisant Add-Type de PowerShell (pour la démo) Add-Type -TypeDefinition @" using System; public class Dummy { public static void Main() { System.Console.WriteLine("Charge utile exécutée"); } } "@ -Language CSharp [Dummy]::Main() | Out-File -FilePath $payloadPath -Encoding ascii # 2. Construire le tasks.json de VS Code avec la commande malveillante $vscodeDir = "$env:USERPROFILE.vscode" if (-not (Test-Path $vscodeDir)) { New-Item -ItemType Directory -Path $vscodeDir | Out-Null } $tasksJson = @{ version = "2.0.0" tasks = @( @{ label = "Exécuter la Charge Utile Malveillante" type = "shell" command = "cmd.exe" args = @("/c", "node", "`"$payloadPath`"") } ) } | ConvertTo-Json -Depth 5 $tasksFile = Join-Path $vscodeDir "tasks.json" $tasksJson | Set-Content -Path $tasksFile -Encoding UTF8 # 3. Déclencher la tâche via l'interface en ligne de commande de VS Code # (Suppose que `code` est dans PATH) Write-Host "Exécution de la tâche malveillante VS Code..." code --folder-uri "$env:USERPROFILE" --command "workbench.action.tasks.runTask" --args "Exécuter la Charge Utile Malveillante" # 4. Attendre quelques secondes pour que les processus apparaissent dans le journal Start-Sleep -Seconds 5 # 5. OPTIONNEL : Interroger le journal d'événements local pour vérifier (pour la démonstration) Get-WinEvent -FilterHashtable @{ LogName='Security'; Id=4688; Data='node.exe'; } | Where-Object {$_.Message -match 'tasks.json'} | ft TimeCreated, Message -AutoSize -
Commandes de Nettoyage : (PowerShell)
# Supprimez la charge utile malveillante et la définition de tâche VS Code Remove-Item -Path "$env:USERPROFILEDesktoppayload.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:USERPROFILE.vscodetasks.json" -Force -ErrorAction SilentlyContinue # Optionnel : redémarrez VS Code pour effacer les tâches mises en cache Get-Process -Name "Code" -ErrorAction SilentlyContinue | Stop-Process -Force