- Plusieurs paquets publiés sur npm contenaient des scripts d’installation semblant viser Cursor.com et, lors de l’installation, transmettaient des informations système vers un service web externe
- Le diffuseur était l’utilisateur npm sn4k-s3c, qui utilisait des noms évoquant des paquets internes de Cursor comme
cursor-retreival,cursor-always-localetcursor-shadow-workspace - La sortie de
envexfiltrée par ces paquets peut contenir des variables d’environnement sensibles telles que des clés AWS, des tokens npm et des identifiants GitHub, ce qui pourrait élargir l’ampleur de l’impact - Le scanner d’analyse de paquets d’OpenSSF a identifié les paquets comme malveillants, et OSV a créé trois avis MAL-2025-27, MAL-2025-28 et MAL-2025-29
- Dans les métadonnées npm, une adresse e-mail snyk.io de Snyk Security Labs apparaissait comme éditeur ; le chercheur de Snyk a ensuite retiré les paquets et Snyk a réagi via un billet de blog
Des paquets npm semblant viser Cursor
- Plusieurs paquets publiés sur npm ont été repérés lors du processus de détection de paquets malveillants de SourceCodeRed
- Les noms des paquets évoquaient des paquets internes liés à Cursor
cursor-retreivalcursor-always-localcursor-shadow-workspace
- Le diffuseur était indiqué comme l’utilisateur npm sn4k-s3c
- Il est indiqué que la liste des paquets est consultable sur
https://www.npmjs.com/~sn4k-s3c
Comportement lors de l’installation
- L’installation des paquets collectait des données système puis les envoyait vers un service web contrôlé par l’attaquant
- D’après la capture d’écran, les paquets récupéraient la sortie de la commande
env - La sortie de
envpeut contenir, en plus des paramètres système, des variables d’environnement sensibles- clés AWS
- tokens npm
- identifiants GitHub
- autres variables d’environnement sensibles
- En conséquence, la simple installation pouvait entraîner une fuite d’informations de l’environnement local vers l’extérieur
Possibilité de dependency confusion et résultats de détection
- Ce type de paquet apparaît souvent dans des attaques de dependency confusion visant une entreprise précise
- Il n’a pas été possible de confirmer si Cursor.com dispose d’un programme de bug bounty ni le contexte exact
- SourceCodeRed soupçonne que Cursor puisse utiliser des paquets npm privés comme
cursor-always-local,cursor-retrievaletcursor-shadow-workspace - L’attaquant pouvait espérer qu’un employé de Cursor installe par erreur le paquet public et transmette ainsi des données
- Le scanner d’analyse de paquets d’OpenSSF a identifié ces paquets comme malveillants, et OSV a créé trois avis de malware
-
MAL-2025-27
-
MAL-2025-28
- MAL-2025-29
- La liste OSV associée est disponible sur
https://osv.dev/list?q=cursor&ecosystem=npm
-
Métadonnées du diffuseur
- Dans les métadonnées des paquets npm, l’éditeur utilisait une adresse e-mail snyk.io de l’équipe Snyk Security Labs
- Il est indiqué que cette métadonnée d’e-mail de l’éditeur ne peut pas être falsifiée
- Le champ
authormentionnait explicitement un employé de Snyk - Le champ
authorpeut être falsifié, mais comme l’éditeur utilisait une adresse e-mail Snyk vérifiée, l’hypothèse avancée est que les paquets provenaient bien de Snyk
Réaction des utilisateurs et mises à jour ultérieures
- SourceCodeRed indique avoir averti npm, mais qu’à ce moment-là les paquets n’étaient pas encore signalés comme malveillants
- De nombreux outils de sécurité de la supply chain logicielle ne peuvent bloquer un paquet que s’ils savent déjà qu’il est malveillant
- Il est recommandé de ne pas installer de paquets npm à l’aveugle
- Les paquets en question ne contenaient que deux fichiers,
package.jsonetindex.jsoumain.js, ce qui peut être considéré comme un signal suspect - Selon une mise à jour du 15 janvier 2025, le chercheur de Snyk a retiré les paquets liés à Cursor le lendemain de la publication du billet de blog
- Le 14 janvier 2025, The Register a publié un article sur le sujet :
https://www.theregister.com/2025/01/14/snyk_npm_deployment_removed/ - Le même jour, Snyk a publié une réponse sur son blog, affirmant en substance n’avoir rien fait de répréhensible :
https://snyk.io/blog/snyk-security-labs-testing-update-cursor-com-ai-code-editor/
1 commentaires
Avis sur Hacker News
[Correction : d’après la réponse du développeur de Cursor ci-dessous, il semble que Cursor ne l’ait pas approuvé] On dirait qu’il existe chez Cursor un registre NPM privé contenant ces packages, et qu’en raison du fonctionnement de NPM, il est facile pour un attaquant de tromper le système pour qu’il récupère le même package depuis le registre public
Un employé de Snyk a probablement trouvé, ou soupçonné, qu’une partie du build de Cursor était mal configurée de cette manière, puis a publié un package comme preuve de concept. Vu que la description du package était « for Cursor », j’ai cru qu’il avait été engagé pour cela
Si c’est le cas, il n’y a pas grand-chose à en tirer ; si l’essentiel était de montrer une mauvaise configuration contournant le registre privé, le chercheur en sécurité n’aurait pas pu utiliser un registre NPM privé pour sa preuve de concept
En particulier, beaucoup de proxys choisissent le registre public plutôt que le privé si la version la plus récente du package y est plus élevée : https://snyk.io/blog/detect-prevent-dependency-confusion-att...
Nous les traitons de la même manière que VS Code : https://github.com/microsoft/vscode/tree/main/extensions
Nous n’avons pas engagé Snyk et, après avoir découvert cette affaire, nous les avons contactés et avons reçu des excuses. Nous n’avons pas eu confirmation exacte de ce qu’ils essayaient de faire, mais l’explication selon laquelle quelqu’un soupçonnait une vulnérabilité de confusion de dépendances paraît plausible. Cela dit, faire en sorte que des variables d’environnement soient effectivement envoyées depuis le NPM public me paraît assez irresponsable
env, serait un gros problème pour la plupart des gensFait intéressant, un cofondateur de Snyk a lancé un concurrent de Cursor
https://www.tessl.io/ https://techcrunch.com/2024/11/14/tessl-raises-125m-at-at-50...
J’espère qu’il n’y a pas eu de manœuvre malhonnête
Il semble qu’il faille désormais sérieusement faire tout développement dans une machine virtuelle. Une VM par projet. Il y a trop de façons subtiles de se tromper sans s’en rendre compte et de ruiner sa sécurité. La seule consolation, c’est d’être un inconnu sans secrets ni biens à voler.
On fait aveuglément confiance à beaucoup trop de code : IDE, plugins, utilitaires de développement, bibliothèques de langage, paquets du système d’exploitation, etc.
Dans un endroit où j’ai travaillé il y a quelques années, les navigateurs web et les outils de développement étaient interdits sur les ordinateurs portables. Si l’on avait besoin d’un navigateur, il fallait passer par Citrix ; si l’on devait coder, il fallait utiliser une VDI ou exécuter les outils dans une VM.
À l’époque, cette approche me paraissait presque complètement folle, mais je la comprends de plus en plus.
NVIDIA verrouille les fonctions de GPU virtualisé derrière ses cartes d’entreprise, ce qui oblige à dépendre d’une traduction de commandes inefficace.
On peut supporter presque toute autre surcharge liée aux VM, mais une GUI saccadée et peu réactive a un impact ergonomique plus mauvais qu’on ne l’imagine, et tire bizarrement les autres performances vers le bas.
Si ce problème était résolu, ne serait-ce que pour virtualiser Linux sur Linux, l’option consistant à tout virtualiser deviendrait beaucoup plus réaliste.
Plus précisément, je suis en train de déplacer mon environnement de développement Go et Zig d’un ancien Mac vers Asahi Linux sur M1, et je galère déjà à trouver des remplaçants à TrueCrypt et Little Snitch. Ces outils de VM prennent-ils en charge les VM chiffrées et les règles de pare-feu ? Vagrant a été mentionné ici, et semble pouvoir résoudre une partie de l’isolation réseau, mais que recommander d’autre ?
Une VM peut me protéger, mais elle ne protège pas les utilisateurs du logiciel que je crée. Comment pourrais-je envoyer à des clients un produit que je ne peux manipuler qu’en combinaison de protection, et m’attendre à ce qu’ils l’utilisent en sécurité sans protection ?
Ce n’est pas l’environnement que je veux.
La solution actuelle consiste à choisir ses dépendances avec une extrême exigence. Plus précisément, je pense qu’il ne faut pas faire confiance à des projets ou à des entreprises, mais uniquement à des personnes. Ce n’est pas facile, mais pour l’instant je ne vois pas de meilleure alternative.
Je note les montages bind du système de fichiers dans un simple fichier dot par projet, et quand j’ouvre un nouveau terminal pendant le travail, il est automatiquement isolé selon ce fichier dot. La charge cognitive est très faible et l’intégration est presque transparente. J’imagine que beaucoup de développeurs ont des scripts similaires. J’ai déjà cherché ce genre de projet sans en trouver ; je ne sais pas si c’est trop simple pour mériter d’être un projet, ou si je ne sais simplement pas comment les autres appellent ça. J’aimerais avoir des références utiles.
Je ne limite pas l’accès réseau. J’ai expérimenté l’enregistrement de tout le trafic et la configuration automatique d’un proxy man-in-the-middle, mais ce n’était pas assez pratique pour un usage quotidien. Bien sûr, la surface d’attaque du noyau reste présente. Cela dit, ma principale inquiétude est que des fichiers soient lus ou détruits.
La partie de l’article avec laquelle je ne suis pas d’accord est celle qui dit : « mieux vaut ne pas installer aveuglément des paquets NPM, et il existe des signaux permettant de voir si un paquet est suspect. Ces paquets ne contiennent que deux fichiers,
package.jsonetindex.jsoumain.js, ce qui constitue l’un des indicateurs pour juger s’ils sont légitimes ».Cela peut fonctionner dans une certaine mesure pour les paquets de premier niveau, mais passer en revue toutes les dépendances transitives est presque impossible.
Si vous importez un paquet avec 400 dépendances, comment pourriez-vous examiner correctement ne serait-ce que 10 % de cette surface ? https://gist.github.com/anvaka/8e8fa57c7ee1350e3491#top-1000...
id_rsa.Snyk est aussi une entreprise qui ne fait pas de rotation propre de ses clés publiques, mais les change simplement sans préavis : https://github.com/snyk/cli/pull/5649
Quand un projet migre vers un hébergement de dépôt autre que GitHub, il est marqué comme « abandoned », et même si de nouvelles releases sortent sur npm/PyPI, il reste considéré comme abandonné.
Je ne pense pas que leurs compétences soient à la hauteur de leur réputation.
Et un commercial de Snyk m’a insulté par e-mail. Apparemment, ne pas être intéressé par l’achat du produit signifie que je suis un développeur incompétent, condamné à n’utiliser que des logiciels pleins de vulnérabilités.
Ça ressemble à un logiciel complètement à l’envers, que les entreprises achètent parce que les assureurs leur demandent de cocher des cases dans une checklist de sécurité.
Codeberg a l’air intéressant, et si l’on peut assumer la maintenance, une option autohébergée comme Forejo semble également bonne.
Je n’avais pas beaucoup entendu parler de Snyk, à part qu’ils avaient un ego assez marqué, mais c’est un point de vue assez intéressant.
Sans davantage de contexte, cela ne donne pas non plus une bonne image de Snyk. Cela signifie soit qu’un employé a testé le service de son entreprise en environnement réel via NPM, soit qu’il manquait des contrôles et procédures pour éviter d’utiliser des ressources publiques lors d’un audit légitime de Cursor.
Cela ressemble à un audit white hat mené par Snyk.
oastify.cométant le serveur par défaut de Burp Collaborator, c’est probablement ce qui a été détecté.Ils auraient dû utiliser un registre npm privé pour le test, et ce n’est pas difficile de le surcharger en local. Ils auraient aussi dû utiliser leur propre serveur Collaborator.
console.log, faire échouernpm install, ou une méthode qui n’extrait pas la charge utile aurait largement suffi.On dirait que NPM crée des emplois pour l’industrie de la sécurité. C’est un bazar impossible à corriger, et j’espère que des concurrents comme JSR mettront suffisamment de pression sur l’organisation.
Au contraire, il est très probable que des réglementations comme DORA et NSIS exigent de plus en plus l’audit des paquets tiers. Cela forcera les secteurs critiques à changer leurs pratiques de développement. Et je pense aussi qu’à l’ère des LLM, l’usage de paquets externes diminuera nettement. Pourquoi importer un paquet externe pour faire quelque chose comme générer une spécification OpenAPI ? Un LLM peut écrire le script CLI nécessaire avec une ou deux heures de configuration. De même, même si l’on n’utilise pas directement un LLM pour générer automatiquement les parties ennuyeuses du code, on peut lui faire créer des outils CLI qui s’en chargent. Ainsi, on n’a pas à dépendre de facteurs externes ; ces outils CLI seront presque certainement du code cowboy mal fichu, mais on peut affiner l’outil pour obtenir la sortie voulue.
Quand on regarde des langages comme Go, qui mettent dans les paquets standard ce dont on a besoin, on entrevoit un monde où l’on peut faire énormément de choses très facilement avec la seule bibliothèque standard.
C’est un peu hors sujet, mais quelqu’un a-t-il déjà reçu un SBOM correct pour les propres outils et services de Snyk ? Je demande parce qu’ils essaient de vendre à notre entreprise une solution pour produire des SBOM.
Je ne pense pas que je l’installerais même s’ils me payaient. L’Unit 8200 continue de produire des fondateurs et de les financer ; ça donne l’impression d’un mécanisme où, comme la NSA, ils ont déjà un pied dans la porte.
Snyk Research Labs contribue régulièrement à la communauté par des tests et des recherches sur des paquets logiciels courants. Cette recherche sur Cursor n’avait pas d’intention malveillante, et les paquets incluaient les coordonnées de Snyk Research Labs et du chercheur. Nous examinions très spécifiquement la confusion de dépendances dans certaines extensions VS Code, et ces paquets n’étaient pas destinés à être installés directement par des développeurs.
Snyk suit une politique de divulgation responsable. Personne n’a récupéré ces paquets, mais si quelqu’un l’avait fait, nous aurions immédiatement pris des mesures de suivi.
Comme réponse, cela ressemble à promettre d’envoyer une lettre d’excuses aux funérailles de la personne touchée. Même avec de « bonnes intentions », si vous compromettez des identifiants, la personne est déjà compromise et doit réagir exactement comme si elle avait été attaquée par un acteur malveillant.
C’est si proche d’un acte malveillant qu’il est difficile de sentir la différence.
Ajoutons que tout le monde devrait aussi se rappeler qu’une partie prenante de Snyk est en train de lancer un produit concurrent de Cursor. Cela rend beaucoup plus difficile de présumer la bonne foi.
env.En plus, compte tenu du conflit d’intérêts avec un produit concurrent de Cursor, ils auraient dû être encore plus prudents. La prise de décision comme la réaction sont désastreuses.