SkillLeak, tyveri av nettleserlegitimasjon via MCP Skill

SkillLeak: En dekrypteringsverktøy for nettleserlegitimasjon levert gjennom en MCP-ferdighet

TL; DR

@szc-ft/mcp-szcd-client er en Model Context Protocol (MCP)-klient publisert til npm som automatisk konfigurerer AI-kodingsassistenter – den typen limpakke en utvikler installerer slik at en IDE-agent kan kommunisere med en komponentbibliotektjeneste. Den har en lang, vanlig utseende utgivelseshistorikk (71-versjoner) og et godartet installasjonstrinn. Ingenting i etterinstallasjonen berører legitimasjonsinformasjonen.

Legitimasjonslesingsatferden ligger ett lag dypere, i en samlet MCP-ferdighet kalt local-browser-testNår den ferdigheten er connect() rutinemessige kjøringer, den påkaller _decryptCredentials() — som dekrypterer alle lagrede passord i den lokale Chrome/Edge-profilen (alle nettsteder, ikke det ene programmet en nettlesertest ville målrette) ved hjelp av Windows Data Protection API (DPAPI) og AES-256-GCM. Det dekrypterte settet skrives i klartekst til ~/.szcd-mcp/deps/decrypted-creds.json og returnert i ferdighetens MCP-verktøyresultat, som flyter til pakkens standard eksterne MCP-server, mcp.szcd-mcp.top.

Dette er et forsyningskjedemønster som er verdt å nevne: Den sensitive funksjonen er ikke i en installasjonshook (der de fleste skannere og anmeldere ser), men i en MCP-ferdighet som bare kjøres når en operatør peker verktøyet mot sin egen nettleser som kjører. Vi kaller det FerdighetslekkasjeMEW klassifiserer @szc-ft/mcp-szcd-client (versjoner 0.38.0 og 0.39.0) som ondsinnet.

Terminnotat — MCP-ferdighet: en selvstendig pakke med instruksjoner og hjelpeskript som en MCP-server eksponerer for en AI-agent som en kallbar funksjon. Agenten kaller den som et verktøy; skriptene kjører på utviklerens maskin.

Angrepsanatomi

Pakken presenterer to svært forskjellige ansikter.

Ansiktet en anmelder ser først er installasjonsstien. Manifestet deklarerer postinstall: node scripts/postinstall.js, og det skriptet gjør akkurat det README sier: det kobler MCP integrasjoner i IDE-er og installerer en søskenpakke, @szc-ft/sketch-mcp-serverDen når aldri legitimasjonskoden. En skanner som stopper ved installasjon. hooks – det historisk sett høyeste signalet å se etter – ser et rent, upåfallende utviklerverktøy. Denne pakken hadde faktisk blitt vurdert som trygg i en tidligere gjennomgang.

Ansiktet som betyr noe nås kun gjennom den medfølgende ferdigheten. Kjeden:

  • En utvikler driver lokal-nettlesertest ferdighet mot en Chrome/Edge-instans startet de med en ekstern feilsøkingsport. Dette er den dokumenterte måten å bruke ferdigheten på.
  • Ferdighetens koble() (lib/nettlesermotor.js) samtaler _decryptCredentials() på linje 246.
  • _decryptCredentials() samtaler dekrypterAllePassord({filter: '%' }). De '%' Filteret er detaljen som gjør en testbekvemmelighet til en innhøsting: det matcher alle lagrede opprinnelser i stedet for det enkelte stedet som testes.
  • lib/dekrypter-passord.js leser nettleserens os_crypt kryptert nøkkel, kjører powershell … ProtectedData::Unprotect (DPAPI) for å gjenopprette AES-nøkkelen, deretter dekrypterer AES-256-GCM hver lagrede legitimasjon.
  • Det fullstendige dekrypterte settet skrives til ~/.szcd-mcp/deps/dekrypterte-creds.json i klartekst og returnert som ferdighetens MCP-verktøy resultat.
  • Det resultatet går tilbake over MCP-kanalen til pakkens standardserver, mcp.szcd-mcp.topp — den samme verten som er dokumentert i README og i scripts/lib/common.js.

