Fuite de compétences : vol d’identifiants de navigateur via Skills MCP

SkillLeak : un outil de décryptage d’identifiants de navigateur distribué via une compétence MCP

TL; DR

@szc-ft/mcp-szcd-client est un client MCP (Model Context Protocol) publié sur npm qui configure automatiquement les assistants de codage IA — le type de package d'interface qu'un développeur installe pour qu'un agent IDE puisse communiquer avec un service de bibliothèque de composants. Son historique de versions est long et d'apparence ordinaire (Versions 71) et une étape d'installation sans danger. Aucune opération de post-installation ne touche aux identifiants.

Le comportement de lecture des identifiants se situe à un niveau plus profond, dans une compétence MCP intégrée appelée local-browser-test.Quand cette compétence connect() s'exécute la routine, elle invoque _decryptCredentials() — qui déchiffre tous les mots de passe enregistrés dans le profil Chrome/Edge local (tous les sites, et non l'application unique ciblée par un test de navigateur) en utilisant l'API de protection des données Windows (DPAPI) et AES-256-GCM. L'ensemble déchiffré est écrit en clair dans ~/.szcd-mcp/deps/decrypted-creds.json et renvoyé dans le résultat de l'outil MCP de la compétence, qui est transmis au serveur MCP distant par défaut du package, mcp.szcd-mcp.top.

Voici un modèle de chaîne d'approvisionnement qu'il convient de nommer : La fonctionnalité sensible n'est pas dans un hook d'installation (là où la plupart des scanners et des réviseurs regardent), mais dans une compétence MCP qui ne s'exécute que lorsqu'un opérateur pointe l'outil vers son propre navigateur en cours d'exécution. Nous l'appelons ainsi. Fuite de compétences. MEW classe @szc-ft/mcp-szcd-client (versions 0.38.0 et 0.39.0) comme malveillant.

Note de fin de contrat — Compétences MCPUn ensemble autonome d'instructions et de scripts auxiliaires qu'un serveur MCP met à disposition d'un agent d'IA sous forme de fonctionnalité appelable. L'agent l'invoque comme un outil ; les scripts s'exécutent sur la machine du développeur.

Anatomie de l'attaque

L'emballage présente deux aspects très différents.

Le visage qu'un critique voit en premier est le chemin d'installation. Le manifeste déclare postinstallation : scripts node/postinstall.jset ce script fait exactement ce que dit le fichier README : il connecte MCP s'intègre aux IDE et installe un package frère, @szc-ft/sketch-mcp-serverIl n'atteint jamais le code d'identification. Un scanner qui s'arrête à l'installation. hooks — l'endroit où l'on recherche historiquement le signal le plus fort — révèle un outil de développement propre et sans particularité. Ce paquet avait d'ailleurs été jugé sûr lors d'une précédente évaluation.

Le visage qui compte n'est accessible que par le biais de la compétence incluse. La chaîne :

  • Un développeur gère le test de navigateur local Cette compétence est utilisée contre une instance Chrome/Edge lancée via un port de débogage à distance. Il s'agit de la méthode documentée pour l'utiliser.
  • La compétence relier () (lib/browser-engine.js) appels _décrypterCredentials() à la ligne 246.
  • _décrypterCredentials() en cours décrypterTousLesMotsDePasse({ filtre : '%' })L’ '%' Le filtre est le détail qui transforme un test pratique en une véritable réussite : il correspond à chaque origine stockée plutôt qu’au seul site testé.
  • lib/decrypt-passwords.js lit les données du navigateur os_crypt clé chiffrée, s'exécute PowerShell… Données protégées::Déprotéger (DPAPI) pour récupérer la clé AES, puis AES-256-GCM-décrypte chaque identifiant enregistré.
  • L'ensemble complet déchiffré est écrit dans ~/.szcd-mcp/deps/decrypted-creds.json en clair et renvoyé comme la compétence Outil MCP résultat.
  • Ce résultat est renvoyé via le canal MCP au serveur par défaut du paquet. mcp.szcd-mcp.top — le même hôte que celui documenté dans le fichier README et dans scripts/lib/common.js.

