TL; DR
@szc-ft/mcp-szcd-client is in Model Context Protocol (MCP) kliïnt publisearre oan npm dy't automatysk AI-kodearringsassistinten konfigurearret - it soarte lijmpakket dat in ûntwikkelder ynstalleart, sadat in IDE-agent kin prate mei in komponintbibleteektsjinst. It hat in lange, gewoan útsjende releasehistoarje (71 ferzjes) en in goedaardige ynstallaasjestap. Neat yn 'e neiynstallaasje rekket de ynloggegevens oan.
It gedrach foar it lêzen fan referinsjes libbet ien laach djipper, yn in bondele MCP-feardigens neamd local-browser-testAs dy feardigens connect() routineútfieringen, it ropt op _decryptCredentials() — dy't ûntsiferet elk bewarre wachtwurd yn it lokale Chrome/Edge-profyl (alle siden, net de ienige applikaasje dy't in browsertest op it each soe hawwe) mei de Windows Data Protection API (DPAPI) en AES-256-GCM. De ûntsifere set wurdt yn platte tekst skreaun nei ~/.szcd-mcp/deps/decrypted-creds.json en weromjûn binnen it MCP-arkresultaat fan 'e feardigens, dat nei de standert MCP-tsjinner op ôfstân fan it pakket streamt, mcp.szcd-mcp.top.
Dit is in supply chain-patroan dat it neamen wurdich is: de gefoelige mooglikheid sit net yn in ynstallaasjehook (wêr't de measte scanners en resinsinten sykje) mar yn in MCP-feardigens dy't allinich útfierd wurdt as in operator it ark nei syn eigen rinnende browser rjochtet. Wy neame it FeardigensLeakMEW klassifisearret @szc-ft/mcp-szcd-client (ferzjes 0.38.0 en 0.39.0) as kwea-aardich.
Termynnota — MCP-feardigens: in selsstannige bondel ynstruksjes en helpskripts dy't in MCP-tsjinner bleatstelt oan in AI-agent as in opropbere mooglikheid. De agent ropt it oan as in ark; de skripts rinne op 'e masine fan' e ûntwikkelder.
Oanfalsanatomy
It pakket presintearret twa hiel ferskillende gesichten.
It gesicht dat in resinsint earst sjocht is it ynstallaasjepad. It manifest ferklearret postinstall: node scripts/postinstall.js, en dat skript docht presys wat de README seit: it bedraadt MCP yntegraasjes yn IDE's en ynstallearret in siblingpakket, @szc-ft/skets-mcp-tsjinnerIt berikt noait de oanmeldkoade. In scanner dy't by de ynstallaasje stoppet. hooks — it histoarysk heechste sinjaalplak om te sykjen — sjocht in skjinne, ûnopmerklike ûntwikkelderstool. Dit pakket wie eins as feilich beoardiele yn in eardere resinsje.
It gesicht dat wichtich is wurdt allinnich berikt fia de bondele feardigens. De keatling:
- In ûntwikkelder rint de lokale-browser-test feardigens tsjin in Chrome/Edge-eksimplaar binne se begûn mei in remote-debugging-poarte. Dit is de dokumintearre manier om de feardigens te brûken.
- De feardigens ferbine() (lib/browser-engine.js) oprop _decryptCredentials() op rigel 246.
- _decryptCredentials() ropt AlleWachtwurden ûntsiferje ({ filter: '%' }). De '%' In filter is it detail dat in testgemak feroaret yn in rispinge: it komt oerien mei elke opsleine oarsprong ynstee fan de ienige side dy't test wurdt.
- lib/decrypt-wachtwurden.js lêst de browser syn os_crypt fersifere kaai, rint powershell … ProtectedData::Unprotect (DPAPI) om de AES-kaai te herstellen, dan ûntsiferet AES-256-GCM elke bewarre ynloggegevens.
- De folsleine ûntsiferde set wurdt skreaun nei ~/.szcd-mcp/deps/dekryptearre-creds.json yn dúdlike tekst en weromjûn as de feardigens MCP-ark resultaat.
- Dat resultaat reizget werom oer it MCP-kanaal nei de standerttsjinner fan it pakket, mcp.szcd-mcp.top — deselde host dokumintearre yn 'e README en yn scripts/lib/common.js.
In koarte notysje oer wêrom't stap 4 hielendal wurket. Op Windows bewarje Chrome en Edge gjin bewarre wachtwurden yn platte tekst: elke ynloggegevens binne fersifere mei in AES-256-GCM-kaai, en dy kaai is sels fersegele mei DPAPI, dy't it oan it hjoeddeiske brûkersaccount bindt. It weromheljen fan in wachtwurd kostet dêrom twa stappen - earst BeskermeData::Unbeskerming om de AES-kaai te herstellen (wat slagget om't de koade rint as de oanmelde brûker, presys de kontekst dy't in terminal fan in ûntwikkelder leveret), dan in GCM-ûntsifering fan elke opsleine blob dy't lêzen wurdt fan 'e browser os_crypt-beskerme winkel. Dit is goed te begripen, offline, en stil: gjin masterwachtwurdprompt, gjin browserynteraksje, gjin netwurkrûnreis oant de resultaten trochstjoerd binne. It is deselde primitive dy't in protte commodity-ynfostealers brûke - de nijichheid hjir is allinich de wrapper dy't it draacht.
De dekrypter is net tafallichIt is trije kear bondele - ûnder standard-feardigens/, iepenkoade-útwreiding/, en qwen-útwreiding/ — ien kopy per stipe AI-assistint-oerflak, sadat de mooglikheid reizget mei hokker assistint de ûntwikkelder ynskeakele hat.
It kontrast mei in legitime browser-test auto-login is it hiele ferhaal. In echte testhelper ûntsiferet de ynloggegevens foar de ien applikaasje it is oefeningcising, brûkt it yn it proses, en hâldt it noait oan of stjoert it troch. Hjir ûntsiferet de routine alles, skriuwt it dúdlik nei skiif, en stjoert it oer in netwurkgrins werom nei in eksterne server.
Tiidline en trigger
Twa gedragingen binne wichtich foar it begripen fan bleatstelling.
De trigger is opt-in, net automatysk. It ynstallearjen fan it pakket lêst gjin ynloggegevens. De ûntsifering rint allinich as in ûntwikkelder aktyf de lokale-browser-test feardigens tsjin in browser dy't se yn remote-debugging-modus lansearre hawwe. Dat ferminderet materieel wa't beynfloede wurdt yn ferliking mei in nei ynstallaasje lading dy't op elke sjit npm ynstallearje.
De ferpakking is folwoeksen, net fuort te smiten. De útjouwer hat 71 ferzjes ferstjoerd en ûnderhâldt in bredere @szc-ft komponintbibleteek MCP-suite. De ûntsleuteling fan oanmeldgegevens is oanwêzich yn beide markearre ferzjes (0.38.0 en 0.39.0) mei in identike fingerprint, oanroppen fanút deselde browser-engine.js:246 yngongspunt. It pakket bliuwt op it momint fan skriuwen live op npm.
Dy kombinaasje - in fêstige útjouwer, in goedaardige ynstallaasjestap, en in mooglikheid dy't allinich wurket ûnder in spesifike opt-in workflow - is krekt wêrom't in automatisearre klassifikator "feilich" foarsei en in eardere resinsje it iens wie. It gedrach ferdwynt allinich troch it manuell lêzen fan 'e helperskripts fan' e feardigens.
Yndikatoaren fan kompromis
| Type | indicator |
|---|---|
| Pakket | @szc-ft/mcp-szcd-client (npm) — ferzjes 0.38.0, 0.39.0 |
| netwurk | Standert MCP-tsjinner op ôfstân mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18) |
| Triem (fallen litten) | ~/.szcd-mcp/deps/decrypted-creds.json — platte tekst ûntsifere ynloggegevens |
| Triem (lading) | .../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (bondele ûnder standard-skill/, opencode-extension/, qwen-extension/) |
| Behavioraal | browser-engine.js:246 _decryptCredentials() → decryptAllPasswords({ filter: '%' }) (berik fan alle siden) |
| Behavioraal | Lês Chrome/Edge os_crypt kaai; fereasket in browser dy't begûn is mei --remote-debugging-port |
| Heak ynstallearje | postinstall: node scripts/postinstall.js - goed (IDE MCP-konfiguraasje + ynstallaasje fan sibling-pakket); berikt de dekrypter net |
Ferdigeners kontrolearje MCP-ark moatte behannelje de Feardigens map as yn-scope, net allinich it manifest- en ynstallaasjeskripts.
Attribúsje en waarnommen gedrach
Wy beskriuwe gedrach, net motyf.
It pakket wurdt publisearre ûnder in fêststeld npm-akkount mei in gearhingjend multi-pakket @szc-ft MCP-suite en in lange ferzjeskiednis. Der is gjin tawijd geheim kommando-en-kontrôlekanaal: de ûntsifere ynloggegevens wurde weromjûn fia de eigen dokumintearre MCP-tsjinner fan it pakket, mcp.szcd-mcp.top, ynstee fan nei in anonym droppunt. De ynstallaasjestap is echt goedaardich.
Wat dit fan "agressive gemakfunksje" nei in kweade klassifikaasje ferpleatst, is de waarnimbere kombinaasje fan berik en bestimming: de routine ûntsiferet allegearre bewarre browsergegevens ynstee fan de ienige applikaasje dy't in test soe útfierecise., bewarret se yn platte tekst op skiif, en stjoert se fan 'e host oer it MCP-kanaal. In browser-test auto-login In funksje dy't him sa gedroech soe yn feite net te ûnderskieden wêze fan it rispjen fan bewiisbrieven - en it effekt is dêr't in ferdigener oer redenearje moat.
Wy merke earlik sein op dat de trigger opt-in is en de útjouwer fêststeld is; beide feiten steane yn it boppesteande rekord. Gjin fan beide feroaret it waarnimbere resultaat foar in ûntwikkelder dy't de feardigens útfiert: de bewarre wachtwurden foar elke side yn har browserprofyl ferlitte de masine.
Ynfloed, trends en begelieding fan ferdigeners
SkillLeak is in ynsidint mei ien pakket, mar it leveringsoppervlak dat it brûkt is it punt.
De refleksen fan 'e supply chain fan' e yndustry binne ôfstimd op útfiering op ynstallaasjetiid: foarôf ynstallearje/nei ynstallaasje hooks, ôfhinklikheidsbetizingsbakens, typosquats mei in lading yn index.js. MCP feroaret de geometryIn MCP-pakket kin in manifest en ynstallaasjestap ferstjoere dy't folslein skjin binne, wylst se it gefolchgedrach binnen in ... drage. Feardigens — in bondel dy't de AI-agent letter oanropt, op eigen ynstruksje fan 'e ûntwikkelder, tsjin de eigen boarnen fan 'e ûntwikkelder yn. De mooglikheid giet mei de assistint-yntegraasje en leit sliepend oant in normaal útsjende workflow ("run the browser test") it aktivearret.
Foar teams dy't MCP-ark oannimme:
- Auditfeardigens, net allinich manifesten. Pakketbeoardieling útwreidzje nei de feardigens/, *-útwreiding/, en lykweardige mappen. De gefoelichste koade ferskynt miskien noait yn in ynstallaasjehook.
- Pas op foar ynflaasje fan 'e omfang. In mooglikheid dy't in smel doel beweart (test ien app) mar breed wurket (filter: '%' oer alle opsleine oarsprong) is in reade flagge ûnôfhinklik fan bedoeling.
- Behannelje MCP-arkresultaten as in útgongskanaal. Gegevens dy't weromjûn wurde fan in feardigens ferlitte de host nei hokker MCP-tsjinner de kliïnt ek foar konfigurearre is. Ynventarisearje dy bestimmingen lykas jo dat soene dwaan mei elke útgeande ferbining.
- Besjoch ferzjebumps fan "fertroude" MCP-pakketten opnij. In fêstige útjouwer en in lange útjefteskiednis binne gjin ferfanging foar it lêzen fan 'e koade dy't yn elke ferzje wurdt levere - lykas dizze saak, dy't in eardere feilige beoardieling omkeart, oantoant.
Konkreet soene trije goedkeape kontrôles dit pakket oan it ljocht brocht hawwe foardat in ûntwikkelder de feardigens útfierde. Earst in ynhâldsscan fan feardigensmappen foar tagong ta lokale credential stores - ferwizings nei os_crypt, Beskerme gegevens/DPAPI, of in browser syn Login Data triem - markearret de mooglikheid, nettsjinsteande hokker ynstallaasjeheak bestiet. Twadde, in omfangskontrôle op elke ûntsifer-/lêsroutine dy't in wildcard-selektor akseptearret (filter: '%' en ekwivalinten) ynstee fan in bûne identifier dy't de test-to-harvest-ynflaasje fangt. Tredde, it ferskillen fan 'e set hosts dy't in pakket berikke kin (hjir, mcp.szcd-mcp.top) tsjin de bestimmingen dy't neffens de dokumintaasje nedich is, feroaret it MCP-resultaatkanaal yn in kontrolearber útgongspunt. Gjin fan dizze fereasket it útfieren fan de koade.
Dekryptering fan oanmeldgegevens fia DPAPI en os_crypt is in âlde technyk; it leverjen fia in AI-agentfeardigens dy't allinich aktivearre wurdt ûnder in opt-in workflow is de nije wrapper. Ferwachtsje mear fan it kapasiteit-yn-in-feardigenspatroan as MCP-tooling ferspraat wurdt, en pas de beoardielingsberik oan dêrop oan.





