TL; DR
@szc-ft/mcp-szcd-client es un cliente del Protocolo de Contexto de Modelo (MCP) publicado en npm que autoconfigura asistentes de codificación de IA, el tipo de paquete de pegamento que un desarrollador instala para que un agente IDE pueda comunicarse con un servicio de biblioteca de componentes. Tiene un historial de lanzamientos largo y de aspecto ordinario (Versiones 71) y un paso de instalación benigno. Nada en su postinstalación toca las credenciales.
El comportamiento de lectura de credenciales reside en un nivel más profundo, en una habilidad MCP agrupada llamada local-browser-testCuando esa habilidad connect() Las rutinas se ejecutan, invoca _decryptCredentials() — que descifra Todas las contraseñas guardadas en el perfil local de Chrome/Edge (todos los sitios, no la única aplicación a la que apuntaría una prueba de navegador) utilizando la API de protección de datos de Windows (DPAPI) y AES-256-GCM. El conjunto descifrado se escribe en texto plano en ~/.szcd-mcp/deps/decrypted-creds.json y devuelto dentro del resultado de la herramienta MCP de la habilidad, que fluye al servidor MCP remoto predeterminado del paquete, mcp.szcd-mcp.top.
Este es un patrón de cadena de suministro que merece ser mencionado: La capacidad sensible no está en un gancho de instalación (donde la mayoría de los escáneres y revisores miran) pero en una habilidad MCP que solo se ejecuta cuando un operador apunta la herramienta a su propio navegador en ejecución. Lo estamos llamando Fuga de habilidades. MEW clasifica @szc-ft/mcp-szcd-client (versiones 0.38.0 y 0.39.0) como malicioso.
Nota del trimestre — Habilidad MCP: un conjunto autónomo de instrucciones y scripts auxiliares que un servidor MCP expone a un agente de IA como una capacidad invocable. El agente lo invoca como una herramienta; los scripts se ejecutan en la máquina del desarrollador.
Anatomía del ataque
El paquete presenta dos caras muy diferentes.
El rostro que ve primero un crítico es la ruta de instalación. El manifiesto declara postinstall: scripts de nodo/postinstall.jsy ese script hace exactamente lo que dice el README: conecta MCP integraciones en IDE e instala un paquete hermano, @szc-ft/servidor-mcp-sketchNunca llega al código de credenciales. Un escáner que se detiene en la instalación hooks —el lugar históricamente más fiable para buscar— detecta una herramienta de desarrollo limpia y sin nada destacable. De hecho, este paquete ya había sido considerado seguro en una revisión anterior.
El rostro que importa Se alcanza únicamente a través de la habilidad agrupada. La cadena:
- Un desarrollador dirige el prueba del navegador local Esta es la forma documentada de usar la habilidad contra una instancia de Chrome/Edge que iniciaron con un puerto de depuración remota.
- La habilidad conectar () (lib/browser-engine.js) llamadas _decryptCredentials() en la línea 246.
- _decryptCredentials() llamadas descifrarTodasLasContraseñas({ filtro: '%' }). La función de '%' El filtro es el detalle que convierte una simple prueba en una experiencia fructífera: coincide con todos los orígenes almacenados en lugar de con el único sitio que se está probando.
- lib/decrypt-passwords.js lee el navegador os_crypt clave cifrada, se ejecuta PowerShell … DatosProtegidos::Desproteger (DPAPI) para recuperar la clave AES, luego AES-256-GCM descifra cada credencial guardada.
- El conjunto completo descifrado se escribe en ~/.szcd-mcp/deps/decrypted-creds.json en texto plano y devuelto como la habilidad Herramienta MCP resultado.
- Ese resultado viaja de vuelta a través del canal MCP al servidor predeterminado del paquete, mcp.szcd-mcp.top — el mismo host documentado en el README y en scripts/lib/common.js.
Una breve nota sobre por qué funciona el paso 4. En Windows, Chrome y Edge no almacenan las contraseñas guardadas en texto plano: cada credencial se cifra con una clave AES-256-GCM, y esa clave a su vez se sella con DPAPI, que la vincula a la cuenta de usuario actual. Por lo tanto, recuperar una contraseña requiere dos pasos: primero DatosProtegidos::Desproteger para recuperar la clave AES (lo cual tiene éxito porque el código se ejecuta como el usuario que ha iniciado sesión, exactamente el contexto que proporciona la terminal de un desarrollador), luego un descifrado GCM de cada blob almacenado leído desde el navegador. os_crypt-Almacén protegido. Es un sistema bien conocido, sin conexión a internet y silencioso: no solicita contraseña maestra, no requiere interacción con el navegador ni comunicación por red hasta que se envían los resultados. Es el mismo método básico que utilizan muchos ciberdelincuentes; la novedad reside únicamente en la interfaz que lo contiene.
El descifrador no es casual.. Se agrupa tres veces — bajo standard-habilidad/, extensión de código abierto/, y qwen-extensión/ — una copia por cada superficie de asistente de IA compatible, de modo que la funcionalidad se mantiene con cualquier asistente que el desarrollador haya configurado.
El contraste con una prueba de navegador legítima automática-login Esa es toda la historia. Un auténtico asistente de pruebas descifra la credencial para el uno aplicación es ejerciciocisLa rutina lo utiliza dentro del proceso y nunca lo almacena ni lo reenvía. Aquí, la rutina descifra todo, lo escribe en el disco sin cifrar y lo devuelve a través de un límite de red a un servidor remoto.
Cronología y desencadenante
Dos comportamientos son importantes para comprender la exposición.
El activador es voluntario, no automático. La instalación del paquete no lee ninguna credencial. El descifrado se ejecuta solo cuando un desarrollador lo invoca activamente. prueba del navegador local habilidad contra un navegador que han iniciado en modo de depuración remota. Eso reduce materialmente quién se ve afectado en comparación con un postinstalación carga útil que se dispara en cada npm instalar.
El empaque es de calidad, no desechable. La editorial ha distribuido 71 versiones y mantiene una estrategia más amplia. @szc-ft Suite MCP de biblioteca de componentes. El descifrador de credenciales está presente en ambas versiones marcadas (0.38.0 y 0.39.0) con una huella digital idéntica, invocado desde el mismo browser-engine.js:246 Punto de entrada. El paquete sigue disponible en npm en el momento de escribir este artículo.
Esa combinación —un editor consolidado, un paso de instalación sencillo y una funcionalidad que solo se activa mediante un flujo de trabajo específico con consentimiento explícito— explica por qué un clasificador automatizado predijo que era "seguro" y una revisión anterior coincidió. El problema solo se resuelve mediante la lectura manual de los scripts auxiliares de la habilidad.
Indicadores de compromiso
| Tipo | Indicador |
|---|---|
| PREMIUM | @szc-ft/mcp-szcd-client (npm) — versiones 0.38.0, 0.39.0 |
| Network | Servidor MCP remoto predeterminado mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18) |
| Archivo (eliminado) | ~/.szcd-mcp/deps/decrypted-creds.json — credenciales descifradas en texto plano |
| Archivo (carga útil) | .../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (agrupado en standard-skill/, opencode-extension/, qwen-extension/) |
| Salud Conductual | browser-engine.js:246 _decryptCredentials() → decryptAllPasswords({ filter: '%' }) (Alcance en todo el sitio) |
| Salud Conductual | Lee Chrome/Edge os_crypt clave; requiere un navegador iniciado con --remote-debugging-port |
| Instalar gancho | postinstall: node scripts/postinstall.js - benigno (Configuración IDE MCP + instalación de paquete hermano); no llega al descifrador |
Auditoría de defensores Herramientas MCP debe tratar el habilidad El directorio se incluye dentro del ámbito de aplicación, no solo el manifiesto y los scripts de instalación.
Atribución y comportamiento observado
Describimos el comportamiento, no el motivo.
El paquete se publica bajo una cuenta npm establecida con un multipackage coherente. @szc-ft Suite MCP y un largo historial de versiones. No hay un canal de comando y control encubierto dedicado: las credenciales descifradas se devuelven a través del propio servidor MCP documentado del paquete, mcp.szcd-mcp.top, en lugar de a un punto de entrega anónimo. El paso de instalación es realmente inofensivo.
Lo que hace que esto pase de ser una “función de conveniencia agresiva” a una clasificación maliciosa es la combinación observable de alcance y destino: la rutina descifra todos credenciales de navegador guardadas en lugar de la única aplicación que una prueba ejerceríacise, los persiste en el disco en texto plano y los transmite fuera del host a través del canal MCP. Una prueba de navegador automática-login Una función que se comportara de esta manera sería, en efecto, indistinguible de la recolección de credenciales, y es precisamente en ese efecto en lo que un defensor debe basar su razonamiento.
Constatamos honestamente que el activador es de suscripción voluntaria y que el editor está identificado; ambos datos constan en el registro anterior. Ninguno de estos aspectos altera el resultado observable para un desarrollador que ejecuta la habilidad: las contraseñas guardadas para todos los sitios web en su perfil de navegador se eliminan del equipo.
Impacto, tendencias y orientación para defensores
SkillLeak es un incidente de un solo paquete, pero la clave está en la plataforma de entrega que utiliza.
Los reflejos de la cadena de suministro de la industria están ajustados a la ejecución en el momento de la instalación: preinstalación/postinstalación hooks, balizas de confusión de dependencia, typosquats con una carga útil en index.js. MCP cambia la geometríaUn paquete MCP puede enviar un manifiesto y un paso de instalación que son completamente limpios mientras llevan su comportamiento consecuente dentro de un habilidad — un paquete que el agente de IA invoca posteriormente, siguiendo las instrucciones del desarrollador y utilizando sus propios recursos. Esta funcionalidad se integra con el asistente y permanece inactiva hasta que un flujo de trabajo aparentemente normal («ejecutar la prueba del navegador») la activa.
Para los equipos que adoptan las herramientas de MCP:
- Auditoría de habilidades, no solo de manifestaciones. Ampliar la revisión del paquete al habilidades/, *-extensión/y directorios equivalentes. El código más sensible puede que nunca aparezca en un gancho de instalación.
- Esté atento a la inflación del alcance. Una capacidad que afirma tener un propósito limitado (probar una aplicación) pero que opera de manera amplia (filtro: '%' (sobre todos los orígenes almacenados) es una señal de alerta independiente de la intención.
- Trate los resultados de la herramienta MCP como un canal de salida. Los datos que devuelve una habilidad salen del host hacia el servidor MCP configurado para el cliente. Registre esos destinos como lo haría con cualquier conexión saliente.
- Revisar las actualizaciones de versión de los paquetes MCP “de confianza”. Una editorial consolidada y un largo historial de lanzamientos no sustituyen la lectura del código que se incluye en cada versión, como demuestra este caso, que revierte una evaluación de seguridad anterior.
Concretamente, tres comprobaciones de bajo coste habrían revelado este paquete antes de que un desarrollador ejecutara la habilidad. Primero, un escaneo de contenido de los directorios de habilidades para el acceso al almacén de credenciales local: referencias a os_crypt, datos protegidos/DPAPI, o un navegador Login Datos archivo: marca la capacidad independientemente de qué gancho de instalación exista. En segundo lugar, una comprobación de alcance en cualquier rutina de descifrado/lectura que acepte un selector comodín (filtro: '%' y equivalentes) en lugar de un identificador vinculado captura la inflación de prueba a cosecha. Tercero, comparar el conjunto de hosts a los que puede llegar un paquete (aquí, mcp.szcd-mcp.top) contra los destinos que su documentación afirma necesitar convierte el canal de resultados de MCP en un punto de salida auditable. Ninguno de estos requiere ejecutar el código.
Descifrado de credenciales a través de DPAPI y os_crypt Esta es una técnica antigua; la nueva forma de implementarla es mediante una habilidad de agente de IA que solo se activa bajo un flujo de trabajo de participación voluntaria. Se espera que el patrón de funcionalidad integrada en una habilidad se generalice a medida que se generalicen las herramientas de MCP, y se debe ajustar el alcance de la revisión en consecuencia.



