TL; DR
@szc-ft/mcp-szcd-client is een Model Context Protocol (MCP)-client die is gepubliceerd op npm en die AI-codeerassistenten automatisch configureert — het soort pakket dat ontwikkelaars installeren zodat een IDE-agent kan communiceren met een componentbibliotheekservice. Het heeft een lange, ogenschijnlijk gewone releasegeschiedenis (71 versies) en een probleemloze installatiestap. Niets in de postinstallatie heeft betrekking op inloggegevens.
Het gedrag met betrekking tot het lezen van referenties bevindt zich een niveau dieper, in een gebundelde MCP-vaardigheid genaamd local-browser-testWanneer die vaardigheid connect() De routine wordt uitgevoerd en roept aan... _decryptCredentials() — wat decodeert elk opgeslagen wachtwoord in het lokale Chrome/Edge-profiel (alle sites, niet de enkele applicatie waarop een browsertest zich zou richten) met behulp van de Windows Data Protection API (DPAPI) en AES-256-GCM. De onversleutelde gegevens worden in platte tekst weggeschreven naar ~/.szcd-mcp/deps/decrypted-creds.json en wordt teruggestuurd binnen het MCP-toolresultaat van de vaardigheid, dat vervolgens naar de standaard externe MCP-server van het pakket wordt verzonden. mcp.szcd-mcp.top.
Dit is een toeleveringsketenpatroon dat het benoemen waard is: De gevoelige functionaliteit bevindt zich niet in een installatiehaak. (waar de meeste scanners en reviewers naar kijken), maar in een MCP-vaardigheid die alleen wordt uitgevoerd wanneer een operator de tool richt op zijn eigen actieve browser. We noemen het VaardigheidslekMEW classificeert @szc-ft/mcp-szcd-client (versies 0.38.0 en 0.39.0) als kwaadaardig.
Termijnnotitie — MCP-vaardigheidEen zelfstandige bundel instructies en hulpscripts die een MCP-server beschikbaar stelt aan een AI-agent als een aanroepbare functionaliteit. De agent roept deze aan als een tool; de scripts worden uitgevoerd op de computer van de ontwikkelaar.
Aanvalsanatomie
De verpakking toont twee heel verschillende kanten.
Het gezicht dat een recensent als eerste ziet. is het installatiepad. Het manifest verklaart postinstall: node scripts/postinstall.jsEn dat script doet precies wat er in de README staat: het verbindt de draden. MCP integraties in IDE's en installatie van een verwant pakket. @szc-ft/sketch-mcp-serverHet bereikt nooit de inlogcode. Een scanner die stopt bij de installatie. hooks — de plek waar historisch gezien het sterkste signaal te vinden is — toont een overzichtelijke, onopvallende ontwikkelaarstool. Dit pakket was in een eerdere beoordelingsronde zelfs al als veilig beoordeeld.
Het gezicht dat ertoe doet wordt alleen bereikt via de gebundelde vaardigheid. De keten:
- Een ontwikkelaar voert de lokale browsertest De skill wordt gebruikt tegen een Chrome/Edge-instantie die is gestart met een poort voor debuggen op afstand. Dit is de gedocumenteerde manier om de skill te gebruiken.
- De vaardigheid aansluiten() (lib/browser-engine.js) oproepen _decryptCredentials() op regel 246.
- _decryptCredentials() gesprekken decryptAllPasswords({ filter: '%' }). De '%' Het filter is het detail dat van een testgemak een succesvolle oogst maakt: het vergelijkt elke opgeslagen bron in plaats van alleen de te testen locatie.
- lib/decrypt-passwords.js leest de browser os_crypt versleutelde sleutel, voert uit PowerShell … ProtectedData::Unprotect (DPAPI) om de AES-sleutel te herstellen, waarna AES-256-GCM elke opgeslagen referentie decodeert.
- De volledige onversleutelde gegevensset wordt weggeschreven naar ~/.szcd-mcp/deps/decrypted-creds.json in platte tekst en geretourneerd als de vaardigheid MCP-tool resultaat.
- Dat resultaat wordt via het MCP-kanaal teruggestuurd naar de standaardserver van het pakket. mcp.szcd-mcp.top — dezelfde host die in de README en in scripts/lib/common.js.
Een korte toelichting waarom stap 4 überhaupt werkt. Op Windows slaan Chrome en Edge opgeslagen wachtwoorden niet in platte tekst op: elke inloggegevens worden versleuteld met een AES-256-GCM-sleutel, en die sleutel zelf wordt verzegeld met DPAPI, waardoor deze aan het huidige gebruikersaccount wordt gekoppeld. Het herstellen van een wachtwoord vereist daarom twee stappen: eerst ProtectedData::Unprotect om de AES-sleutel te herstellen (wat lukt omdat de code wordt uitgevoerd als de ingelogde gebruiker, precies de context die een ontwikkelaarsterminal biedt), vervolgens een GCM-decryptie van elke opgeslagen blob die uit de browser is gelezen. os_crypt-beveiligde opslag. Dit is een bekende, offline en stille methode: geen prompt voor een hoofdwachtwoord, geen browserinteractie, geen netwerkverkeer totdat de resultaten zijn doorgestuurd. Het is dezelfde primitieve methode die veel commerciële informatiedieven gebruiken — de nieuwigheid zit hem alleen in de verpakking.
De decryptor is geen bijzaak.Het is driemaal gebundeld — onder standard-vaardigheid/, opencode-extensie/en qwen-extensie/ — één exemplaar per ondersteund AI-assistent-oppervlak, zodat de functionaliteit meebeweegt met elke assistent die de ontwikkelaar heeft aangesloten.
Het contrast met een legitieme browsertest auto-login Dat is het hele verhaal. Een echte testhelper decodeert de inloggegevens voor de een toepassing het is oefeningcisDe routine gebruikt de gegevens intern en slaat ze nooit op of stuurt ze door. Hier decodeert de routine alles, schrijft het onversleuteld naar de schijf en stuurt het via een netwerkverbinding terug naar een externe server.
Tijdlijn en trigger
Twee gedragingen zijn van belang voor het begrijpen van blootstelling.
De trigger is opt-in, niet automatisch. Bij het installeren van het pakket worden geen inloggegevens gelezen. De decryptie wordt alleen uitgevoerd wanneer een ontwikkelaar de decryptie actief uitvoert. lokale browsertest vaardigheid tegen een browser die ze in de modus voor foutopsporing op afstand hebben gestart. Dat beperkt de groep die getroffen wordt aanzienlijk in vergelijking met een na installatie lading die bij elke npm installeren.
De verpakking is degelijk, niet voor de lol. De uitgever heeft 71 versies uitgebracht en onderhoudt een breder assortiment. @szc-ft componentbibliotheek MCP-suite. De referentiedecryptor is aanwezig in beide gemarkeerde versies (0.38.0 en 0.39.0) met een identieke vingerafdruk en wordt aangeroepen vanuit dezelfde bron. browser-engine.js:246 instappunt. Het pakket is op het moment van schrijven nog steeds beschikbaar op npm.
Die combinatie — een gevestigde uitgever, een onschadelijke installatiestap en een functionaliteit die alleen wordt geactiveerd onder een specifieke opt-in-workflow — is precies de reden waarom een geautomatiseerde classificator "veilig" voorspelde en een eerdere beoordeling dit bevestigde. Het probleem wordt alleen opgelost door de hulpscripts van de skill handmatig te lezen.
Indicatoren van compromis
| Type | Indicator |
|---|---|
| Pakket | @szc-ft/mcp-szcd-client (npm) — versies 0.38.0, 0.39.0 |
| Netwerk | Standaard externe MCP-server mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18) |
| Bestand (gedropt) | ~/.szcd-mcp/deps/decrypted-creds.json — onversleutelde inloggegevens |
| Bestand (payload) | .../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (gebundeld onder standard-skill/, opencode-extension/, qwen-extension/) |
| Behavioral | browser-engine.js:246 _decryptCredentials() → decryptAllPasswords({ filter: '%' }) (bereik van de gehele locatie) |
| Behavioral | Leest Chrome/Edge os_crypt sleutel; vereist een browser die is gestart met --remote-debugging-port |
| Haak installeren | postinstall: node scripts/postinstall.js - goedaardig (IDE MCP-configuratie + installatie van verwante pakketten); bereikt de decryptor niet |
Audit van de verdedigers MCP-gereedschap zou de bekwaamheid De directory moet binnen het toepassingsgebied vallen, niet alleen het manifest en de installatiescripts.
Toeschrijving en waargenomen gedrag
We beschrijven gedrag, niet motief.
Het pakket is gepubliceerd onder een bestaand npm-account met een samenhangende multi-package-structuur. @szc-ft MCP-suite en een lange versiegeschiedenis. Er is geen speciaal, verborgen commando- en controlekanaal: de onversleutelde inloggegevens worden teruggestuurd via de eigen, gedocumenteerde MCP-server van het pakket. mcp.szcd-mcp.top, in plaats van naar een anoniem afleverpunt. De installatiestap is echt onschadelijk.
Wat dit van een "agressieve gemaksfunctie" tot een kwaadaardige classificatie maakt, is de waarneembare combinatie van bereik en bestemming: de routine decodeert allen opgeslagen browsergegevens in plaats van de enkele applicatie die een test zou gebruikencise, slaat ze op in platte tekst op de schijf en verzendt ze van de host via het MCP-kanaal. Een browsertest auto-login Een functie die zich op deze manier gedraagt, zou in feite niet te onderscheiden zijn van het verzamelen van inloggegevens – en dat effect is waar een verdediger over moet nadenken.
We merken eerlijk op dat de trigger opt-in is en dat de uitgever bekend is; beide feiten staan in het bovenstaande document. Geen van beide verandert het waarneembare resultaat voor een ontwikkelaar die de skill uitvoert: de opgeslagen wachtwoorden voor elke site in hun browserprofiel verlaten de computer.
Impact, trends en richtlijnen voor verdedigers
SkillLeak is een incident met één enkel pakket, maar de manier waarop het wordt verspreid, is juist het punt.
De toeleveringsketens van de industrie zijn erop gericht om installaties zo snel mogelijk te realiseren: vooraf installeren/na installatie hooks, afhankelijkheidsverwarringsbakens, typosquats met een payload in index.js. MCP verandert de geometrie.Een MCP-pakket kan een manifest en installatiestap leveren die volledig schoon zijn, terwijl het de daaruit voortvloeiende functionaliteit binnen een bepaalde structuur behoudt. bekwaamheid — een pakket dat de AI-agent later aanroept, op instructie van de ontwikkelaar en met gebruikmaking van diens eigen resources. De functionaliteit wordt meegeleverd met de assistent-integratie en blijft inactief totdat een ogenschijnlijk normale workflow ("voer de browsertest uit") deze activeert.
Voor teams die MCP-tools gebruiken:
- Auditvaardigheden, niet alleen uiterlijke kenmerken. Breid de pakketbeoordeling uit naar de vaardigheden/, *-verlenging/en vergelijkbare mappen. De meest gevoelige code zal mogelijk nooit in een installatiehook voorkomen.
- Let op voor een toename van het aantal beschikbare opties. Een functionaliteit die een specifiek doel claimt (één app testen), maar breed inzetbaar is (filter: '%' (over alle opgeslagen oorsprongen) is een waarschuwingssignaal, ongeacht de intentie.
- Beschouw de resultaten van de MCP-tool als een uitgaand kanaal. Gegevens die door een skill worden teruggestuurd, verlaten de host en gaan naar de MCP-server waarvoor de client is geconfigureerd. Registreer deze bestemmingen op dezelfde manier als elke andere uitgaande verbinding.
- Controleer de versie-updates van de "vertrouwde" MCP-pakketten opnieuw. Een gevestigde uitgever en een lange releasegeschiedenis zijn geen vervanging voor het lezen van de code die in elke versie wordt meegeleverd – zoals deze zaak, die een eerdere beoordeling als veilig terugdraait, aantoont.
Concreet zouden drie goedkope controles dit pakket aan het licht hebben gebracht voordat een ontwikkelaar de skill zou uitvoeren. Ten eerste een inhoudsscan van skilldirectory's op toegang tot lokale referentieopslag — verwijzingen naar os_crypt, Beschermde gegevens/DPAPI, of een browser Login Data bestand — markeert de mogelijkheid ongeacht welke installatiehook bestaat. Ten tweede, een controle van het bereik op elke decryptie-/leesroutine die een wildcard-selector accepteert (filter: '%' en equivalenten) in plaats van een gebonden identificator voorkomt de inflatie van test-naar-oogst. Ten derde, het vergelijken van de set hosts die een pakket kan bereiken (hier, mcp.szcd-mcp.top) tegen de bestemmingen die volgens de documentatie nodig zijn, wordt het MCP-resultaatkanaal een controleerbaar uitgangspunt. Voor geen van deze opties is het nodig om de code uit te voeren.
Decryptie van inloggegevens via DPAPI en os_crypt Het is een oude techniek; het aanbieden ervan via een AI-agentvaardigheid die alleen wordt geactiveerd binnen een opt-in-workflow is de nieuwe manier. Verwacht meer van het patroon waarbij mogelijkheden in een vaardigheid worden geïntegreerd naarmate MCP-tools zich verspreiden, en pas de reikwijdte van de beoordeling daarop aan.



