SkillLeak, furtul de acreditări de browser prin intermediul MCP Skill

SkillLeak: Un decriptor de credențiale de browser livrat printr-o abilitate MCP

TL; DR

@szc-ft/mcp-szcd-client este un client Model Context Protocol (MCP) publicat pe npm care configurează automat asistenții de codare AI - tipul de pachet glue pe care un dezvoltator îl instalează pentru ca un agent IDE să poată comunica cu un serviciu de bibliotecă de componente. Are un istoric de lansări lung și obișnuit (Versiunile 71) și un pas de instalare benign. Nimic din procesul de postinstalare nu atinge acreditările.

Comportamentul de citire a acreditărilor se află la un nivel mai profund, într-o abilitate MCP inclusă, numită local-browser-testCând acea abilitate este connect() rulări de rutină, invocă _decryptCredentials() — care decriptează fiecare parolă salvată în profilul local Chrome/Edge (toate site-urile, nu singura aplicație pe care ar viza-o un test de browser) utilizând API-ul Windows Data Protection (DPAPI) și AES-256-GCM. Setul decriptat este scris în text simplu pentru a ~/.szcd-mcp/deps/decrypted-creds.json și returnat în rezultatul instrumentului MCP al abilității, care este transmis către serverul MCP la distanță implicit al pachetului, mcp.szcd-mcp.top.

Acesta este un model de lanț de aprovizionare care merită denumit: capacitatea sensibilă nu se află într-un hook de instalare (unde caută majoritatea scanerelor și recenzorilor), dar într-o abilitate MCP care se execută doar atunci când un operator indică instrumentul către propriul browser care rulează. O numim SkillLeakMEW clasifică @szc-ft/mcp-szcd-client (versiuni 0.38.0 și 0.39.0) ca fiind rău intenționat.

Notă privind termenul — Abilitate MCPun pachet autonom de instrucțiuni și scripturi auxiliare pe care un server MCP le expune unui agent AI ca o capacitate apelabilă. Agentul o invocă ca un instrument; scripturile rulează pe mașina dezvoltatorului.

Anatomia atacului

Pachetul prezintă două fețe foarte diferite.

Fața pe care o vede prima recenzentă este calea de instalare. Manifestul declară postinstalare: scripturi nod/postinstall.js, iar scriptul respectiv face exact ce spune README-ul: conectează cabluri MCP integrări în IDE-uri și instalează un pachet similar, @szc-ft/sketch-mcp-serverNu ajunge niciodată la codul de acreditare. Un scaner care se oprește la instalare hooks — locul cu cel mai mare semnal din punct de vedere istoric — vede un instrument de dezvoltare curat și banal. Acest pachet fusese de fapt evaluat ca fiind sigur într-o evaluare anterioară.

Fața care contează se atinge doar prin intermediul abilității incluse în pachet. Lanțul:

  • Un dezvoltator rulează test-browser-local abilitate împotriva unei instanțe Chrome/Edge, au început cu un port de depanare la distanță. Aceasta este modalitatea documentată de utilizare a abilității.
  • Abilitățile conectați () (lib/browser-engine.js) apeluri _decryptCredentials() la linia 246.
  • _decryptCredentials() Apeluri decryptAllPasswords({ filtru: '%' }). „%” Filtrul este detaliul care transformă o comoditate de testare într-o recoltă: se potrivește cu fiecare origine stocată, mai degrabă decât cu un singur loc testat.
  • lib/decrypt-passwords.js citește browserul os_crypt cheie criptată, rulează powershell … ProtectedData::Unprotect (DPAPI) pentru a recupera cheia AES, apoi AES-256-GCM decriptează fiecare acreditare salvată.
  • Setul complet decriptat este scris în ~/.szcd-mcp/deps/decrypted-creds.json în text clar și returnat ca abilității Instrument MCP rezultat.
  • Rezultatul respectiv este transmis înapoi prin canalul MCP către serverul implicit al pachetului, mcp.szcd-mcp.top — aceeași gazdă documentată în README și în scripturi/lib/common.js.