Une brève explication quant au fonctionnement de l'étape 4. Sous Windows, Chrome et Edge ne stockent pas les mots de passe enregistrés en clair : chaque identifiant est chiffré avec une clé AES-256-GCM, elle-même scellée par DPAPI, ce qui la lie au compte utilisateur actuel. La récupération d'un mot de passe nécessite donc deux étapes : premièrement, Données protégées::Déprotéger pour récupérer la clé AES (ce qui réussit car le code s'exécute en tant qu'utilisateur connecté, soit exactement le contexte fourni par le terminal d'un développeur), puis un déchiffrement GCM de chaque blob stocké lu depuis le navigateur os_crypt-stockage protégé. Ce système est bien connu, hors ligne et silencieux : aucune demande de mot de passe principal, aucune interaction avec le navigateur, aucun aller-retour réseau avant la transmission des résultats. Il s’agit du même principe fondamental utilisé par de nombreux voleurs d’informations ; la nouveauté réside ici uniquement dans l’interface qui le sous-tend.

Le déchiffreur n'est pas un élément accessoire.Il est emballé trois fois — sous standard-compétence/, extension opencode/ et extension qwen/ — une copie par surface d'assistant IA prise en charge, de sorte que la fonctionnalité accompagne l'assistant configuré par le développeur.

Le contraste avec un test automatique légitime du navigateurlogin Voilà toute l'histoire. Un véritable assistant de test décrypte les identifiants pour le UN application il est exercisCette routine utilise les données en interne et ne les conserve ni ne les transmet. Elle déchiffre tout, les écrit en clair sur le disque et les renvoie à un serveur distant via le réseau.

Chronologie et déclencheur 

Deux comportements sont importants pour comprendre l'exposition.

Le déclenchement est optionnel, non automatique. L'installation du package ne nécessite aucune information d'identification. Le déchiffrement s'effectue uniquement lorsqu'un développeur l'invoque activement. test de navigateur local une compétence contre un navigateur lancé en mode de débogage à distance. Cela réduit considérablement le nombre de personnes concernées par rapport à une post-installation charge utile qui se déclenche à chaque npm installer.

L'emballage est soigné, pas jetable. L'éditeur a publié 71 versions et en maintient une plus large diffusion. @szc-ft Suite MCP de bibliothèque de composants. Le déchiffreur d'identifiants est présent dans les deux versions signalées (0.38.0 et 0.39.0) avec une empreinte identique, invoqué depuis le même browser-engine.js:246 Point d'entrée. Le paquet est toujours disponible sur npm au moment de la rédaction.

Cette combinaison – un éditeur établi, une étape d'installation anodine et une fonctionnalité qui ne s'active que selon un processus d'activation spécifique – explique précisément pourquoi un classificateur automatique a prédit que la fonctionnalité était « sûre », ce qu'une analyse antérieure a confirmé. Ce comportement n'est résolu qu'après une lecture manuelle des scripts d'assistance de la compétence.

Indicateurs de compromis

Type Indicateur
Forfait @szc-ft/mcp-szcd-client (npm) — versions 0.38.0, 0.39.0
Réseau Serveur MCP distant par défaut mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18)
Fichier (supprimé) ~/.szcd-mcp/deps/decrypted-creds.json — identifiants déchiffrés en clair
Fichier (charge utile) .../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (inclus dans standard-skill/, opencode-extension/, qwen-extension/)
Comportementale browser-engine.js:246 _decryptCredentials()decryptAllPasswords({ filter: '%' }) (portée sur l'ensemble du site)
Comportementale Compatible avec Chrome/Edge os_crypt clé ; nécessite un navigateur démarré avec --remote-debugging-port
Installer le crochet postinstall: node scripts/postinstall.js - bénin (Configuration IDE MCP + installation du paquet frère) ; n'atteint pas le déchiffreur

Audit des défenseurs Outillage MCP devrait traiter le compétence Le répertoire est inclus dans le périmètre, et pas seulement le manifeste et les scripts d'installation.

Attribution et comportement observé

Nous décrivons le comportement, pas le motif.

Le paquet est publié sous un compte npm établi avec un système multi-paquets cohérent. @szc-ft Suite MCP et historique des versions complet. Il n'existe pas de canal de commande et de contrôle furtif dédié : les identifiants déchiffrés sont renvoyés via le serveur MCP documenté du package. mcp.szcd-mcp.top, plutôt que vers un point de dépôt anonyme. L'étape d'installation est parfaitement inoffensive.

Ce qui fait passer cela d’une « fonctionnalité pratique agressive » à une classification malveillante, c’est la combinaison observable de la portée et de la destination : la routine déchiffre tous Les identifiants du navigateur enregistrés plutôt que l'application unique qu'un test exerceraitcise, les enregistre sur disque en clair et les transmet hors de l'hôte via le canal MCP. Un test automatique de navigateurlogin Une fonctionnalité se comportant de cette manière serait, en effet, indiscernable d'une collecte d'identifiants — et c'est cet effet que le défenseur doit prendre en compte.

Nous précisons que le déclencheur est optionnel et que l'éditeur est identifié ; ces deux éléments figurent dans le document ci-dessus. Cela ne change rien au résultat visible pour un développeur exécutant l'application : les mots de passe enregistrés pour chaque site dans son profil de navigation sont supprimés de son ordinateur.

SkillLeak est un incident à package unique, mais la surface de diffusion utilisée est cruciale.

Les réflexes de la chaîne d'approvisionnement du secteur sont adaptés à l'exécution au moment de l'installation : préinstaller/post-installation hooks, balises de confusion de dépendance, typosquats avec une charge utile dans index.js. MCP modifie la géométrieUn package MCP peut inclure un manifeste et une étape d'installation entièrement propres, tout en gérant son comportement consécutif au sein d'un compétence — un ensemble de ressources que l'agent d'IA invoque ultérieurement, sur instruction du développeur et en utilisant les ressources de ce dernier. Cette fonctionnalité est intégrée à l'assistant et reste inactive jusqu'à ce qu'un flux de travail classique (« exécuter le test du navigateur ») la déclenche.

Pour les équipes qui adoptent les outils MCP :

  • Des compétences en audit, pas seulement des documents. Étendre l'examen du colis au compétences/, *-extension/et les répertoires équivalents. Le code le plus sensible ne doit jamais apparaître dans un hook d'installation.
  • Attention à l'inflation des objectifs. Une capacité qui prétend avoir un objectif précis (tester une application) mais qui fonctionne de manière plus générale (filtre : '%' (sur l'ensemble des origines stockées) est un signal d'alarme indépendant de l'intention.
  • Considérez les résultats de l'outil MCP comme un canal de sortie. Les données renvoyées par une compétence quittent l'hôte pour atteindre le serveur MCP configuré sur le client. Il convient d'inventorier ces destinations comme pour toute connexion sortante.
  • Réexamen des mises à jour de version des packages MCP « fiables ». Un éditeur établi et un long historique de publications ne sauraient remplacer la lecture du code fourni dans chaque version — comme le démontre ce cas, qui annule une évaluation de sécurité antérieure.

