Nota do autor: uma análise do plugin malicioso Claude Code no marketplace de extensões do Cursor. Veja como o carregador de 66 linhas é acionado, como dois conjuntos de chaves SSH atuam junto com um túnel reverso, o que foi confirmado e como investigar possíveis comprometimentos.
Em 29 de outubro de 2026, uma extensão anthropic.claude-code adulterada apareceu no marketplace de extensões VS Code do Cursor. Pesquisadores encontraram um carregador JavaScript de cerca de 66 linhas no início do arquivo extension.js. Basta que o editor carregue esse módulo para que ele tente instalar uma porta dos fundos SSH persistente no computador do desenvolvedor.
Isso não é boato. O comunicado oficial de segurança do Cursor, Microsoft Security Research, Phorion, StepSecurity, OpenSourceMalware e Expel já publicaram análises. A Expel também investigou 4 incidentes reais envolvendo clientes. Até 1º de novembro, a StepSecurity acrescentou uma comparação precisa das amostras, deixando o cenário técnico praticamente completo.
O essencial: entenda em 3 minutos o que essas 66 linhas de código fazem, por que o usuário não precisa executar nenhum comando perigoso e por que desinstalar o plugin ainda não garante que tudo esteja seguro.

Resumo do caso da backdoor em 66 linhas de JavaScript
Vamos começar delimitando o incidente. Trata-se de um ataque à cadeia de suprimentos de ferramentas de desenvolvimento, com origem no canal de distribuição de extensões do Cursor. O modelo Claude em si não foi comprometido, e não há evidências de invasão aos sistemas internos da Anthropic. A Microsoft confirmou que tanto o Microsoft Visual Studio Marketplace quanto o pacote oficial do npm @anthropic-ai/claude-code não foram afetados.
| Item | Detalhes |
|---|---|
| Data do incidente | 29 de outubro de 2026 |
| Canal de distribuição | Cursor VS Code Extension Marketplace |
| Identidade usada indevidamente | anthropic.claude-code (a Anthropic não criou nem publicou essas versões) |
| Versões maliciosas | 2.1.312, 2.1.313 |
| Plataformas dos pacotes maliciosos listadas oficialmente | Windows x64, macOS ARM64 |
| Tempo de distribuição pública | Cerca de 11 horas e 8 minutos |
| Limite máximo de usuários afetados divulgado oficialmente | 5.000 pessoas (é um limite máximo, não significa que 5.000 máquinas foram comprometidas) |
| Código injetado | Carregador inserido nas linhas 1–66 de extension.js |
| Versão de correção posterior | A Anthropic lançou a versão 2.1.314 |
Linha do tempo do caso da backdoor em 66 linhas de JavaScript
Todos os horários abaixo estão no fuso de Pequim. É importante distinguir dois momentos: quando o pacote estava disponível para download e quando um pacote já baixado foi executado de fato. O segundo pode ocorrer bem mais tarde.
| Horário de Pequim | Evento |
|---|---|
| 29 de outubro, 17h27 | A extensão maliciosa começa a ficar disponível para download no marketplace do Cursor |
| 30 de outubro, 04h35 | O Cursor interrompe a distribuição, encerrando a janela de exposição |
| 30 de outubro | O Cursor publica um comunicado de segurança; Phorion, OpenSourceMalware e Microsoft publicam análises em seguida |
| 30 de outubro, 12h45 | A Expel observa a primeira execução do código malicioso em um Mac de um cliente, cerca de 8 horas após a remoção da extensão |
| 31 de outubro, 02h30 | O Cursor atualiza o comunicado, inclui a versão 2.1.312 entre as afetadas e revisa os indicadores de comprometimento |
| 1º de novembro | A StepSecurity conclui uma comparação estática detalhada com base em amostras do MalwareBazaar |
Após a divulgação do incidente, o Cursor removeu as versões maliciosas e desativou temporariamente todo o marketplace de extensões. Também auditou os registros de acesso, substituiu as chaves, reconstruiu o marketplace e trabalhou com provedores de nuvem para desativar os servidores do atacante. Até o momento, as informações públicas não explicam como o atacante obteve permissão para publicar compilações no marketplace do Cursor. Antes da conclusão da investigação, não se deve afirmar que uma conta da Anthropic foi roubada ou que havia uma vulnerabilidade específica no Cursor.
Como 66 linhas de JavaScript ativaram um backdoor na extensão Claude Code
É fácil interpretar “66 linhas” como se a extensão inteira tivesse apenas esse tamanho. Na verdade, o extension.js legítimo é um arquivo compactado de grandes dimensões. O atacante inseriu um carregador malicioso apenas no início do arquivo, da linha 1 à linha 66.
Esse código usa uma expressão de função imediatamente invocada (IIFE). Ele não precisa esperar que o usuário envie uma mensagem ao Claude nem depende de qualquer outra condição. Quando o Cursor carrega o arquivo principal da extensão no ambiente Node.js, essa lógica é executada antes do código legítimo.
Uma alteração de 7.386 bytes: comparação detalhada das amostras
Em 1º de novembro, a StepSecurity obteve a amostra no MalwareBazaar, verificou seu SHA-256 e fez uma comparação estática. O resultado mostrou que o atacante não precisou reescrever a extensão.
| Item comparado | Valor |
|---|---|
extension.js legítimo |
3.685.536 bytes |
extension.js malicioso |
3.692.922 bytes |
| Carregador adicionado | 7.386 bytes |
| Proporção do conteúdo adicionado | Cerca de 0,20% |
| Número de versão no manifesto externo | 2.1.313 |
| Versão identificada no código da extensão | 2.1.312 |
As duas últimas linhas também merecem atenção. O atacante empacotou novamente a compilação legítima 2.1.312, alterando apenas as informações de versão externas. O número de versão exibido nem sempre corresponde à origem real do código, então não é confiável fazer uma avaliação apenas com base nele. Em outra parte do texto da StepSecurity, há uma inconsistência aritmética na referência ao “número de bytes restantes”. Ao citar os dados, use os tamanhos totais e a diferença apresentados na tabela acima.
Por que o usuário não precisa executar nenhum comando perigoso
Esse ataque não tem relação com injeção de comandos. Os pesquisadores confirmaram que todo o processo apresenta as seguintes características:
- O usuário não precisa iniciar uma conversa com o Claude, e o modelo não precisa concordar em executar instruções de alto risco;
- O ataque não depende de um comando malicioso nem de scripts do ciclo de vida de instalação do npm;
- O ataque inicial não precisa baixar arquivos executáveis adicionais.
O verdadeiro risco vem das permissões de execução que uma extensão da IDE tem no computador do desenvolvedor. Como a extensão roda no Node.js, ela pode acessar o sistema de arquivos, ler informações do sistema, criar subprocessos, executar comandos do sistema, fazer requisições HTTP e usar as ferramentas SSH locais.