O scurtă notă despre motivul pentru care pasul 4 funcționează. Pe Windows, Chrome și Edge nu stochează parolele salvate în text simplu: fiecare acreditare este criptată cu o cheie AES-256-GCM, iar cheia respectivă este sigilată cu DPAPI, care o leagă de contul de utilizator curent. Prin urmare, recuperarea unei parole necesită două etape - mai întâi ProtectedData::Deprotejare pentru a recupera cheia AES (ceea ce reușește deoarece codul rulează ca utilizator conectat, exact contextul furnizat de terminalul unui dezvoltator), apoi o decriptare GCM a fiecărui blob stocat citit din browser os_crypt-magazin protejat. Acest lucru este bine înțeles, offline și silențios: fără solicitare de parolă principală, fără interacțiune cu browserul, fără schimb de rețele până când rezultatele nu sunt transmise mai departe. Este aceeași primitivă folosită de mulți hoți de informații de marfă - noutatea aici este doar ambalajul care îl conține.

Decriptorul nu este accidentalEste inclus în pachet de trei ori — sub standard-îndemânare/, extensie-cod-oppen/ și extensie qwen/ — o copie per suprafață asistent AI compatibilă, astfel încât funcționalitatea este disponibilă împreună cu asistentul configurat de dezvoltator.

Contrastul cu un test automat legitim al browseruluilogin este întreaga poveste. Un adevărat instrument de testare decriptează acreditările pentru unu aplicație este exercițiucising, îl folosește în proces și nu îl persistă și nu îl transmite niciodată. Aici, rutina decriptează totul, scrie totul pe disc în mod clar și îl returnează peste granița unei rețele către un server la distanță.

Cronologie și declanșator 

Două comportamente sunt importante pentru înțelegerea expunerii.

Declanșatorul este opțional, nu automat. Instalarea pachetului nu citește nicio acreditare. Decriptarea rulează numai atunci când un dezvoltator invocă activ test-browser-local competență împotriva unui browser pe care l-au lansat în modul de depanare la distanță. Acest lucru restrânge semnificativ cine este afectat în comparație cu un postinstalare sarcina utilă care se declanșează la fiecare npm install.

Ambalajul este matur, nu de unică folosință. Editorul a lansat 71 de versiuni și menține o gamă mai largă @szc-ft suită MCP cu biblioteci de componente. Decriptorul de credențiale este prezent în ambele versiuni semnalizate (0.38.0 și 0.39.0) cu o amprentă identică, invocată din aceeași browser-engine.js:246 punct de intrare. Pachetul rămâne live pe npm în momentul scrierii acestui articol.

Această combinație — un editor consacrat, un pas de instalare benign și o funcționalitate care se declanșează doar în cadrul unui anumit flux de lucru cu opțiune de înscriere — este exact motivul pentru care un clasificator automat a prezis „sigur”, iar o analiză anterioară a confirmat. Comportamentul se rezolvă doar prin citirea manuală a scripturilor auxiliare ale abilității.

Indicatori de compromis

TipIndicator
Pachet@szc-ft/mcp-szcd-client (npm) — versiuni 0.38.0, 0.39.0
ReţeaServer MCP la distanță implicit mcp.szcd-mcp.top (README.md, scripts/lib/common.js:18)
Fișier (eliminat)~/.szcd-mcp/deps/decrypted-creds.json — acreditări decriptate în text simplu
Fișier (sarcină utilă).../local-browser-test/lib/decrypt-passwords.js — DPAPI ProtectedData::Unprotect + AES-256-GCM (inclusiv sub standard-skill/, opencode-extension/, qwen-extension/)
Comportamentalbrowser-engine.js:246 _decryptCredentials() → decryptAllPasswords({ filter: '%' }) (acoperire pentru întregul site)
ComportamentalCitește Chrome/Edge os_crypt cheie; necesită un browser pornit cu --remote-debugging-port
Instalați cârligulpostinstall: node scripts/postinstall.js - benign (configurație IDE MCP + instalare pachet sibling); nu ajunge la decriptor

Auditarea apărătorilor Scule MCP ar trebui să trateze calificare directorul ca fiind în domeniul de aplicare, nu doar manifestul și scripturile de instalare.

Atribuire și comportament observat

Descriem comportamentul, nu motivația.

Pachetul este publicat sub un cont npm stabilit, cu un pachet multiplu coerent. @szc-ft Suită MCP și un istoric lung al versiunilor. Nu există un canal dedicat de comandă și control ascuns: datele de autentificare decriptate sunt returnate prin intermediul propriului server MCP documentat al pachetului, mcp.szcd-mcp.top, mai degrabă decât către un punct de descărcare anonim. Pasul de instalare este într-adevăr benign.

