TL; DR
@szc-ft/mcp-szcd-client ist ein auf npm veröffentlichter Model Context Protocol (MCP)-Client, der KI-Codierungsassistenten automatisch konfiguriert – eine Art Verbindungspaket, das ein Entwickler installiert, damit ein IDE-Agent mit einem Komponentenbibliotheksdienst kommunizieren kann. Es hat eine lange, unscheinbar wirkende Release-Historie (71 Versionenund ein unproblematischer Installationsschritt. Im Anschluss an die Installation werden keine Anmeldeinformationen verändert.
Das Verhalten zum Lesen von Anmeldeinformationen ist eine Ebene tiefer angesiedelt, in einer gebündelten MCP-Fähigkeit namens local-browser-testWenn diese Fähigkeit connect() Routineausführungen, es ruft auf _decryptCredentials() — was entschlüsselt alle gespeicherten Passwörter im lokalen Chrome/Edge-Profil (Alle Websites, nicht nur die einzelne Anwendung, die ein Browsertest anvisieren würde) unter Verwendung der Windows Data Protection API (DPAPI) und AES-256-GCM. Der entschlüsselte Datensatz wird im Klartext gespeichert. ~/.szcd-mcp/deps/decrypted-creds.json und wird im Ergebnis des MCP-Tools der Fertigkeit zurückgegeben, welches an den standardmäßigen Remote-MCP-Server des Pakets weitergeleitet wird. mcp.szcd-mcp.top.
Dies ist ein Lieferkettenmuster, das es wert ist, benannt zu werden: Die sensible Funktion befindet sich nicht in einem Installations-Hook. (wo die meisten Scanner und Prüfer suchen), aber in einer MCP-Fähigkeit, die nur ausgeführt wird, wenn ein Benutzer das Tool auf seinen eigenen laufenden Browser richtet. Wir nennen es SkillLeakMEW klassifiziert @szc-ft/mcp-szcd-client (Versionen 0.38.0 und 0.39.0) als bösartig.
Begriffshinweis — MCP-FähigkeitEin in sich abgeschlossenes Paket aus Anweisungen und Hilfsskripten, das ein MCP-Server einem KI-Agenten als aufrufbare Funktion zur Verfügung stellt. Der Agent ruft es wie ein Werkzeug auf; die Skripte werden auf dem Rechner des Entwicklers ausgeführt.
Angriffsanatomie
Die Verpackung präsentiert zwei sehr unterschiedliche Seiten.
Das Gesicht, das ein Rezensent zuerst sieht ist der Installationspfad. Das Manifest deklariert postinstall: node scripts/postinstall.jsUnd dieses Skript macht genau das, was in der README-Datei steht: Es stellt Verbindungen her. MCP Integrationen in IDEs und Installation eines zugehörigen Pakets, @szc-ft/sketch-mcp-serverEs erreicht nie den Anmeldeinformationscode. Ein Scanner, der bei der Installation stoppt. hooks Die historisch gesehen aussagekräftigste Quelle für Sicherheitsüberprüfungen sieht ein sauberes, unauffälliges Entwicklertool. Dieses Paket war in einer früheren Überprüfung tatsächlich als sicher eingestuft worden.
Das Gesicht, das zählt wird nur durch die gebündelte Fähigkeit erreicht. Die Kette:
- Ein Entwickler leitet die lokaler Browsertest Die Fähigkeit wurde gegen eine Chrome/Edge-Instanz eingesetzt, die mit einem Remote-Debugging-Port gestartet wurde. Dies ist die dokumentierte Methode zur Verwendung der Fähigkeit.
- Die Fähigkeit verbinden () (lib/browser-engine.js) Anrufe _decryptCredentials() in Zeile 246.
- _decryptCredentials() Anrufe decryptAllPasswords({ filter: '%' }). Der '%' Der Filter ist das Detail, das aus einem Test eine Ausbeute macht: Er gleicht jeden gespeicherten Ursprung ab, anstatt nur die einzelne zu testende Website.
- lib/decrypt-passwords.js liest den Browser os_crypt verschlüsselter Schlüssel, läuft PowerShell … ProtectedData::Unprotect (DPAPI) zur Wiederherstellung des AES-Schlüssels, anschließend wird jede gespeicherte Anmeldeinformation mit AES-256-GCM entschlüsselt.
- Der vollständige entschlüsselte Satz wird geschrieben an ~/.szcd-mcp/deps/decrypted-creds.json im Klartext und als Ergebnis der Fertigkeit zurückgegeben. MCP-Tool Ergebnis.
- Das Ergebnis wird über den MCP-Kanal an den Standardserver des Pakets zurückgesendet. mcp.szcd-mcp.top — derselbe Host, der in der README-Datei und in scripts/lib/common.js.
Eine kurze Erklärung, warum Schritt 4 überhaupt funktioniert. Unter Windows speichern Chrome und Edge gespeicherte Passwörter nicht im Klartext: Jedes Passwort wird mit einem AES-256-GCM-Schlüssel verschlüsselt, und dieser Schlüssel selbst wird mit DPAPI versiegelt, wodurch er an das aktuelle Benutzerkonto gebunden wird. Die Wiederherstellung eines Passworts erfordert daher zwei Schritte – erstens GeschützteDaten::Schutz aufheben um den AES-Schlüssel wiederherzustellen (was gelingt, da der Code als angemeldeter Benutzer ausgeführt wird, genau im Kontext eines Entwicklerterminals), anschließend eine GCM-Entschlüsselung jedes gespeicherten Blobs, der vom Browser gelesen wird. os_crypt-geschützter Speicher. Dieser ist gut verstanden, offline und unauffällig: keine Abfrage nach einem Masterpasswort, keine Browserinteraktion, kein Netzwerkverkehr, bis die Ergebnisse weitergeleitet werden. Es handelt sich um dieselbe primitive Technologie, die viele Datendiebe nutzen – die Neuheit besteht lediglich in der verwendeten Schnittstelle.
Der Entschlüsseler ist kein Zufall.Es ist dreifach gebündelt – unter standard-Fähigkeit/, opencode-extension/ und qwen-extension/ — eine Kopie pro unterstützter KI-Assistentenoberfläche, sodass die Funktionalität mit dem jeweiligen Assistenten, den der Entwickler eingerichtet hat, mitwandert.
Der Kontrast zu einem legitimen Browser-Test-Auto-login Das ist die ganze Geschichte. Ein echter Testhelfer entschlüsselt die Anmeldeinformationen für den dank One Anwendung ist ÜbungcisDie Routine verwendet die Daten im Prozess selbst und speichert oder leitet sie nie weiter. Hier entschlüsselt die Routine alle Daten, schreibt sie unverschlüsselt auf die Festplatte und sendet sie über eine Netzwerkgrenze an einen entfernten Server zurück.
Zeitleiste & Auslöser
Zwei Verhaltensweisen sind für das Verständnis der Exposition von Bedeutung.
Die Auslösung erfolgt auf Wunsch, nicht automatisch. Bei der Installation des Pakets werden keine Anmeldeinformationen ausgelesen. Die Entschlüsselung erfolgt nur, wenn ein Entwickler sie aktiv aufruft. lokaler Browsertest Fähigkeit gegenüber einem Browser, den sie im Remote-Debugging-Modus gestartet haben. Das schränkt den Kreis der Betroffenen im Vergleich zu einem erheblich ein. Nachinstallation Nutzlast, die bei jedem npm installieren.
Die Verpackung ist hochwertig, nicht zum Wegwerfen geeignet. Der Verlag hat 71 Versionen veröffentlicht und pflegt ein breiteres Spektrum an Produkten. @szc-ft Die Komponentenbibliothek MCP Suite enthält einen Anmeldeinformationsentschlüsseler, der in beiden markierten Versionen (0.38.0 und 0.39.0) mit identischem Fingerabdruck vorhanden ist und von derselben Stelle aufgerufen wird. browser-engine.js:246 Einstiegspunkt. Das Paket ist zum Zeitpunkt der Erstellung dieses Dokuments weiterhin auf npm verfügbar.
Diese Kombination – ein etablierter Herausgeber, ein unkomplizierter Installationsschritt und eine Funktion, die nur im Rahmen eines bestimmten Opt-in-Workflows aktiviert wird – ist genau der Grund, warum ein automatisierter Klassifikator „sicher“ vorhersagte und eine frühere Überprüfung dies bestätigte. Das Verhalten lässt sich erst durch manuelles Lesen der Hilfsskripte der Anwendung beheben.
Kompromissindikatoren
| Typ | Indikator |
|---|---|
| Verpackung | @szc-ft/mcp-szcd-client (npm) — Versionen 0.38.0, 0.39.0 |
| Netzwerk | Standardmäßiger Remote-MCP-Server mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18) |
| Datei (abgelegt) | ~/.szcd-mcp/deps/decrypted-creds.json — Klartext-entschlüsselte Anmeldeinformationen |
| Datei (Nutzdaten) | .../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (im Paket enthalten unter standard-skill/, opencode-extension/, qwen-extension/) |
| Verhaltens- | browser-engine.js:246 _decryptCredentials() → decryptAllPasswords({ filter: '%' }) (Standortübergreifender Geltungsbereich) |
| Verhaltens- | Liest Chrome/Edge os_crypt Schlüssel; erfordert einen Browser, der mit --remote-debugging-port |
| Haken montieren | postinstall: node scripts/postinstall.js - gutartig (IDE MCP-Konfiguration + Installation des Schwesterpakets); erreicht den Entschlüsseler nicht |
Verteidiger prüfen MCP-Werkzeuge sollte behandeln Geschicklichkeit Das Verzeichnis soll in den Geltungsbereich einbezogen werden, nicht nur das Manifest und die Installationsskripte.
Attribution und beobachtetes Verhalten
Wir beschreiben Verhalten, nicht Motiv.
Das Paket wird unter einem etablierten npm-Konto mit einem kohärenten Multi-Paket-Aufbau veröffentlicht. @szc-ft Die MCP-Suite verfügt über eine lange Versionshistorie. Es gibt keinen dedizierten verdeckten Befehls- und Kontrollkanal: Die entschlüsselten Zugangsdaten werden über den dokumentierten MCP-Server des Pakets zurückgegeben. mcp.szcd-mcp.top, anstatt an einen anonymen Ablageort. Der Installationsschritt ist völlig unbedenklich.
Was dies von einer „aggressiven Komfortfunktion“ zu einer bösartigen Einstufung macht, ist die beobachtbare Kombination aus Umfang und Ziel: die Routine entschlüsselt alle gespeicherte Browseranmeldeinformationen anstelle der einzelnen Anwendung, die ein Test ausführen würdecise speichert sie im Klartext auf der Festplatte und überträgt sie über den MCP-Kanal vom Host. Ein Browser-Test-Auto-login Eine solche Funktion wäre praktisch nicht von Credential Harvesting zu unterscheiden – und genau diese Auswirkungen muss ein Verteidiger berücksichtigen.
Wir weisen ausdrücklich darauf hin, dass die Aktivierung eine Opt-in-Funktion ist und der Herausgeber etabliert ist; beides ist oben dokumentiert. Dies ändert jedoch nichts am beobachtbaren Ergebnis für einen Entwickler, der die Anwendung nutzt: Die gespeicherten Passwörter für alle Websites in seinem Browserprofil verlassen den Rechner.
Auswirkungen, Trends und Leitlinien für Verteidiger
Bei SkillLeak handelt es sich um einen Vorfall, der nur ein einzelnes Softwarepaket betrifft, aber die Art und Weise, wie es verbreitet wird, ist der entscheidende Punkt.
Die Lieferkettenreaktionen der Branche sind auf die Ausführung zum Zeitpunkt der Installation ausgerichtet: Vorinstallation/Nachinstallation hooks, Abhängigkeitsverwirrungs-Leuchtfeuer, Typosquats mit einer Nutzlast in index.js. MCP verändert die GeometrieEin MCP-Paket kann ein Manifest und einen Installationsschritt ausliefern, die vollständig sauber sind, während das daraus resultierende Verhalten intern ausgeführt wird. Geschicklichkeit – ein Paket, das der KI-Agent später auf Anweisung des Entwicklers und mit dessen eigenen Ressourcen aufruft. Die Funktion wird mit der Integration des Assistenten bereitgestellt und bleibt inaktiv, bis sie durch einen scheinbar normalen Arbeitsablauf („Browsertest ausführen“) aktiviert wird.
Für Teams, die MCP-Tools einsetzen:
- Prüfungsfähigkeiten, nicht nur Manifestationen. Erweitern Sie die Paketprüfung auf die Fähigkeiten/, *-Verlängerung/und entsprechende Verzeichnisse. Der sensibelste Code wird möglicherweise nie in einem Installations-Hook erscheinen.
- Achten Sie auf eine Ausweitung des Handlungsspielraums. Eine Fähigkeit, die einen eng begrenzten Zweck vorgibt (Test einer App), aber breit gefächert funktioniert (Filter: '%' über alle gespeicherten Ursprünge hinweg) ist ein Warnsignal, unabhängig von der Absicht.
- Die Ergebnisse des MCP-Tools werden als Ausgangskanal behandelt. Die von einem Skill zurückgegebenen Daten verlassen den Host und werden an den MCP-Server gesendet, für den der Client konfiguriert ist. Erfassen Sie diese Ziele wie jede andere ausgehende Verbindung.
- Überprüfen Sie erneut die Versionserhöhungen von „vertrauenswürdigen“ MCP-Paketen. Ein etablierter Verlag und eine lange Veröffentlichungsgeschichte sind kein Ersatz dafür, den in jeder Version enthaltenen Quellcode zu lesen – wie dieser Fall zeigt, der eine frühere sichere Einschätzung widerlegt.
Konkret hätten drei kostengünstige Prüfungen dieses Paket aufgedeckt, bevor ein Entwickler die Anwendung ausgeführt hätte. Erstens eine Inhaltsprüfung der Anwendungsverzeichnisse auf Zugriff auf lokale Anmeldeinformationsspeicher – Verweise auf os_crypt, Geschützte Daten/DPAPI oder die eines Browsers Login Datum Datei – kennzeichnet die Berechtigung unabhängig davon, welcher Installations-Hook vorhanden ist. Zweitens eine Bereichsprüfung für jede Entschlüsselungs-/Leseroutine, die einen Platzhalterselektor akzeptiert (Filter: '%' und Äquivalente) anstelle eines gebundenen Bezeichners wird die Test-to-Harvest-Inflation erkannt. Drittens: Die Differenzierung der Menge der Hosts, die ein Paket erreichen kann (hier, mcp.szcd-mcp.topDie Überprüfung der in der Dokumentation angegebenen Ziele macht den MCP-Ergebniskanal zu einem überprüfbaren Ausgangspunkt. Für keine dieser Aktionen ist die Ausführung des Codes erforderlich.
Entschlüsselung von Anmeldeinformationen über DPAPI und os_crypt Die Technik ist altbekannt; die Bereitstellung über einen KI-Agenten, der nur im Rahmen eines Opt-in-Workflows aktiviert wird, stellt die neue Methode dar. Mit der zunehmenden Verbreitung von MCP-Tools ist mit einem verstärkten Einsatz dieses „Funktion-in-einem-Skill“-Musters zu rechnen; der Umfang der Überprüfung sollte entsprechend angepasst werden.






