SkillLeak, roubo de credenciais do navegador via MCP Skill

SkillLeak: Um decodificador de credenciais de navegador fornecido por meio de uma habilidade MCP

TL, DR

@szc-ft/mcp-szcd-client é um cliente do Protocolo de Contexto de Modelo (MCP) publicado no npm que configura automaticamente assistentes de codificação de IA — o tipo de pacote que um desenvolvedor instala para que um agente de IDE possa se comunicar com um serviço de biblioteca de componentes. Ele tem um longo histórico de lançamentos de aparência comum (versões 71) e uma etapa de instalação simples. Nada em seu processo de pós-instalação altera as credenciais.

O comportamento de leitura de credenciais reside um nível mais profundo, em uma habilidade MCP integrada chamada local-browser-testQuando essa habilidade connect() Execuções de rotina, ela invoca _decryptCredentials() — que decifra todas as senhas salvas no perfil local do Chrome/Edge (todos os sites, não apenas o aplicativo específico que um teste de navegador teria como alvo) usando a API de Proteção de Dados do Windows (DPAPI) e AES-256-GCM. O conjunto descriptografado é gravado em texto simples para ~/.szcd-mcp/deps/decrypted-creds.json e retornado dentro do resultado da ferramenta MCP da habilidade, que flui para o servidor MCP remoto padrão do pacote, mcp.szcd-mcp.top.

Este é um padrão de cadeia de suprimentos que merece ser nomeado: A funcionalidade sensível não está em um gancho de instalação. (onde a maioria dos scanners e revisores olham), mas em uma habilidade MCP que só é executada quando um operador aponta a ferramenta para o próprio navegador em execução. Estamos chamando-a de SkillLeak. MEW classifica @szc-ft/mcp-szcd-client (versões) 0.38.0 e 0.39.0) como malicioso.

Nota de término — habilidade MCPUm pacote independente de instruções e scripts auxiliares que um servidor MCP expõe a um agente de IA como uma funcionalidade invocável. O agente o invoca como uma ferramenta; os scripts são executados na máquina do desenvolvedor.

Anatomia do Ataque

A embalagem apresenta duas faces muito diferentes.

O rosto que um crítico vê primeiro é o caminho de instalação. O manifesto declara postinstall: scripts do node/postinstall.jsE esse script faz exatamente o que o README diz: ele conecta... MCP integrações em IDEs e instalação de um pacote complementar, @szc-ft/sketch-mcp-serverEle nunca chega ao código de credencial. Um scanner que para na instalação. hooks — o local historicamente mais confiável para se procurar — revela uma ferramenta de desenvolvimento limpa e sem nada de especial. Este pacote, na verdade, já havia sido avaliado como seguro em uma revisão anterior.

O rosto que importa é alcançado somente através da habilidade agrupada. A cadeia:

  • Um desenvolvedor executa o teste-local-browser A habilidade é usada em uma instância do Chrome/Edge iniciada com uma porta de depuração remota. Essa é a maneira documentada de usar a habilidade.
  • A habilidade conectar() (lib/browser-engine.js) chamadas _decryptCredentials() na linha 246.
  • _decryptCredentials() chamadas descriptografarTodasAsSenhas({ filtro: '%' }). O '%' O filtro é o detalhe que transforma uma simples conveniência de teste em uma conquista: ele considera todas as origens armazenadas, em vez de apenas o local específico em teste.
  • lib/decrypt-passwords.js lê o navegador os_crypt chave criptografada, executa PowerShell … DadosProtegidos::Desproteger (DPAPI) para recuperar a chave AES, em seguida, AES-256-GCM descriptografa cada credencial salva.
  • O conjunto completo descriptografado é gravado em ~/.szcd-mcp/deps/credenciais-descriptografadas.json em texto claro e retornado como a habilidade Ferramenta MCP resultado.
  • Esse resultado é enviado de volta pelo canal MCP para o servidor padrão do pacote. mcp.szcd-mcp.top — o mesmo host documentado no README e em scripts/lib/common.js.

