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

> Le 29 octobre 2026, la marketplace de Cursor a distribué pendant onze heures une copie modifiée de l'extension Claude Code, sous son identifiant officiel. Ce que faisait la charge, pourquoi un éditeur dérivé de VS Code a son propre magasin d'extensions, et quoi vérifier sur sa machine.


*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émarrage[^1]. Cursor estime que 5 000 utilisateurs au plus ont été exposés et demande de passer à la version 2.1.314[^2]. Anthropic dit n'avoir ni construit ni publié cette copie, et ses canaux officiels ne sont pas touchés[^3]. 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 27 | Les versions modifiées sont disponibles sur la marketplace de Cursor |
| 29 octobre, 20 h 35 | Fin de la fenêtre : Cursor retire l'extension, puis ferme sa marketplace par précaution |
| 30 octobre, 1 h 06 | Anthropic publie la version 2.1.314 sur GitHub |
| 30 octobre, 7 h 46 | Cursor annonce l'incident : 5 000 utilisateurs au plus |
| 30 octobre, 14 h 08 | Anthropic met ses propres systèmes hors de cause |
| 30 octobre, 18 h 30 | L'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 valeurs[^4]. C'est le repérage avant le cambriolage, et on sait [ce qu'un paquet malveillant trouve dans ces variables](/blog/secrets-variables-environnement-paquet-malveillant/) 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 retirer[^1]. 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.314[^5]. 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 source[^6]. La 2.1.312, elle, existe bien : celle d'Open VSX a été vérifiée saine, celle de Cursor était modifiée[^7]. 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 peut[^8]. 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](/blog/chaindrop-npm-modules-go-supply-chain/), 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'installation[^7]. Et le manifeste de l'extension officielle demande ce chargement dès que l'éditeur a fini de démarrer[^5].

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 DevOps[^9]. 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 servir[^10].

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 :

```bash
# 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 Windows[^1].

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.317[^5]. 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 outre[^11].
- **Cursor** : `extensions.installCooldownHours` diffère installations et mises à jour, et une équipe peut imposer son propre délai par-dessus[^10].

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 2026[^12]. 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](https://cursor.com/blog/claude-code-extension-security-notice), 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](https://x.com/cursor_ai/status/2116074289053175808), 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](https://x.com/felixrieseberg/status/2116170451466543578) : « 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](https://www.theregister.com/cyber-crime/2026/10/30/anthropic-that-claude-code-extension-compromise-couldnt-be-us/5306682) le même jour.

[^4]: L'[analyse de Microsoft Threat Intelligence](https://www.microsoft.com/en-us/security/blog/2026/10/30/inside-malicious-claude-code-branded-cursor-extension-persistent-ssh-backdoor/), 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](https://open-vsx.org/api/Anthropic/claude-code/versions), 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](https://open-vsx.org/api/Anthropic/claude-code/alpine-arm64/2.1.312/file/package.json) déclare l'événement d'activation `onStartupFinished`.

[^6]: [BleepingComputer](https://www.bleepingcomputer.com/news/security/malicious-claude-code-extension-on-cursor-planted-ssh-backdoors/), 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](https://www.stepsecurity.io/blog/claude-code-extension-trojanized), 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](https://code.visualstudio.com/docs/configure/extensions/extension-runtime-security) de la documentation de VS Code.

[^9]: Les [conditions d'utilisation de la Visual Studio Marketplace et de NuGet.org](https://cdn.vsassets.io/v/M264_20251020.18/_content/Microsoft-Visual-Studio-Marketplace-Terms-of-Use.pdf) (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](https://github.com/VSCodium/vscodium/blob/master/docs/extensions.md) et [code-server](https://github.com/coder/code-server/blob/main/docs/FAQ.md#why-cant-code-server-use-microsofts-extension-marketplace) utilisent Open VSX par défaut.

[^10]: La [page d'aide de Cursor sur les extensions](https://cursor.com/help/customization/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](https://code.visualstudio.com/docs/configure/extensions/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](https://github.com/anthropics/claude-code/releases), 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.



