Mastra npm 作用域劫持:一个休眠维护者账户毒化了某 AI 智能体框架
2026 年 6 月 17 日,一个被遗忘的贡献者账户重新发布了整个 @mastra npm 作用域——约 142 个包——并注入一个会投放加密货币窃取程序与 RAT 的恶意依赖。根因是失效的凭据,而非零日漏洞。
这是什么?
2026 年 6 月 17 日,攻击者重新发布了整个 @mastra npm 作用域——Mastra 的包命名空间,这是一个流行的开源 TypeScript AI 智能体构建框架——并向每个包注入了一个恶意依赖。被注入的库 easy-day-js 是 dayjs 的仿冒品,其安装钩子会下载并运行一个跨平台的加密货币窃取程序和远程访问木马(RAT)。该入侵当天即被多家厂商披露,包括 Snyk、SafeDep、Endor Labs,以及 JFrog、Socket 和 StepSecurity(经由 The Hacker News)。
未分配任何 CVE,Mastra 的源代码也从未被修改。这不是代码缺陷。立足点是一个休眠的维护者凭据:@mastra 作用域是通过 npm 账户 ehindero 发布的,那是一位真实的 Mastra 前贡献者,其发布权限从未被撤销。npm 不会因不活跃而使作用域权限过期,因此一个失效凭据就足以向命名空间内的每个包推送。正如 Snyk 所总结的,根因在于项目治理卫生,而非零日漏洞。
工作原理
攻击藏在依赖树里,而非源代码里。攻击者先在 2026 年 6 月 16 日发布了一个干净且功能完整的 easy-day-js@1.11.21——一个逐字节仿冒 dayjs 的版本,连内置的 dayjs.min.js 和包描述都一致——用作掩护。次日约 6 月 17 日 01:01 UTC,他们发布了携带恶意代码的 easy-day-js@1.11.22,并打上 latest 标签。每个被毒化的 @mastra 版本都在其发布的 package.json 中恰好加了一行:
"easy-day-js": "^1.11.21"
脱字号(caret)范围正是诡计所在:1.11.22 满足 ^1.11.21,因此普通的 npm install 会直接解析到被武器化的版本。该依赖从未被 Mastra 代码导入;它存在的唯一目的就是在安装时拉入木马。在大约 01:12 至 02:36 UTC 之间——一次约 88 分钟的自动化爆发——作用域的其余部分被重新发布。Mastra 的修复方案精确列出了影响范围:@mastra/* 下的 142 个可发布包,外加 mastra、create-mastra 和 mastracode;公开统计因快照不同从 80 到 144 不等。
恶意代码从 postinstall 钩子运行。安装时它会禁用 TLS 证书校验(NODE_TLS_REJECT_UNAUTHORIZED='0'),通过自签名证书从裸 IP(23.254.164[.]92:8000)下载第二阶段载荷,写入临时目录,将其作为分离且隐藏的后台进程启动,然后自我删除以减少取证痕迹。第二阶段是一个混淆过的信息窃取程序,它读取 Chrome、Brave 和 Edge 的配置,搜寻一份硬编码的 160 多个加密货币钱包浏览器扩展清单(MetaMask、Phantom、Solflare、Coinbase Wallet、OKX、Keplr),收集主机元数据和浏览历史,并大约每 10 分钟向一个独立的 RAT C2(23.254.164[.]123)发出心跳。它在三个平台上以伪装成 Node 工具的方式建立持久化:macOS 上的 LaunchAgent、Linux 上的 systemd 用户服务,以及 Windows 上的 C:\ProgramData\NodePackages 暂存路径。
为何重要
由于载荷在安装时执行,暴露面并不限于生产环境。CI 运行器、临时构建代理和开发者笔记本,只要解析到被毒化的版本,就都在范围之内。@mastra/core 每月下载量约 400 万次,并有数百个依赖项目,因此聚合影响面达到数千万次安装。
Mastra 恰好处在供应链攻击者最想立足的位置:AI 开发与云基础设施的交汇处。正如 StepSecurity 所指出的,其包常被安装在持有现代软件中最敏感凭据的环境里——对一个智能体框架而言,这意味着除云密钥、CI 机密和 SSH 密钥之外,还有 LLM 提供商的 API 密钥。一个钱包与凭据窃取程序落入这种环境,几乎是理想目标。值得注意的是,Mastra 在其 CI 发布上生成了 SLSA 来源证明,但并未强制要求它;因此一个普通的个人令牌仍可在没有证明的情况下发布——而且确实发生了。
防御
默认禁用安装脚本。 设置 npm config set ignore-scripts true 可中和像本次这样的 postinstall 投放器;只对极少数确实需要的包重新启用脚本。
提交 lockfile 并用 npm ci 构建。 锁定到事件前版本的 lockfile 可确保 npm ci 绝不会解析到被武器化的 easy-day-js@1.11.22。过宽的版本范围、缺失的 lockfile,或在 6 月 17 日及之后的任何全新安装,正是让脱字号范围悄无声息地重新解析的原因。
强制要求来源证明,而不只是生成它。 一个验证签名的安装——npm audit signatures,或一条拒绝缺少证明的包的策略——本可拒绝这一波中的每个包,因为攻击者丢弃了合法 CI 流水线通常产出的来源证明。
警惕幽灵依赖。 一个成熟且被广泛使用的包突然多出一个未被使用的依赖,正是此处的信号。在评审和自动化策略中都应将其视为红旗。
撤销失效的维护者权限。 审计谁能向你的作用域发布,移除休眠账户,并强制启用 2FA 和可信发布流程。整起事件都系于一个无人退役的凭据。
如果你已解析到被毒化的版本,请将主机视为已失陷: 升级到已知干净的版本(例如 @mastra/core@1.42.0 或更高——不要只是向下固定,因为攻击者发布过一些高于合法 latest 的版本),轮换该机器能触及的全部凭据(云、CI、npm、SSH,尤其是 LLM API 密钥),将加密货币钱包迁移到干净设备,清除持久化痕迹,并在可行时重装系统。
状态
| 项目 | 详情 |
|---|---|
| 事件 | @mastra npm 作用域劫持,注入依赖的大规模重新发布 |
| 日期 | 2026 年 6 月 17 日(诱饵 easy-day-js@1.11.21 于 6 月 16 日发布) |
| 恶意包 | easy-day-js@1.11.22(投放器);标记 easy-day-js@1.11.21(干净诱饵) |
| 根因 | 休眠的前贡献者 npm 账户(ehindero),发布权限从未撤销 |
| 影响范围 | 约 142 个可发布的 @mastra/* 包;公开统计 80–144 |
| 载荷 | 跨平台加密货币钱包窃取程序 + 带持久化的 RAT |
| CVE / CVSS | 未分配;源代码未改,恶意在发布时引入 |
| 状态 | 恶意版本已下架;干净版本当天即向前发布(如 @mastra/core@1.42.0) |
Sources
- → https://snyk.io/blog/a-forgotten-contributor-account-compromised-the-entire-mastra-npm-package-scope/
- → https://thehackernews.com/2026/06/144-mastra-npm-packages-compromised-via.html
- → https://safedep.io/mastra-npm-scope-takeover-supply-chain-attack/
- → https://www.endorlabs.com/learn/mastra-npm-org-compromised-multiple-packages-trojanized-to-drop-a-remote-payload-via-easy-day-js