Concrètement, trois vérifications peu coûteuses auraient permis de détecter ce paquet avant même qu'un développeur n'exécute la compétence. Premièrement, une analyse du contenu des répertoires de compétences à la recherche d'accès à un gestionnaire d'identifiants local — des références à os_crypt, Données protégées/DPAPI, ou celui d'un navigateur Login Centres de données Le fichier — signale la capacité quel que soit le hook d'installation existant. Deuxièmement, une vérification de portée sur toute routine de déchiffrement/lecture qui accepte un sélecteur générique (filtre : '%' et ses équivalents) plutôt qu'un identifiant limité permet de détecter l'inflation entre les tests et la récolte. Troisièmement, comparer l'ensemble des hôtes qu'un paquet peut atteindre (ici, mcp.szcd-mcp.top) contre les destinations requises par sa documentation transforme le canal de résultats MCP en un point de sortie auditable. Aucune de ces opérations ne nécessite l'exécution du code.

Décryptage des identifiants via DPAPI et os_crypt Cette technique est ancienne ; la nouvelle approche consiste à la proposer via une compétence d'agent IA qui ne s'active que suite à un processus d'activation volontaire. Il faut s'attendre à une augmentation du nombre de ces fonctionnalités intégrées à mesure que les outils MCP se développent, et adapter le périmètre des évaluations en conséquence. 

sca-tools-logiciel-outils-d'analyse-de-composition
Priorisez, corrigez et sécurisez vos risques logiciels
Obtenez votre compte gratuit.
Aucune carte de crédit requise.

Sécurisez le développement et la livraison de vos logiciels

avec la suite de produits Xygeni