Uma breve explicação sobre por que o passo 4 funciona. No Windows, o Chrome e o Edge não armazenam senhas salvas em texto simples: cada credencial é criptografada com uma chave AES-256-GCM, e essa chave é selada com DPAPI, que a vincula à conta de usuário atual. Portanto, recuperar uma senha requer duas etapas — primeiro DadosProtegidos::Desproteger Para recuperar a chave AES (o que é bem-sucedido porque o código é executado como o usuário conectado, exatamente o contexto fornecido pelo terminal de um desenvolvedor), é necessário realizar uma descriptografia GCM de cada blob armazenado lido do navegador. os_crypt-armazenamento protegido. Este é um método bem compreendido, offline e silencioso: sem solicitação de senha mestra, sem interação com o navegador, sem comunicação de ida e volta pela rede até que os resultados sejam encaminhados. É o mesmo princípio básico usado por muitos ladrões de informações comuns — a novidade aqui é apenas a estrutura que o utiliza.

O decodificador não é um detalhe.Ele é agrupado três vezes — sob standard-habilidade/, extensão-código-aberto/ e qwen-extensão/ — uma cópia por superfície de assistente de IA compatível, para que a funcionalidade acompanhe qualquer assistente que o desenvolvedor tenha conectado.

O contraste com um teste automático legítimo do navegador-Conecte-se Essa é toda a história. Um auxiliar de teste genuíno descriptografa a credencial para o um aplicação é exerccisA rotina usa os dados no próprio processo e nunca os persiste ou encaminha. Aqui, a rotina descriptografa tudo, grava os dados em disco em texto não criptografado e os retorna através de uma rede para um servidor remoto.

Linha do tempo e gatilho 

Dois comportamentos são importantes para entender a exposição.

O gatilho é opcional, não automático. A instalação do pacote não lê nenhuma credencial. A descriptografia só é executada quando um desenvolvedor a invoca ativamente. teste-local-browser habilidade contra um navegador que eles iniciaram no modo de depuração remota. Isso restringe consideravelmente o número de pessoas afetadas em comparação com um pós-instalação carga útil que dispara em cada npm install.

A embalagem é sofisticada, não é descartável. A editora já lançou 71 versões e mantém uma ampla variedade de catálogos. @szc-ft Conjunto de componentes MCP da biblioteca. O decodificador de credenciais está presente em ambas as versões sinalizadas (0.38.0 e 0.39.0) com uma impressão digital idêntica, invocada a partir do mesmo browser-engine.js:246 Ponto de entrada. O pacote permanece ativo no npm no momento da redação deste texto.

Essa combinação — uma editora estabelecida, uma etapa de instalação simples e uma funcionalidade que só é ativada mediante um fluxo de trabalho específico — é exatamente o motivo pelo qual um classificador automatizado previu "seguro" e uma revisão anterior concordou. O comportamento só se resolve com a leitura manual dos scripts auxiliares da skill.

Indicadores de compromisso

Formato Indicador
Pacote @szc-ft/mcp-szcd-client (npm) — versões 0.38.0, 0.39.0
Network Servidor MCP remoto padrão mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18)
Arquivo (descartado) ~/.szcd-mcp/deps/decrypted-creds.json — credenciais descriptografadas em texto simples
Arquivo (carga útil) .../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (incluído em standard-skill/, opencode-extension/, qwen-extension/)
Comportamentais browser-engine.js:246 _decryptCredentials()decryptAllPasswords({ filter: '%' }) (Abrangência total do site)
Comportamentais Lê Chrome/Edge os_crypt chave; requer um navegador iniciado com --remote-debugging-port
Instalar gancho postinstall: node scripts/postinstall.js - benigno (Configuração IDE MCP + instalação de pacote irmão); não alcança o decodificador

Auditoria de defensores Ferramentas MCP deve tratar o habilidade O diretório está no escopo, não apenas o manifesto e os scripts de instalação.

Atribuição e comportamento observado

Descrevemos o comportamento, não a motivação.

O pacote é publicado em uma conta npm estabelecida com um conjunto coerente de múltiplos pacotes. @szc-ft O pacote MCP possui um longo histórico de versões. Não há um canal de comando e controle secreto dedicado: as credenciais descriptografadas são retornadas através do próprio servidor MCP documentado do pacote. mcp.szcd-mcp.top, em vez de para um ponto de entrega anônimo. A etapa de instalação é realmente inofensiva.

