Québec, Canada

403-1381 1re Avenue

+1 581.849.27.96

bdgouthiere@gmail.com

Claude Code dans Cursor : la mise à jour qui ajoutait une clé SSH

Ou : Comment la bonne extension, sous le bon nom, est sortie du mauvais entrepôt

Le 29 octobre 2026, de 2 h 27 à 13 h 35, heure du Pacifique, soit de 10 h 27 à 21 h 35 à Paris, la marketplace d’extensions de Cursor a distribué une copie piégée de l’extension Claude Code, sous son identifiant officiel anthropic.claude-code. Dès son chargement, sur macOS et Windows, elle ajoutait la clé SSH de l’attaquant au fichier authorized_keys, tentait d’ouvrir un tunnel inverse vers son serveur et s’installait pour survivre au redémarrage1. Cursor estime que 5 000 utilisateurs au plus ont été exposés et demande de passer à la version 2.1.3142. Anthropic dit n’avoir ni construit ni publié cette copie, et ses canaux officiels ne sont pas touchés3. Les premiers articles ne parlaient que de la version 2.1.313 ; l’avis de Cursor, révisé le 30 octobre, y ajoute la 2.1.312.

J’utilise Claude Code tous les jours, en ligne de commande et dans l’application de bureau, deux logiciels qu’Anthropic distribue lui-même. Ce qui m’intéresse ici, c’est le trajet : le même logiciel, sous le même nom, est passé par un magasin de plus. Et c’est le magasin qui a été piégé.

Extension piégée dans la marketplace de Cursor : la chaîne d’approvisionnement passe par l’éditeur de code

Onze heures, deux numéros de version

La chronologie, en UTC pour ne pas jongler entre trois fuseaux :

Moment (UTC)Événement
29 octobre, 9 h 27Les versions modifiées sont disponibles sur la marketplace de Cursor
29 octobre, 20 h 35Fin de la fenêtre : Cursor retire l’extension, puis ferme sa marketplace par précaution
30 octobre, 1 h 06Anthropic publie la version 2.1.314 sur GitHub
30 octobre, 7 h 46Cursor annonce l’incident : 5 000 utilisateurs au plus
30 octobre, 14 h 08Anthropic met ses propres systèmes hors de cause
30 octobre, 18 h 30L’avis de Cursor est révisé et nomme aussi la version 2.1.312

La charge commençait par un inventaire : nom de la machine, utilisateur, système, adresse électronique configurée dans Git, adresse IP publique, et jusqu’à quarante noms de variables d’environnement contenant des mots comme KEY ou TOKEN, sans leurs valeurs4. C’est le repérage avant le cambriolage, et on sait ce qu’un paquet malveillant trouve dans ces variables quand il revient chercher les valeurs. Venaient ensuite la clé SSH, commentée svc-telemetry, la tentative d’activer le serveur SSH local, le tunnel inverse, puis la persistance : un LaunchAgent sur macOS, une tâche planifiée sous SYSTEM ou un script de démarrage sur Windows, avec un nouvel essai du tunnel toutes les soixante secondes environ.

Il y a une nuance, que Cursor donne lui-même. Activer le serveur SSH exige des droits d’administrateur, que l’extension n’a pas sur la plupart des machines : l’attaquant n’a donc en général pas pu entrer par le tunnel. La clé, la persistance et l’envoi des informations ont bien eu lieu, eux, et désinstaller l’extension ne suffit pas à les retirer1. Une clé dans la serrure d’une porte qui n’existe pas encore reste une clé.

Le numéro 2.1.313 est l’autre curiosité : au 3 novembre 2026, les historiques d’Open VSX, de npm et de la marketplace de Microsoft passent tous de 2.1.312 à 2.1.3145. Ce numéro n’a jamais existé sur aucun canal d’Anthropic. Les premiers signalements croyaient npm et Microsoft touchés, à tort : Cursor était la seule source6. La 2.1.312, elle, existe bien : celle d’Open VSX a été vérifiée saine, celle de Cursor était modifiée7. Un numéro de version est une étiquette, et l’étiquette, c’est le magasin qui la colle.

Une extension a tes droits, pas les siens

La documentation de VS Code le dit sans détour : le processus qui exécute les extensions a les mêmes permissions que l’éditeur, donc les tiennes. Lire et écrire tes fichiers, ouvrir des connexions réseau, lancer des programmes : tout ce que tu peux faire, une extension le peut8. Il n’y a pas de bac à sable.

