Claude Code su Cursor: l'estensione con la backdoor SSH

Illustrazione synthwave: un pacco con l'etichetta giusta su un nastro al neon, dal cui interno esce un tunnel rosso verso un server lontano
Nome giusto, editore giusto, versione giusta. Contenuto no.
data: · 10 min
autore: Matteo

Le versioni 2.1.312 e 2.1.313 dell’estensione Claude Code distribuite dal marketplace di Cursor contenevano una backdoor SSH. Il 29 ottobre sono rimaste online per circa undici ore e secondo Cursor hanno raggiunto al massimo 5.000 utenti. Non sono state sviluppate da Anthropic: qualcuno ha preso l’estensione vera e ha aggiunto 66 righe in cima al suo file principale.

La parte che mi ha colpito è questa: se la installavi, sul tuo schermo non succedeva niente di strano. Claude Code funzionava normalmente, perché era Claude Code. In più c’era un ospite.

È come ricevere un pacco dal corriere solito, con il mittente giusto e l’etichetta giusta. Solo che qualcuno, in magazzino, l’ha aperto e l’ha richiuso con cura.

Se hai fretta, i comandi per controllare il tuo computer sono qui sotto.

Cosa è successo, e cosa no

Prima di tutto la cronologia, con gli orari italiani:

  • 29 ottobre, 10:27: il pacchetto manomesso compare nel marketplace di Cursor.
  • 29 ottobre, 21:35: Cursor lo rimuove, poi spegne l’intero marketplace per precauzione, controlla gli accessi, cambia le proprie chiavi e lo ricostruisce.
  • 30 ottobre, 01:12: esce la 2.1.314 su npm, seguita da Open VSX e dal marketplace di Microsoft.
  • 30 ottobre, mattina: arrivano i primi avvisi pubblici e l’avviso di sicurezza di Cursor. Lo stesso giorno Phorion e Microsoft pubblicano le loro analisi.
  • 30 ottobre, 19:30: Cursor aggiorna l’avviso, e tra le versioni colpite ora c’è anche la 2.1.312.

Nelle prime ore è girata una versione diversa, che dava la colpa a Open VSX (ne resta traccia persino nell’indirizzo dell’articolo di Phorion). Oggi il quadro è più preciso, e vale la pena dirlo chiaramente perché in rete si legge ancora di tutto:

CanaleStato
Marketplace di Cursormanomesso (2.1.312 e 2.1.313)
Open VSXnon risulta colpito: la 2.1.313 non è in elenco
Marketplace di Microsoftnon colpito, lo conferma Microsoft
npm (@anthropic-ai/claude-code, la CLI)non risulta colpito

OpenSourceMalware, che ha analizzato il pacchetto, ha corretto il proprio articolo in questo senso. Ho guardato anche io: su npm si passa dalla 2.1.312 alla 2.1.314 e la 2.1.313 non compare nemmeno nella cronologia del pacchetto; lo stesso salto c’è nel changelog ufficiale, che non fa alcun cenno all’incidente.

Quello che non si sa è altrettanto importante: come il pacchetto sia entrato nel marketplace di Cursor e chi ci sia dietro. Cursor ha fatto sapere ai ricercatori che l’estensione ha subito “some form of compromise”, senza spiegare quale. Anthropic dice che un attaccante ha usato un accesso al marketplace di Cursor per pubblicare il pacchetto, e a Microsoft ha confermato che i suoi sistemi non sono stati violati. Di che accesso si tratti, però, nessuno lo ha ancora spiegato.

Cosa faceva quel codice

Le 66 righe sono state messe prima del codice vero di extension.js. Il resto del pacchetto, secondo OpenSourceMalware, era identico all’originale. Non servivano script di installazione, e secondo Phorion nemmeno un clic: bastava che l’editor caricasse il file. Gli errori venivano ignorati, così l’estensione continuava a sembrare sana.

In ordine:

  1. Si apriva una porta. Aggiungeva a ~/.ssh/authorized_keys una chiave dell’attaccante con il commento svc-telemetry e provava ad attivare il servizio SSH.
  2. Scavava un tunnel. Apriva una connessione SSH inversa verso 134.209.82.225, così da rendere raggiungibile il tuo computer anche dietro un router o un firewall aziendale. Se cadeva, riprovava ogni 60 secondi.
  3. Si metteva comodo. Installava la persistenza: un LaunchAgent su Mac, un’attività pianificata su Windows, una riga @reboot nel crontab su Linux. Da quel momento non aveva più bisogno dell’estensione, né dell’editor aperto.
  4. Faceva l’inventario. Mandava all’attaccante nome del computer, utente, sistema operativo, cartelle, email di Git, IP pubblico e fino a 40 nomi di variabili d’ambiente contenenti parole come KEY, TOKEN, SECRET, AWS.