O que diferencia isso de uma "funcionalidade de conveniência agressiva" para uma classificação maliciosa é a combinação observável de escopo e destino: a rotina descriptografa todos os credenciais de navegador salvas em vez do aplicativo único que um teste executariacise, persiste-os em disco em texto simples e os transmite para fora do host através do canal MCP. Um teste de navegador automático-Conecte-se Uma funcionalidade que se comportasse dessa maneira seria, na prática, indistinguível da coleta de credenciais — e é sobre esse efeito que um defensor deve raciocinar.

Observamos honestamente que o gatilho é a adesão voluntária e o editor está estabelecido; ambos os fatos constam no registro acima. Nenhum deles altera o resultado observável para um desenvolvedor que executa a skill: as senhas salvas para cada site em seu perfil de navegador saem da máquina.

O SkillLeak é um incidente de pacote único, mas a superfície de distribuição que ele utiliza é o ponto crucial.

Os reflexos da cadeia de suprimentos do setor estão ajustados para a execução no momento da instalação: pré-instalação/pós-instalação hooks, beacons de confusão de dependência, typosquats com uma carga útil em index.js. O MCP altera a geometria.Um pacote MCP pode enviar um manifesto e uma etapa de instalação completamente limpos, enquanto carrega seu comportamento consequente dentro de um habilidade — um pacote que o agente de IA invoca posteriormente, sob instrução do desenvolvedor, utilizando os recursos do próprio desenvolvedor. A funcionalidade é integrada ao assistente e permanece inativa até que um fluxo de trabalho aparentemente normal (“executar o teste no navegador”) a ative.

Para equipes que adotam as ferramentas MCP:

  • Habilidades de auditoria, não apenas manifestações. Ampliar a revisão do pacote para o habilidades/, *-extensão/e diretórios equivalentes. O código mais sensível pode nunca aparecer em um gancho de instalação.
  • Fique atento à inflação do escopo. Uma funcionalidade que alega ter um propósito específico (testar um aplicativo), mas opera de forma ampla (filtro: '%' (em todas as origens armazenadas) é um sinal de alerta independente da intenção.
  • Considere os resultados da ferramenta MCP como um canal de saída. Os dados retornados por uma skill saem do host em direção ao servidor MCP para o qual o cliente está configurado. Faça um inventário desses destinos da mesma forma que faria com qualquer conexão de saída.
  • Reavaliar as atualizações de versão dos pacotes MCP "confiáveis". Uma editora consolidada e um longo histórico de lançamentos não substituem a leitura do código-fonte de cada versão — como demonstra este caso, que reverte uma avaliação anterior de segurança.

Concretamente, três verificações de baixo custo teriam detectado este pacote antes que um desenvolvedor executasse a skill. Primeiro, uma varredura de conteúdo dos diretórios de skills em busca de acesso ao armazenamento de credenciais local — referências a os_crypt, Dados Protegidos/DPAPI, ou o de um navegador Conecte-se Dados arquivo — sinaliza a capacidade independentemente do gancho de instalação existente. Em segundo lugar, uma verificação de escopo em qualquer rotina de descriptografia/leitura que aceite um seletor curinga (filtro: '%' e equivalentes) em vez de um identificador limitado captura a inflação de teste para colheita. Terceiro, comparar o conjunto de hosts que um pacote pode alcançar (aqui, mcp.szcd-mcp.top) contra os destinos que sua documentação afirma necessitar transforma o canal de resultados do MCP em um ponto de saída auditável. Nenhum deles requer a execução do código.

Decriptação de credenciais via DPAPI e os_crypt Essa é uma técnica antiga; disponibilizá-la por meio de uma habilidade de agente de IA que só é acionada em um fluxo de trabalho opcional é a nova abordagem. Espere ver mais do padrão de capacidade integrada à habilidade à medida que as ferramentas de MCP se proliferam e ajuste o escopo da revisão de acordo. 

sca-tools-software-composição-análise-ferramentas
Priorize, corrija e proteja seus riscos de software
Crie sua conta gratuita.
Nenhum cartão de crédito é necessário.

Proteja seu desenvolvimento e entrega de software

com o Suíte de Produtos da Xygeni