Et il n’y a même pas de moment suspect. Dans le ver qui a traversé npm en 2026, le code malveillant tournait pendant l’installation, ce qui laisse au moins un script à désactiver. Ici, le chargement de l’extension suffisait, sans conversation avec Claude ni script d’installation7. Et le manifeste de l’extension officielle demande ce chargement dès que l’éditeur a fini de démarrer5.

Pour un agent de code, l’ironie est complète : lire tes fichiers et lancer des commandes, c’est le produit. Celle-ci en lançait juste quelques-unes de plus.

Pourquoi Cursor a son propre magasin

Cursor est un dérivé de VS Code, mais il n’a pas le droit de puiser dans la marketplace de Microsoft. Les conditions d’utilisation réservent les extensions qui y sont publiées aux produits de Microsoft qu’elles énumèrent : Visual Studio, VS Code, GitHub Codespaces, Azure DevOps9. Cursor s’appuie donc sur Open VSX, le registre libre et indépendant porté par la fondation Eclipse, pour les extensions tierces. Recherches et téléchargements passent par un relais à lui, qui soumet chaque extension à une analyse anti-maliciel avant de la servir10.

Entre l’auteur de l’extension et toi, il y a donc deux étages, Open VSX puis le relais de Cursor, et tu installes ce que le dernier te remet. Son analyse protège d’un auteur malveillant en amont, pas d’un intrus qui a la main sur le magasin lui-même. La même page d’aide prévient d’ailleurs qu’un même identifiant peut désigner, chez Cursor et chez Microsoft, des auteurs ou du code différents.

Imagine un marché où un stand revend les outils d’un grossiste dans leur emballage d’origine. Tu prends un tournevis de marque, la marque est sur la boîte, le code-barres est bon. Le fabricant n’a pourtant jamais vu cette boîte : c’est le stand qui te l’a tendue. Le 29 octobre, une des boîtes contenait en prime un double de la clé de ton atelier. Une autre portait une référence, 2.1.313, que le fabricant n’a jamais produite. Le stand l’avait en rayon.

DevOps Dave : J’ai vérifié, c’est l’extension officielle. Éditeur Anthropic, identifiant anthropic.claude-code.

Security Sarah : Tu l’as téléchargée où ?

DevOps Dave : Dans mon éditeur de code. Sur la marketplace.

Security Sarah : Laquelle ?

DevOps Dave : Il y en a plusieurs ?

Ce qu’il faut vérifier sur ta machine

La vérification que donne Cursor ne regarde pas la version, elle cherche la clé. Sur macOS, et sur Linux où Cursor liste le même fichier parmi les indicateurs :

1
2
# Commande de l'avis de Cursor : cherche la clé de l'attaquant
grep -qs svc-telemetry ~/.ssh/authorized_keys && echo "svc-telemetry key found" || echo "No key found; machine not impacted"

Sur Windows, l’avis fournit une commande PowerShell qui fouille aussi C:\ProgramData\ssh\administrators_authorized_keys. Si la clé est là : isoler la machine, lancer le script de nettoyage de Cursor, puis changer, depuis une autre machine, les secrets et les sessions accessibles depuis celle-ci. Les fichiers de persistance à chercher sont listés dans l’avis, dont ~/Library/LaunchAgents/com.apple.sysmond.plist sur macOS et une tâche planifiée nommée SysMon sur Windows1.

Ensuite, la version : 2.1.314 ou plus récente. Au 3 novembre 2026, la dernière publiée par Anthropic sur Open VSX et chez Microsoft est la 2.1.3175. Dans VS Code, code --list-extensions --show-versions affiche les versions installées. Pour Cursor, je n’ai trouvé aucune documentation officielle de ces options. De toute façon, un « 2.1.312 » affiché ne prouve rien : c’était aussi un numéro piégé.

Reste la mise à jour automatique, qui a fait le travail de l’attaquant : dans la fenêtre, une machine qui se mettait à jour seule recevait la copie sans un clic. Deux réglages la retardent :

  • VS Code : extensions.autoUpdateDelay fait attendre un délai après la publication d’une mise à jour avant de l’installer, douze heures par défaut d’après sa documentation au 3 novembre 2026. Une mise à jour lancée à la main passe outre11.
  • Cursor : extensions.installCooldownHours diffère installations et mises à jour, et une équipe peut imposer son propre délai par-dessus10.