Ceea ce transformă această clasificare dintr-o „caracteristică agresivă de confort” într-o clasificare malițioasă este combinația observabilă dintre domeniul de aplicare și destinație: rutina decriptează toate credențialele de browser salvate, mai degrabă decât singura aplicație pe care ar exercita-o un testcise., le salvează pe disc în text simplu și le transmite de pe gazdă prin canalul MCP. Un test automat al browseruluilogin O caracteristică care s-ar comporta în acest fel ar fi, în fapt, imposibil de distins de recoltarea acreditărilor - iar efectul este ceea ce un apărător trebuie să considere.

Observăm cu sinceritate că declanșatorul este opțiunea de înscriere, iar editorul este deja stabilit; ambele fapte sunt menționate mai sus. Niciunul dintre acestea nu schimbă rezultatul observabil pentru un dezvoltator care rulează abilitatea: parolele salvate pentru fiecare site din profilul său de browser părăsesc mașina.

Impact, tendințe și îndrumări pentru apărare

SkillLeak este un incident care afectează un singur pachet, dar suprafața de livrare pe care o folosește este esențială.

Reflexele lanțului de aprovizionare al industriei sunt adaptate la execuția în timpul instalării: preinstalare/postinstalare hooks, balize de confuzie a dependenței, typosquats cu o sarcină utilă în index.js. MCP modifică geometriaUn pachet MCP poate livra un manifest și un pas de instalare care sunt complet curate, în timp ce își mențin comportamentul consecvent în interiorul unui calificare — un pachet pe care agentul de inteligență artificială îl invocă ulterior, la instrucțiunile proprii ale dezvoltatorului, pe baza resurselor proprii ale acestuia. Capacitatea este inclusă odată cu integrarea asistentului și rămâne inactivă până când este activată de un flux de lucru cu aspect normal („rulează testul browserului”).

Pentru echipele care adoptă instrumente MCP:

  • Abilități de audit, nu doar manifeste. Extindeți revizuirea pachetului la abilități/, *-extensie/și directoare echivalente. Cel mai sensibil cod s-ar putea să nu apară niciodată într-un hook de instalare.
  • Atenție la umflarea lunetei. O capacitate care pretinde un scop restrâns (testarea unei aplicații), dar funcționează pe scară largă (filtru: '%' asupra tuturor originilor stocate) este un semnal de alarmă independent de intenție.
  • Tratați rezultatele instrumentului MCP ca un canal de ieșire. Datele returnate de la o competență părăsesc gazda către serverul MCP pentru care este configurat clientul. Inventariați aceste destinații așa cum ați face cu orice conexiune de ieșire.
  • Reexaminați modificările de versiune ale pachetelor MCP „de încredere”. Un editor consacrat și un istoric lung al lansărilor nu înlocuiesc citirea codului inclus în fiecare versiune - așa cum demonstrează acest caz, care inversează o evaluare anterioară a siguranței.

Concret, trei verificări ieftine ar fi apărut în acest pachet înainte ca un dezvoltator să ruleze abilitatea. Mai întâi, o scanare a conținutului directoarelor de abilități pentru accesul la depozitul local de acreditări - referințe la os_crypt, Date protejate/DPAPI sau al unui browser Login Date fișier — semnalează capacitatea indiferent de hook-ul de instalare existent. În al doilea rând, o verificare a domeniului de aplicare pentru orice rutină de decriptare/citire care acceptă un selector wildcard (filtru: '%' și echivalente) în loc de un identificator legat, surprinde inflația de tip test-to-harvest. În al treilea rând, diferențierea setului de gazde pe care un pachet le poate atinge (aici, mcp.szcd-mcp.top) față de destinațiile pe care documentația sa pretinde că le are nevoie transformă canalul de rezultate MCP într-un punct de ieșire auditabil. Niciuna dintre acestea nu necesită rularea codului.

Decriptarea acreditărilor prin DPAPI și os_crypt Este o tehnică veche; livrarea ei printr-o abilitate de tip agent AI care se declanșează doar în cadrul unui flux de lucru cu opțiune de înscriere este noul concept. Așteptați-vă la mai mult modelul de capacitate într-o abilitate pe măsură ce instrumentele MCP se răspândesc și ajustați domeniul de revizuire în consecință. 

sca-tools-software-instrumente-de-analiză-a-compoziției
Prioritizați, remediați și securizați riscurile software
Obține-ți contul gratuit.
Nu este necesar un card de credit.

Securizează-ți dezvoltarea și livrarea de software

cu suita de produse Xygeni