El jueves 29 de octubre, durante unas once horas, la extensión de Claude Code para VS Code que se distribuye en el marketplace de Cursor llevaba una puerta trasera. Cursor ha publicado un aviso de seguridad y la empresa de seguridad Phorion un análisis detallado del código malicioso. Claude Code es una herramienta que uso a diario, así que he querido entender bien qué pasó y cómo comprobar si te afecta.
Qué pasó
Según Cursor, entre las 2:27 y las 13:35 (hora del Pacífico) del 29 de octubre se publicaron en su marketplace dos versiones modificadas de la extensión Anthropic.claude-code, la 2.1.312 y la 2.1.313, para macOS y Windows. Cursor dice que esas versiones no las desarrolló Anthropic, pero según Kevin Beaumont y Phorion, se distribuyeron a través de la cuenta oficial de Anthropic en ese marketplace. Según Ars Technica, Cursor calcula que afectó como mucho a 5.000 usuarios, y Anthropic publicó la 2.1.314 unas horas después.
Lo que todavía no se sabe es cómo consiguieron los atacantes acceso a esa cuenta. Ni Cursor ni Anthropic lo han explicado, y cuando Ars publicó su artículo Anthropic aún no había avisado públicamente a sus clientes.
El detalle que lo hace especialmente delicado: en Cursor las extensiones se actualizan solas por defecto. No hacía falta instalar nada nuevo; bastaba con tener la extensión y abrir el editor ese día.
Cómo funciona el código malicioso
Phorion explica que el atacante añadió al principio del extension.js minificado una función que se ejecuta en cuanto Node carga el fichero, antes incluso de que la extensión se active. El resto del paquete es la extensión normal, así que a simple vista todo funcionaba igual. A partir de ahí hace cuatro cosas:
| Fase | Qué hace |
|---|---|
| 1. Acceso SSH | Añade una clave pública del atacante, con el comentario svc-telemetry, a ~/.ssh/authorized_keys e intenta activar el servidor SSH local |
| 2. Túnel inverso | Abre una conexión SSH saliente al servidor del atacante con -R *:0:localhost:22, para que este pueda entrar al puerto 22 de la víctima a través del túnel |
| 3. Persistencia | En macOS, un LaunchAgent disfrazado como com.apple.sysmond.plist; en Windows, una tarea programada o un script en el inicio. Reintenta el túnel cada 60 segundos, aunque se cierre el editor |
| 4. Reconocimiento | Envía al atacante el nombre del equipo, usuario, sistema, IP pública, el email de Git y hasta 40 nombres de variables de entorno que contengan KEY, TOKEN, SECRET, PASS, AWS o GCP |
flowchart LR
A["Extensión actualizada sola"] --> B["Clave en authorized_keys"]
B --> C["Túnel SSH inverso"]
C --> D["Servidor del atacante"]
D -->|"entra por el túnel"| E["SSH local de la víctima"]Lo del punto 4 me parece lo más revelador. No roba los valores de las variables, sólo sus nombres, pero eso basta para hacer inventario: saber qué máquinas tienen credenciales de AWS, de GCP o tokens de API, y decidir a cuáles merece la pena entrar después por el túnel.
Los fallos del propio malware
Aquí viene la parte casi cómica. El código tiene errores que en muchos casos impidieron que la puerta trasera funcionara del todo:
- En macOS comprueba si el acceso remoto está apagado con
systemsetup -getremotelogin, pero sin permisos de administrador ese comando no devuelve “Off”, sino un mensaje de error, y además termina con código 0. Como el script sólo intenta activar SSH si la salida contiene “Off”, nunca lo intenta. La clave y la persistencia quedan instaladas, pero si el Mac no tenía ya SSH activado, el túnel llega a un puerto 22 cerrado. - En Windows pasa el comando de PowerShell por una función que usa
/bin/sh, que no existe en una instalación normal.
Cursor resume que, salvo que el editor se ejecutara con privilegios de administrador, el paso de activar SSH fallaba. Además, trabajó con el proveedor que alojaba el servidor del atacante para desconectarlo. Pero ni Cursor ni Phorion lo presentan como motivo para relajarse: la clave, la persistencia y el envío de datos sí funcionaron, y si alguien tenía SSH activado o lo activa más adelante, la puerta está esperando.
Cómo comprobar si te afecta
Si usas Cursor con la extensión de Claude Code en macOS o Windows y el editor la actualizó ese día, Cursor propone comprobar si está la clave del atacante. En macOS:
grep -qs svc-telemetry ~/.ssh/authorized_keys && echo "svc-telemetry key found" || echo "No key found; machine not impacted"
Y conviene mirar también los otros rastros que describe Phorion:
ls -la ~/Library/LaunchAgents/com.apple.sysmond.plist ~/.config/.smt ~/.config/.smtk 2>/dev/null
pgrep -fl "localhost:22"
Si aparece algo, desinstalar la extensión no basta, porque la persistencia funciona por su cuenta. Cursor ha publicado scripts de limpieza para macOS y Windows, y los pasos recomendados son: aislar la máquina, quitar la clave, el LaunchAgent o la tarea programada y los procesos del túnel, valorar si reinstalar el equipo y rotar desde otra máquina las credenciales a las que tuviera acceso ese usuario, empezando por las que coincidan con esos nombres de variables.
Lo que me llevo
Hace un par de semanas escribía sobre lo poco que comprueban los gestores de paquetes la integridad del código. Este caso es otra cara del mismo problema: aquí no hubo un paquete falso con un nombre parecido, sino una versión maliciosa publicada desde la cuenta legítima, en un canal que se actualiza solo. Ninguna comprobación de firma del lado del usuario lo habría detectado si la cuenta que firma es la buena.
Y las extensiones del editor son un objetivo muy goloso. Se ejecutan con los permisos del usuario, ven el código fuente y los ficheros del proyecto, y en los equipos de desarrollo suele haber justo lo que busca un atacante: claves SSH, tokens y credenciales de la nube en variables de entorno. Un par de medidas que me parecen sensatas a raíz de esto: desactivar la actualización automática de extensiones en las máquinas con acceso a infraestructura importante, y no dejar credenciales de producción como variables de entorno permanentes en el portátil de trabajo.
Queda pendiente la pregunta principal, cómo se comprometió la cuenta de Anthropic en el marketplace de Cursor. Hasta que una de las dos empresas lo explique, no sabremos si fue un fallo de una de ellas, de las dos o del propio proceso de publicación.
Fuente: Official Claude Code Extension Compromise: Security Advisory, Calum Hall, Phorion, y Security notice: malicious version of Anthropic.claude-code, Cursor. Más contexto en Ars Technica.