Sur le papier, douze heures d’attente auraient suffi : la copie a été retirée au bout d’onze. L’épinglage va plus loin. code --install-extension anthropic.claude-code@2.1.317 installe une version précise, et un clic droit sur l’extension coupe sa mise à jour automatique. L’épinglage fige aussi les corrections : Anthropic a publié douze versions sur GitHub entre le 19 octobre et le 3 novembre 202612. Un délai de quelques heures me paraît le bon compromis pour un outil qui bouge aussi vite. Une version figée vieillit.

On dessine d’habitude la chaîne d’approvisionnement du dépôt de code au registre de paquets. Elle continue jusqu’au bouton « Mettre à jour » de ton éditeur, et ce bouton parle au magasin, pas à l’auteur de l’extension. Au 3 novembre 2026, l’avis de Cursor ne dit toujours pas comment l’attaquant a obtenu son accès à ce magasin.



  1. L’avis de sécurité de Cursor, daté du 29 octobre 2026 et révisé le 30 octobre à 11 h 30, heure du Pacifique : fenêtre d’exposition, comportement de la charge, droits d’administrateur nécessaires au serveur SSH, commandes de vérification, scripts de nettoyage et indicateurs de compromission. ↩︎ ↩︎ ↩︎

  2. L’annonce de Cursor sur X, le 30 octobre 2026 : 5 000 utilisateurs au plus, et la demande de passer à la version 2.1.314. Le chiffre est un plafond, pas un décompte des machines compromises. ↩︎

  3. Felix Rieseberg, de l’équipe technique d’Anthropic, sur X le 30 octobre 2026 : « A malicious actor used access to Cursor’s marketplace to publish a tampered copy ». Il ajoute que ni les systèmes d’Anthropic ni les portables de ses employés n’ont été compromis. Repris par The Register le même jour. ↩︎

  4. L’analyse de Microsoft Threat Intelligence, le 30 octobre 2026 : ordre d’exécution de la charge, inventaire des noms de variables, et confirmation que les paquets piégés n’ont été diffusés ni par la marketplace de Microsoft ni par npm. Anthropic lui a confirmé ne pas avoir développé le paquet. ↩︎

  5. La liste des versions de l’extension sur Open VSX, consultée le 3 novembre 2026 : 2.1.317, 2.1.316, 2.1.314, 2.1.312. Les historiques de npm (@anthropic-ai/claude-code) et de la marketplace de Microsoft, consultés le même jour, ne contiennent pas non plus de 2.1.313. Le manifeste de la 2.1.312 sur Open VSX déclare l’événement d’activation onStartupFinished. ↩︎ ↩︎ ↩︎

  6. BleepingComputer, le 30 octobre 2026 : le chargeur inséré en tête de extension.js, exécuté au chargement de l’extension, et la correction des premiers signalements sur npm, Open VSX et la marketplace de Microsoft. ↩︎

  7. L’analyse de StepSecurity, publiée le 30 octobre 2026 et mise à jour le 1er novembre : la 2.1.312 d’Open VSX est un fichier différent, vérifié sain, et la 2.1.313 n’a atteint aucun canal officiel. La charge s’exécute au chargement du module, sans script d’installation. ↩︎ ↩︎

  8. La page Extension runtime security de la documentation de VS Code. ↩︎

  9. Les conditions d’utilisation de la Visual Studio Marketplace et de NuGet.org (PDF, version de septembre 2025), qui définissent les produits autorisés et interdisent d’installer ces extensions ailleurs. Les autres dérivés font le même détour : VSCodium et code-server utilisent Open VSX par défaut. ↩︎

  10. La page d’aide de Cursor sur les extensions : registre Open VSX, relais propre à Cursor, analyse avant diffusion, délai d’installation par utilisateur ou imposé par l’équipe, et identifiants qui ne désignent pas toujours le même code que chez Microsoft. ↩︎ ↩︎

  11. La page Extension Marketplace de la documentation de VS Code, section sur la mise à jour automatique, qui documente aussi « Install Another Version ». ↩︎

  12. Les publications du dépôt anthropics/claude-code sur GitHub, consultées le 3 novembre 2026 : de la 2.1.304, le 19 octobre, à la 2.1.317, le 3 novembre, sans 2.1.313 ni 2.1.315. La 2.1.314 y paraît le 30 octobre à 1 h 06 UTC. ↩︎