As duas chaves por trás do backdoor SSH no plug-in do Claude Code
O aspecto mais engenhoso desse código de 66 linhas é que o backdoor se apoia inteiramente no SSH já disponível no sistema. O atacante não precisa desenvolver um programa próprio de controle remoto: basta combinar duas identidades SSH com funções diferentes.
A primeira é a chave autorizada no computador da vítima. O programa malicioso adiciona a chave pública do atacante ao arquivo authorized_keys do usuário, com o identificador svc-telemetry. Se o serviço SSH local estiver ativo, quem tiver a chave privada correspondente poderá tentar fazer login como esse usuário.
A segunda é a chave de identidade usada para conectar ao servidor externo. O programa malicioso salva separadamente uma chave privada para que o dispositivo da vítima possa se conectar ao servidor do atacante. Essa chave não é uma chave privada que já pertencia ao usuário. Em resumo, a primeira resolve a questão de “o atacante consegue se autenticar?”, enquanto a segunda resolve “o computador da vítima consegue iniciar a conexão?”.
Por que um túnel SSH reverso merece atenção
Muitas redes corporativas e domésticas bloqueiam o acesso direto da internet a computadores pessoais, mas geralmente não restringem conexões iniciadas por esses computadores. O túnel reverso aproveita justamente isso: o computador da vítima se conecta primeiro ao servidor do atacante, que encaminha as solicitações de acesso de volta à porta local 22.
Mas uma conexão estabelecida não significa que o login foi bem-sucedido. Isso depende de o SSH local estar em execução, da configuração de autenticação estar ativa e das configurações de encaminhamento no servidor do atacante. Se o SSH local não estiver iniciado, o túnel ainda poderá ser estabelecido, mas o login remoto não será concluído.
Técnicas de ocultação e falhas nas 66 linhas de código malicioso
Para reduzir as chances de ser descoberto, o carregador adotava algumas medidas:
- As funcionalidades normais do Claude Code continuavam sendo carregadas;
- Cada etapa do ataque capturava exceções separadamente e, em caso de falha, seguia em silêncio;
- As tarefas de persistência usavam nomes que imitavam componentes do sistema, como
SysMonecom.apple.sysmond; - Após uma falha de conexão, uma nova tentativa era feita aproximadamente a cada 60 segundos;
- Cerca de 1,5 segundo após a inicialização, o código tentava enviar informações.
Na interface, talvez não fosse possível perceber nenhuma anormalidade.
O próprio código malicioso também tinha falhas evidentes, que reduziam as chances de sucesso do acesso remoto:
| Plataforma | Falha de implementação | Impacto prático |
|---|---|---|
| macOS | Consultava o status do Login Remoto com permissões comuns, recebendo um erro de permissão; o código só tentava ativá-lo quando identificava explicitamente o estado “desativado” | Em muitos Macs com SSH desativado, o Login Remoto não seria ativado automaticamente; se o SSH já estivesse ativo, o risco permanecia |
| Windows | Usava o PowerShell para instalar o OpenSSH Server, mas o executava por meio de uma função auxiliar que dependia de /bin/sh |
Esse caminho não existe em instalações padrão do Windows, então a etapa de ativação do serviço SSH poderia falhar |
| Linux | Usava crontab @reboot para persistência; a Phorion identificou uma falha na verificação do crontab |
Execuções repetidas poderiam afetar tarefas agendadas existentes do usuário; a escala real de distribuição no Linux não foi confirmada |
Essas falhas não significam que o código fosse totalmente ineficaz. Gravar arquivos do próprio usuário e criar itens de inicialização no nível do usuário geralmente não exige permissões de administrador. Assim, o serviço de acesso remoto pode não ter sido iniciado, mas a chave autorizada já ter sido gravada, o script de inicialização criado, as informações do host enviadas e o processo em segundo plano continuar tentando estabelecer conexões de saída. A ideia de que “sem permissões de administrador, está tudo seguro” não se sustenta.
Análise do impacto do backdoor no plugin Claude Code para desenvolvedores
Impacto para desenvolvedores
- Nomes de variáveis de ambiente relacionadas a chaves API podem ter sido expostos: o carregador seleciona até 40 variáveis de ambiente cujos nomes contenham
KEY,TOKEN,SECRET,PASS,AWSouGCP. O envio inicial inclui os nomes, não os valores, mas isso já permite que o atacante identifique quais APIs ou plataformas de nuvem você usa. Quando o backdoor está ativo, as credenciais locais ainda podem ser lidas posteriormente. - Desinstalar o plugin não significa remover o backdoor: arquivos de persistência, itens de inicialização e chaves públicas SSH não desaparecem automaticamente com a desinstalação da extensão. Em um caso relatado pela Expel, o usuário abriu o Cursor apenas depois que o plugin foi retirado do ar. A atividade maliciosa começou em seguida e continuou por quase 10 horas.
- Um único indicador pode deixar ameaças passarem despercebidas: a Expel encontrou uma máquina com um processo de túnel malicioso, mas sem o marcador de chave pública
svc-telemetry. Na investigação, é preciso verificar em conjunto versões, hashes de arquivos, processos, conexões de rede e itens de inicialização.
Impacto para o setor
- Extensões de IDE se tornam uma superfície de ataque valiosa: com a popularização das ferramentas de programação com IA, os computadores de desenvolvedores concentram código-fonte, credenciais de nuvem e chaves API de modelos. Inserir 7 KB de código no início de um arquivo compactado de 3,6 MB foi suficiente para alterar suas propriedades de segurança.
- O processo de publicação em marketplaces de extensões de terceiros precisa ser revisto: este incidente ocorreu apenas no marketplace do Cursor, enquanto a extensão de mesmo nome não apresentou problemas em outros canais. Isso mostra que um nome de publicador que parece oficial não é motivo suficiente para confiar em uma extensão.