En kort merknad om hvorfor trinn 4 i det hele tatt fungerer. På Windows lagrer ikke Chrome og Edge lagrede passord i klartekst: hver legitimasjon er kryptert med en AES-256-GCM-nøkkel, og den nøkkelen er i seg selv forseglet med DPAPI, som binder den til den gjeldende brukerkontoen. Det tar derfor to trinn å gjenopprette et passord – først ProtectedData::Unprotect for å gjenopprette AES-nøkkelen (som lykkes fordi koden kjører som den innloggede brukeren, nøyaktig den konteksten en utviklers terminal oppgir), deretter en GCM-dekryptering av hver lagrede blob som leses fra nettleserens os_crypt-beskyttet butikk. Dette er godt forstått, frakoblet og stille: ingen forespørsel om hovedpassord, ingen nettleserinteraksjon, ingen nettverkstur før resultatene er videresendt. Det er den samme primitive funksjonen som mange råvareinfotyvere bruker – nyheten her er bare innpakningen som bærer den.

Dekrypteringsprogrammet er ikke tilfeldigDen er samlet tre ganger – under standard-ferdighet/, åpenkode-utvidelse/og qwen-utvidelse/ – én kopi per støttet AI-assistentoverflate, slik at funksjonaliteten følger med den assistenten utvikleren har koblet til.

Kontrasten med en legitim nettlesertest-auto-login er hele historien. En ekte testhjelper dekrypterer legitimasjonen for en applikasjon det er utøvecising, bruker det i prosessen, og lagrer eller videresender det aldri. Her dekrypterer rutinen alt, skriver det til disk i klartekst og returnerer det over en nettverksgrense til en ekstern server.

Tidslinje og utløser 

To atferder er viktige for å forstå eksponering.

Utløseren er påmelding, ikke automatisk. Installering av pakken leser ingen påloggingsinformasjon. Dekrypteringen kjører bare når en utvikler aktivt aktiverer lokal-nettlesertest ferdighet mot en nettleser de har startet i fjernfeilsøkingsmodus. Det begrenser i betydelig grad hvem som blir berørt sammenlignet med en etterinstallasjon nyttelast som skyter på hver npm installasjon.

Emballasjen er moden, ikke engangsbruk. Utgiveren har levert 71 versjoner og opprettholder en bredere @szc-ft MCP-pakke for komponentbibliotek. Legitimasjonsdekrypteringsprogrammet finnes i begge flaggede versjoner (0.38.0 og 0.39.0) med et identisk fingeravtrykk, påkalt fra samme nettlesermotor.js:246 inngangspunkt. Pakken er fortsatt aktiv på npm i skrivende stund.

Den kombinasjonen – en etablert utgiver, et godartet installasjonstrinn og en funksjon som bare aktiveres under en spesifikk arbeidsflyt for påmelding – er nettopp grunnen til at en automatisert klassifiserer forutså «trygt», og en tidligere gjennomgang var enig. Oppførselen løser seg bare ved manuell lesing av ferdighetens hjelpeskript.

Indikatorer for kompromiss

typenIndikator
Pakke@szc-ft/mcp-szcd-client (npm) — versjoner 0.38.0, 0.39.0
NetworkStandard ekstern MCP-server mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18)
Fil (sleppet)~/.szcd-mcp/deps/decrypted-creds.json — dekrypterte legitimasjonsdetaljer i klartekst
Fil (nyttelast).../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (følger med) standard-skill/, opencode-extension/, qwen-extension/)
Behavioralbrowser-engine.js:246 _decryptCredentials() → decryptAllPasswords({ filter: '%' }) (omfang for hele nettstedet)
BehavioralLeser Chrome/Edge os_crypt nøkkel; krever en nettleser som startes med --remote-debugging-port
Installer krokpostinstall: node scripts/postinstall.js - godartet (IDE MCP-konfigurasjon + installasjon av sibling-pakke); når ikke dekrypteringsprogrammet

Revisjon av forsvarere MCP-verktøy bør behandle ferdighet katalogen som innenfor omfanget, ikke bare manifest- og installasjonsskriptene.

Attribusjon og observert atferd

Vi beskriver atferd, ikke motiv.

Pakken publiseres under en etablert npm-konto med en sammenhengende flerpakke @szc-ft MCP-pakke og en lang versjonshistorikk. Det finnes ingen dedikert skjult kommando- og kontrollkanal: de dekrypterte legitimasjonsbeskrivelsene returneres gjennom pakkens egen dokumenterte MCP-server, mcp.szcd-mcp.topp, snarere enn til et anonymt leveringspunkt. Installasjonstrinnet er virkelig godartet.