Sui nomi mi fermo un attimo. Il malware non inviava i valori, solo i nomi. Sembra quasi un gesto di cortesia, invece è un lavoro di selezione: sapere che su una macchina c’è AWS_SECRET_ACCESS_KEY serve a decidere in quali computer vale la pena entrare, tra migliaia. I valori si prendono dopo, con calma, passando dal tunnel.

Anche i nomi scelti sono pensati per non farsi notare: svc-telemetry sembra un servizio di telemetria, com.apple.sysmond sembra roba di Apple, SysMon sembra un tool di Microsoft. Chi dà un’occhiata veloce alla lista dei processi passa oltre.

Un malware scritto un po’ male (che non è una consolazione)

La cosa buffa è che il codice ha diversi bug. Su Mac, per esempio, il controllo su SSH viene eseguito senza privilegi di amministratore: il comando risponde con un errore ma con codice di uscita 0, lo script lo interpreta come “SSH già attivo” e non prova nemmeno ad accenderlo. Su Windows c’è un percorso che usa /bin/sh. Su Linux, sempre secondo Phorion, il controllo del crontab può perfino cancellare le attività pianificate che avevi già.

Cursor stessa scrive che, per questi errori e senza diritti di amministratore, il tunnel di solito non parte. Non prenderei però questa frase come un “tutto bene”, per due motivi:

  • la chiave e la persistenza vengono installate lo stesso, e restano lì ad aspettare;
  • chi ha già attivato il login remoto sul proprio Mac, o sshd su Linux, parte con il lavoro già fatto dall’attaccante. E tra gli sviluppatori non siamo pochi.

C’è anche una buona notizia: Cursor dice di aver fatto spegnere il server dell’attaccante con l’aiuto del provider. Il tunnel oggi non dovrebbe portare da nessuna parte, ma una chiave rimasta in authorized_keys è comunque una porta aperta che non hai deciso di aprire.

Come controllare il tuo computer

Se in quelle undici ore usavi Cursor con l’estensione Claude Code, controlla anche se ora sei già alla 2.1.314: l’aggiornamento sostituisce l’estensione, non ripulisce quello che ha lasciato la versione precedente.

Su Mac e Linux:

# La chiave dell'attaccante
grep -s svc-telemetry ~/.ssh/authorized_keys

# I file della persistenza (il plist esiste solo su Mac)
ls -la ~/.config/.smt ~/.config/.smtk ~/Library/LaunchAgents/com.apple.sysmond.plist 2>/dev/null

# Le versioni colpite ancora installate (una 2.1.312 di prima del 29 ottobre può essere pulita)
ls -ld ~/.cursor/extensions/anthropic.claude-code-2.1.31[23]* 2>/dev/null

# Tunnel attivi
ps aux | grep -E '[a]utossh|[s]sh .*-R'

# Su Linux: righe @reboot che non riconosci
crontab -l 2>/dev/null | grep '@reboot'

Su Windows, in PowerShell:

Select-String svc-telemetry "$HOME\.ssh\authorized_keys", "C:\ProgramData\ssh\administrators_authorized_keys" -ErrorAction SilentlyContinue
schtasks /query /tn SysMon
Test-Path "$HOME\.config\smt.cmd"
Test-Path "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\sysmon.cmd"

Il controllo proposto da Cursor guarda solo la chiave in authorized_keys. Io controllerei tutto l’elenco: non costa niente. Se nessuno di questi comandi trova qualcosa, e il 29 ottobre non hai installato o aggiornato l’estensione da Cursor, puoi stare tranquillo.

Se trovi qualcosa

Niente panico, ma nemmeno “disinstallo e via”: rimuovere l’estensione non basta, perché gli script di persistenza continuano a girare da soli. Nell’ordine:

  1. Isola il computer dalla rete, se è una macchina di lavoro avvisa subito chi si occupa di sicurezza e non cancellare le prove prima di averle salvate.
  2. Usa gli script di Cursor, remediate-macos.sh (da utente normale, non da root) e remediate-windows.ps1 (da amministratore), che trovi nell’avviso ufficiale. Tolgono estensione, persistenza, tunnel e chiave. Su Linux, per cui non c’è uno script, si fa a mano: via processi, file .smt e .smtk, riga nel crontab e chiave.
  3. Controlla i log di SSH: un accesso entrato dal tunnel appare come proveniente da 127.0.0.1 o ::1, con la chiave svc-telemetry.
  4. Cambia le credenziali raggiungibili da quell’utente, da un altro computer: chiavi cloud, token GitHub e npm, chiavi SSH, sessioni attive. Parti da quelle i cui nomi finivano nell’inventario.
  5. Valuta di reinstallare la macchina. Se c’è il minimo segno di un accesso, è l’unico modo per dormire tranquilli.

Gli indicatori da cercare, anche sui computer aziendali:

TipoValore
Estensioneanthropic.claude-code 2.1.312 e 2.1.313, darwin-arm64 e win32-x64 (gli hash dei pacchetti sono nell’avviso di Cursor)
extension.js manomessoSHA-256 ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15
Server134[.]209[.]82[.]225, porte 22 e 8099 (POST /beacon)
Chiave dell’attaccanteSHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk, commento svc-telemetry
Chiave del tunnelSHA256:KOAU57+ZG6u3MG4WwzPzPX2O5YEe9qdOC1Bl+6MVyDQ, commento svc-telemetry-tun
File su Mac~/.config/.smt, ~/.config/.smtk, $TMPDIR/.stk_*, ~/Library/LaunchAgents/com.apple.sysmond.plist
Windowsattività SysMon, ~/.config/smt.cmd, ~/.config/smtk, sysmon.cmd in Esecuzione automatica
Comandissh -N -R '*:0:localhost:22', autossh -M 0

Il problema vero: il nome non è una garanzia

Di attacchi alle estensioni ne abbiamo già visti, da GlassWorm in poi, e la catena di fornitura del software ci ha già fatto spaventare con Axios. Questa volta però c’è una differenza che dà da pensare: nessuno ha dovuto convincerti a installare niente. Niente nome storpiato, niente pagina clonata, niente email di phishing. Avevi scelto lo strumento giusto dell’azienda giusta, lo stesso che molti di noi tengono aperto tutto il giorno.

Qui entrano in gioco tre cose che diamo troppo per scontate.

Anthropic.claude-code è solo un’etichetta nel catalogo di chi te la serve. I fork di VS Code come Cursor non attingono al marketplace di Microsoft: hanno il loro canale, con i loro controlli e le loro chiavi. Lo stesso nome può quindi passare da filiere completamente diverse, e tu dall’editor non vedi la differenza. Quando dici “mi fido di Anthropic”, in realtà ti stai fidando anche di chi sta in mezzo. È la stessa conclusione a cui ero arrivato qualche giorno fa parlando dei pesi di DeepSeek: il rischio più concreto non è tanto nell’originale, quanto nella copia che ti arriva da qualcun altro.

Un’estensione non è un’app in una sandbox. Gira con i tuoi stessi permessi: può leggere la tua home, scrivere in ~/.ssh, avviare processi. E un assistente di programmazione lo installiamo proprio su quella macchina lì, quella con le chiavi cloud, i token e l’accesso ai repository. Per un attaccante è difficile immaginare un posto migliore.

L’aggiornamento automatico lavora per chi attacca. Di solito è una benedizione, e dopo PHP2Shell sarei l’ultimo a dirti di smettere di aggiornare. Ma quando il pacchetto avvelenato arriva dal canale ufficiale, l’aggiornamento automatico è esattamente il meccanismo che te lo porta in casa mentre bevi il caffè.

Nessuno di questi tre punti ha una soluzione perfetta, però si può fare qualcosa:

  • Se lavori in azienda, decidi da quali marketplace si può installare e tieni un elenco delle estensioni ammesse, compresi gli strumenti di IA.
  • Tieni i segreti fuori dalle variabili d’ambiente quando puoi, e fuori dalla portata del computer su cui sviluppi. Un gestore di segreti e credenziali a breve scadenza riducono parecchio i danni.
  • Sui progetti delicati lavora in un dev container o in una macchina virtuale: un’estensione lì dentro vede molto meno di quanto vede sul tuo portatile.
  • Tieni d’occhio authorized_keys e la persistenza. Su Mac uno strumento come BlockBlock o il tuo EDR ti avvisano quando compare un nuovo LaunchAgent. Una chiave SSH nuova che non hai messo tu non è mai una buona notizia.
  • Valuta di disattivare l’aggiornamento automatico delle estensioni ("extensions.autoUpdate": false) sulle macchine più sensibili. È un compromesso: ti proteggi dalle prime ore di un pacchetto avvelenato, ma poi gli aggiornamenti di sicurezza tocca farli a mano. E se non lo farai, è peggio di prima.

In sintesi

  • Le 2.1.312 e 2.1.313 di Anthropic.claude-code nel marketplace di Cursor contenevano una backdoor SSH: online il 29 ottobre dalle 10:27 alle 21:35 italiane, al massimo 5.000 utenti.
  • Open VSX, marketplace di Microsoft e CLI su npm non risultano colpiti. Anthropic dice che i suoi sistemi non sono stati violati. Non è ancora noto che accesso abbia usato l’attaccante, né chi sia.
  • Installava una chiave dell’attaccante e la persistenza, e tentava un tunnel inverso. I bug fanno spesso fallire il tunnel, non il resto.
  • Aggiornare alla 2.1.314 o disinstallare non ripulisce il computer: vanno controllati chiave, file e processi.
  • Se trovi qualcosa: isola la macchina, usa gli script di Cursor, cambia le credenziali da un altro computer e valuta una reinstallazione.

Fonti: Cursor, avviso di sicurezza, Microsoft, Phorion, BankInfoSecurity, OpenSourceMalware, Rescana, versioni su Open VSX, pacchetto npm, changelog di Claude Code.

Copiato