A imagem acima foi compilada pela equipe técnica da APIYI apiyi.com com base em pesquisas públicas. A tabela abaixo separa o que foi ou não confirmado; ao citar ou compartilhar essas informações, é importante manter essa distinção:
| Conclusão | Status | Explicação |
|---|---|---|
| O marketplace do Cursor distribuiu uma extensão Claude Code adulterada | Confirmado | Confirmado em comunicado oficial |
| O código malicioso é capaz de coletar informações, implantar chaves, criar túneis reversos e manter persistência | Confirmado | Análises de amostras por várias organizações chegaram às mesmas conclusões |
| Houve atividade maliciosa em dispositivos reais de clientes | Confirmado | A Expel tratou 4 casos, todos em Macs |
| 5.000 computadores foram totalmente controlados | Não confirmado | 5.000 é apenas o limite máximo de dispositivos possivelmente afetados |
| Os valores das chaves API dos usuários foram roubados | Não confirmado | O envio inicial continha apenas nomes de variáveis |
| Total de invasões bem-sucedidas no mundo e prejuízo financeiro | Não divulgado | Não devem ser estimados |
Como investigar o backdoor SSH no plugin do Claude Code
Se você instalou ou atualizou automaticamente a extensão do Claude Code pelo marketplace do Cursor entre 29 e 30 de outubro, vale fazer uma verificação rápida. O script Node.js abaixo apenas lê os caminhos dos indicadores divulgados publicamente, sem fazer nenhuma alteração:
// 只读排查:检查公开披露的入侵痕迹(不能单独作为结论)
const fs = require("fs"), os = require("os"), path = require("path");
const home = os.homedir();
const checks = [
path.join(home, ".ssh", "authorized_keys"),
path.join(home, ".config", ".smt"),
path.join(home, ".config", ".smtk"),
path.join(home, "Library", "LaunchAgents", "com.apple.sysmond.plist"),
path.join(home, ".config", "smt.cmd"),
path.join(home, ".config", "smtk"),
];
for (const p of checks) {
if (!fs.existsSync(p)) continue;
const hit = p.endsWith("authorized_keys")
? fs.readFileSync(p, "utf8").includes("svc-telemetry")
: true;
if (hit) console.log("⚠️ 发现可疑痕迹:", p);
}
Se o script detectar qualquer um desses indicadores, investigue também os hashes dos arquivos, a tarefa agendada SysMon, os processos e os registros de rede. Verifique, por exemplo, se houve conexão com as portas 22 ou 8099 de 134.209.82[.]225. O comunicado oficial do Cursor também disponibiliza scripts de verificação e correção para macOS e Windows. Antes de executá-los, entenda quais permissões eles exigem.
Se você tem um arquivo de extensão suspeito em mãos, também pode usar um Modelo de Linguagem Grande para auxiliar na revisão do código. Confira principalmente se há, no início do arquivo, uma IIFE que chame child_process, escreva em authorized_keys ou estabeleça uma conexão SSH. Veja um exemplo básico de chamada:
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # APIYI OpenAI 兼容接口
)
head = open("extension.js", encoding="utf-8", errors="ignore").read(10000)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "请审查这段 JS 开头是否存在可疑的子进程、SSH、持久化或外连行为:\n" + head}]
)
print(resp.choices[0].message.content)
Ver o script completo de revisão (com comparação de hashes)
import hashlib
import sys
import openai
# 公开披露的恶意 extension.js SHA-256
KNOWN_BAD = {
"ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15",
}
KEYWORDS = ["child_process", "authorized_keys", "svc-telemetry",
"LaunchAgents", "schtasks", "crontab", "8099", "-R"]
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # 使用 APIYI 统一接口
)
def sha256(path: str) -> str:
h = hashlib.sha256()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(1 << 20), b""):
h.update(chunk)
return h.hexdigest()
def review(path: str, head_size: int = 10000) -> None:
digest = sha256(path)
print("SHA-256:", digest)
if digest in KNOWN_BAD:
print("⚠️ 命中已公布的恶意哈希,请立即隔离设备并按官方指引处置")
head = open(path, encoding="utf-8", errors="ignore").read(head_size)
hits = [k for k in KEYWORDS if k in head]
print("文件开头命中关键词:", hits or "无")
prompt = (
"你是安全审计助手。下面是一个 IDE 扩展入口文件的开头部分,"
"请判断是否存在在模块加载时立即执行的代码,"
"并列出涉及子进程、SSH 密钥、持久化、网络外连的可疑片段。\n\n" + head
)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
max_tokens=1200,
)
print(resp.choices[0].message.content)
if __name__ == "__main__":
review(sys.argv[1] if len(sys.argv) > 1 else "extension.js")
Recomendação: a revisão por modelos é apenas um recurso de apoio e não substitui a análise dos logs de EDR nem a comparação com indicadores oficiais. Para comparar a revisão de código por diferentes modelos, você pode usar a mesma chave API para alternar entre eles pela APIYI em apiyi.com. Novos usuários recebem créditos gratuitos para testes. Antes de enviar o código para análise, confirme que ele não contém informações comerciais sensíveis.
Depois de confirmar que a extensão maliciosa foi executada, siga estes passos na ordem:
- Preserve as evidências para investigação e isole o dispositivo;
- Remova os arquivos maliciosos, os itens de inicialização e as chaves públicas SSH;
- Avalie se os repositórios, as credenciais de nuvem, os tokens de sessão e as chaves API acessíveis pelo dispositivo continuam em risco;
- Se não for possível restaurar um estado confiável, reinstale o sistema e troque todas as credenciais usando um dispositivo confiável.
Perguntas frequentes FAQ
Q1: As 66 linhas de JavaScript correspondem ao plugin inteiro do Claude Code?
Não. As 66 linhas são o carregador malicioso inserido no início do arquivo `extension.js`, da linha 1 à 66, com cerca de 7.386 bytes. O código legítimo do plugin tem mais de 3,6 MB e continua sendo executado normalmente depois delas.
Q2: Qual é a diferença entre isso e um ataque de injeção de comandos?
A injeção de comandos tenta induzir o modelo a gerar conteúdo ou executar ações perigosas. Neste caso, o código da extensão é executado diretamente quando ela é carregada. O processo não passa pelo Claude, não exige uma conversa nem precisa do consentimento do modelo. Mesmo que você nunca tenha usado os recursos de IA do plugin, o código pode ser executado assim que a extensão for carregada.
Q3: O Claude Code instalado pelo npm oficial ou pelo Marketplace do VS Code foi afetado?
A Microsoft confirmou que o Visual Studio Marketplace e o pacote oficial do npm `@anthropic-ai/claude-code` não foram afetados. Também não foi encontrada uma versão maliciosa correspondente no Open VSX. Apenas as versões 2.1.312 e 2.1.313 distribuídas pelo marketplace do Cursor foram afetadas. Para verificar uma instalação, também é preciso considerar a origem e o hash do arquivo.
Q4: Preciso trocar as chaves API armazenadas em variáveis de ambiente?
O relatório inicial continha apenas os nomes das variáveis, não seus valores. Mas, se houver confirmação de que o código malicioso foi executado no seu dispositivo, existe a possibilidade de o backdoor ter sido usado para ler credenciais. Por precaução, faça a rotação das chaves em um dispositivo confiável. Também é recomendável trocar as chaves de plataformas como APIYI apiyi.com armazenadas em variáveis de ambiente e adotar uma forma mais segura de gerenciar credenciais.
Q5: Como reduzir esse tipo de risco ao desenvolver aplicações de IA?
Algumas medidas recomendadas: não mantenha chaves de alto privilégio em texto aberto nas variáveis de ambiente da máquina de desenvolvimento por longos períodos, use chaves diferentes para cada projeto e audite regularmente as extensões da IDE. Ao invocar modelos por uma plataforma agregadora como APIYI apiyi.com, você pode usar uma única chave para acessar modelos de vários fornecedores. Isso reduz o número de credenciais espalhadas localmente e, em caso de problema, basta fazer a rotação em um só lugar.
Principais pontos do incidente da backdoor em 66 linhas de JavaScript
- Natureza do ataque: o marketplace de extensões do Cursor sofreu um ataque à cadeia de suprimentos; o modelo Claude em si não foi comprometido.
- Como foi ativada: um carregador IIFE de 66 linhas era executado automaticamente quando a extensão era carregada, sem exigir nenhuma ação do usuário.
- Estrutura da backdoor: dois pares de chaves SSH trabalhavam com um túnel reverso, usando apenas ferramentas já disponíveis no sistema.
- Limites dos fatos: 5.000 é o número máximo estimado de usuários afetados; o roubo dos valores das chaves API não foi confirmado.
- Resposta ao incidente: desinstalar o plugin não significa remover a backdoor. É preciso investigar várias frentes e substituir as credenciais em um dispositivo confiável.
- Hábito de segurança: reduza a quantidade de chaves em texto puro armazenadas localmente. O APIYI, em apiyi.com, pode ajudar a gerenciar as credenciais de invocação de modelos em um só lugar.
Resumo
O incidente da backdoor em 66 linhas de JavaScript mostra três coisas:
- Mudança pequena, impacto grande: bastou inserir código equivalente a 0,2% de um arquivo de 3,6 MB para transformar uma extensão confiável em veículo de uma backdoor.
- As permissões determinam o risco: extensões de IDE têm acesso completo à execução de código Node.js. Mesmo com permissões de usuário comum, elas podem gravar chaves e garantir persistência.
- Remover do marketplace não encerra o problema: componentes maliciosos já instalados podem ser executados posteriormente e continuar se conectando a destinos externos. É necessário investigá-los e removê-los separadamente.
Se você usou a extensão Claude Code do marketplace do Cursor durante o período de exposição, siga os indicadores oficiais para investigar o ambiente e substitua as credenciais que possam ter sido comprometidas. No dia a dia, vale reduzir a quantidade de credenciais locais. Por exemplo, com o APIYI, em apiyi.com, você pode usar uma única chave para acessar modelos de diferentes fornecedores, reduzindo o alcance de um possível vazamento.
📚 Referências
- Comunicado oficial de segurança do Cursor: cronologia do incidente, versões, hashes e script de limpeza
- Link:
cursor.com/blog/claude-code-extension-security-notice -
Descrição: fonte primária para investigação e correção
-
Microsoft Security Research: cadeia de ataque completa e mapeamento MITRE ATT&CK
- Link:
microsoft.com/en-us/security/blog/2026/10/30/inside-malicious-claude-code-branded-cursor-extension-persistent-ssh-backdoor/ -
Descrição: análise dos limites da cadeia de suprimentos, dos mecanismos SSH e da persistência
-
Phorion: carregador de 66 linhas e falhas de implementação em cada plataforma
- Link:
phorion.io/blog/offical-claude-code-vsx-compromise/ -
Descrição: detalhes sobre a filtragem de variáveis de ambiente e a falha no crontab do Linux
-
StepSecurity: comparação detalhada de amostras de 1º de novembro
- Link:
stepsecurity.io/blog/claude-code-extension-trojanized -
Descrição: diferenças de tamanho dos arquivos e evidências de falsificação dos identificadores de versão
-
Expel: investigação de quatro incidentes reais envolvendo clientes
- Link:
expel.com/blog/blog-fake-claude-code-extension-cursor-ssh-backdoor/ -
Descrição: casos de execução com atraso e incidentes não detectados
-
OpenSourceMalware: análise da estrutura interna da extensão maliciosa
- Link:
opensourcemalware.com/blog/trojanized-claude-code-extension-plants-persistent-ssh-backdoor - Descrição: confirmação da localização e do modo de execução do carregador
Autor: equipe técnica da APIYI
Contato técnico: entre em contato conosco pela página inicial do site APIYI apiyi.com. Para mais informações, acesse a central de documentação em docs.apiyi.com