Det som flytter dette fra en «aggressiv bekvemmelighetsfunksjon» til en ondsinnet klassifisering er den observerbare kombinasjonen av omfang og destinasjon: rutinen dekrypterer alle lagrede nettleserlegitimasjon i stedet for det ene programmet en test ville utførecise.g. lagrer dem på disk i klartekst og overfører dem fra verten over MCP-kanalen. En nettlesertest auto-login En funksjon som oppførte seg på denne måten ville i praksis ikke kunne skilles fra innhenting av legitimasjonsinformasjon – og det er effekten en forsvarer må resonnere om.

Vi legger ærlig talt merke til at utløseren er påmelding og at utgiveren er etablert; begge fakta er i protokollen ovenfor. Ingen av delene endrer det observerbare resultatet for en utvikler som kjører ferdigheten: de lagrede passordene for hvert nettsted i nettleserprofilen deres forlater maskinen.

Innvirkning, trender og veiledning fra forsvarere

SkillLeak er en hendelse med én pakke, men leveringsflaten den bruker er poenget.

Bransjens forsyningskjedereflekser er innstilt på utførelse på installasjonstidspunktet: forhåndsinstallering/etterinstallasjon hooks, avhengighetsforvirringsbeacons, typosquats med nyttelast i index.js. MCP endrer geometrienEn MCP-pakke kan sende et manifest og installasjonstrinn som er helt rene, samtidig som de bærer dens følgevirkemåte i en ferdighet – en pakke som AI-agenten aktiverer senere, på utviklerens egen instruksjon, mot utviklerens egne ressurser. Funksjonen følger med assistentintegrasjonen og ligger inaktiv inntil en normal arbeidsflyt («kjør nettlesertesten») aktiverer den.

For team som tar i bruk MCP-verktøy:

  • Revisjonsferdigheter, ikke bare manifester. Utvid pakkegjennomgangen til ferdigheter/, *-utvidelse/, og tilsvarende mapper. Den mest sensitive koden dukker kanskje aldri opp i en installasjonshook.
  • Se opp for inflasjon av omfanget. En funksjon som hevder et snevert formål (test én app), men som opererer bredt (filter: '%' over alle lagrede opprinnelser) er et rødt flagg uavhengig av intensjon.
  • Behandle MCP-verktøyresultater som en utgangskanal. Data som returneres fra en ferdighet forlater verten til den MCP-serveren klienten er konfigurert for. Lag en inventar av disse destinasjonene på samme måte som du ville gjort med en hvilken som helst utgående tilkobling.
  • Gjennomgå versjonsfeil av «pålitelige» MCP-pakker på nytt. En etablert utgiver og en lang utgivelseshistorikk er ikke en erstatning for å lese koden som følger med i hver versjon – noe denne saken, som reverserer en tidligere sikkerhetsvurdering, viser.

Konkret ville tre rimelige kontroller ha dukket opp denne pakken før en utvikler kjørte ferdigheten. Først en innholdsskanning av ferdighetskataloger for tilgang til lokalt legitimasjonslager – referanser til os_crypt, Beskyttede data/DPAPI, eller en nettlesers Login Data fil — flagger funksjonen uavhengig av hvilken installasjonshook som finnes. For det andre, en omfangssjekk av enhver dekrypterings-/leserutine som aksepterer en jokertegnvelger (filter: '%' og ekvivalenter) i stedet for at en bundet identifikator fanger opp test-til-høst-inflasjonen. For det tredje, å forskjelliggjøre settet med verter en pakke kan nå (her, mcp.szcd-mcp.topp) mot destinasjonene dokumentasjonen hevder å trenge gjør MCP-resultatkanalen til et reviderbart utgangspunkt. Ingen av disse krever kjøring av koden.

Dekryptering av legitimasjon via DPAPI og os_crypt er en gammel teknikk; å levere den gjennom en AI-agentferdighet som bare utløses under en opt-in-arbeidsflyt er den nye innpakningen. Forvent mer av «funksjonalitet-i-en-ferdighet»-mønsteret etter hvert som MCP-verktøy sprer seg, og juster gjennomgangsomfanget deretter. 

sca-tools-programvare-verktøy for komposisjonsanalyse
Prioriter, utbedre og sikre programvarerisikoene dine
Få din gratis konto.
Ingen kredittkort kreves.

Sikre programvareutviklingen og -leveringen din

med Xygeni-produktpakken