跳转到内容
Guide

Miasma 蠕虫攻击红帽的 npm 软件包:检测、轮换、替换

| 8 min read

一种自我传播的 npm 蠕虫于 2026 年 5 月 29 日攻击了 7 个 @redhat-c​​loud-services 软件包。它隐藏了 Claude Code 和 VS Code 中的持久性。 60 秒的检测脚本、轮换过程和结构修复。

Code on a terminal representing an npm supply chain worm incident response
Photo by Growtika on Unsplash

2026 年 6 月 1 日,研究人员发现了一种自传播的 npm 蠕虫病毒,该蠕虫自 5 月 29 日起就一直存在。 它的名片是一条提交消息:“瘴气:蔓延的枯萎病”。 受损的红帽 员工 GitHub 帐户将恶意孤儿提交直接推送到 RedHatInsights 存储库、绕过代码审查和七个 @redhat-cloud-services 包 向所有安装它们的人发送了窃取凭据的有效负载。

有两件事让瘴气值得一本新的操作手册。 它运行在 preinstall 钩子,所以它 之前发生火灾 postinstall 即使取消安装也可能会出错。 并且它种植了 persistence inside your developer tools: a SessionStart hook in Claude Code and a tasks.json"runOn": "folderOpen" 在 VS Code 项目中。 正在删除 node_modules 对那些没有任何作用。 这是检测、旋转、替换剧本。

七个受损的软件包

每一个都在 @redhat-cloud-services 范围:

  • vulnerabilities-client
  • tsc-transform-imports
  • topological-inventory-client
  • sources-client
  • rule-components
  • remediations-client
  • rbac-client

第 1 步:60 秒内检测

三个信号:树中的受损包、Claude Code 或 VS 中的持久性工件 代码,并伪装成调用的 exfil 流量 api.anthropic[.]com:443/v1/api。 运行 这来自任何主机 npmgit:

任何点击都意味着您跳到第 2 步。在您读完之前,蠕虫就完成了收获 建议,因此单个信号足以开始旋转。

持久性技巧是对清理速度太快的团队造成影响的部分。 您可以删除 包坏了,重建 node_modules,并且仍然有一个 SessionStart 挂钩 ~/.claude/settings.json that re-runs the payload the next time you open Claude 代码。 审计 ~/.claude/settings.json, .vscode/tasks.json, 和 .github/workflows 在你叫主人干净之前用手。

第 2 步:使用 npm API 确认发布窗口

在固定“安全”版本之前,请检查其发布时间。 恶意版本登陆 5 月 29 日,因此当天或之后发布的任何内容都是可疑的。 botoi npm 端点返回 修改了时间戳和维护者列表,没有 npm install:

一个 modified 时间戳于或之后 2026-05-29 意味着固定到最后一个已知的 在此日期之前发布的好版本,而不是最新版本。 GET 形状缓存在 CDN 上,因此您 可以将其折叠到对每个拉取请求运行的依赖项批准检查中。

第 3 步:旋转,然后擦洗日志

Miasma 收获 GitHub Actions 秘密、npm 令牌、云凭证、Kubernetes 和 Vault 材料、SSH 密钥和 Git 凭据。 按该顺序轮换:npm 令牌停止新发布, GitHub PAT 停止存储库写入,云 IAM 密钥停止数据泄露,然后是 Vault 和 SSH。 不 首先调查; 旋转,然后调查。

有效负载将这些秘密转储到日志中,这些日志流入 Datadog、Sentry 和您的票务中 系统。 通过秘密探测器输送高风险区域,并在它们到达目标之前失败关闭 可查询索引:

第 4 步:用 CI 守卫阻止下一波攻击

Miasma 在你的运行器上需要三样东西:一个妥协的版本,一个运行的生命周期钩子,以及 它可以写入的持久性文件。 打破任何一个。 此 GitHub Actions 检查禁用生命周期 作业的脚本、Miasma 持久性标记失败、标记 Red Hat 范围包,以及 需要运行时依赖的签名出处:

保持 ignore-scripts 默认情况下打开,并为以下软件包维护一个简短的允许列表 合法构建(TypeScript、esbuild、Sharp)。 从未运行的预安装钩子无法收获 任何东西。

第五步:缩小可容纳蠕虫的表面

2026 浪潮中最常中毒的软件包包含单个网络调用:API 客户端、 验证助手和小型实用程序。 每个都是可以删除并替换为的候选者 不运行本地代码的可撤销 HTTPS 调用。

类别 典型的 npm 依赖 HTTP 替换 突破时的爆炸半径
秘密和 PII 扫描 Secretlint,PII 检测器 /v1/pii/detect 轮换一个 API 密钥
包元数据 npm 注册表客户端包装器 /v1/npm/{package} 轮换一个 API 密钥
电子邮件验证 验证器、深度电子邮件验证器 /v1/email/validate 轮换一个 API 密钥
违规检查 hibp 客户端包 /v1/breach/check 轮换一个 API 密钥

要点

  • 检查开发工具持久性文件。 瘴气隐藏在 ~/.claude/settings.json.vscode/tasks.json。 拆除包装 不移除挂钩。
  • 按发布日期固定。 日期为 当天或之后的七个包裹中的任何内容 2026-05-29 可疑。 使用 /v1/npm/{package} 确认。
  • 在调查之前先旋转一下。 npm 令牌、GitHub PAT、云密钥、Vault、SSH。 Exfil 在几秒钟内即可完成。
  • 默认情况下禁用生命周期脚本。 从未运行的预安装挂钩不能 偷任何东西。
  • 缩小表面。 用可撤销的 HTTP 替换单调用 npm 包 端点。 被破坏的密钥在一次请求中失效。

波托伊展品 /v1/npm/{package}, /v1/pii/detect, /v1/breach/check,以及一个 API 密钥背后大约 200 个其他单一用途端点 5 请求/分钟免费。 将它们连接到您的事件操作手册中,或连接 MCP服务器 致克劳德 编写代码,以便您的助手为您运行检测脚本。 从 交互式文档

FAQ

什么是瘴气供应链攻击?
Miasma 是一种自我传播的 npm 蠕虫,于 2026 年 6 月 1 日发现,其第一个“Miasma: The Spreading Blight”提交日期为 2026 年 5 月 29 日。受感染的 Red Hat 员工 GitHub 帐户将恶意孤儿提交推送到 RedHatInsights 存储库,绕过代码审查,并发布了 7 个 @redhat-cloud-services npm 软件包,其中包含一个模糊的预安装挂钩,该挂钩会收集凭证和传播 到新的主机。
哪些软件包受到损害?
@redhat-c​​loud-services 范围下的七个软件包:vulnerability-client、tsc-transform-imports、topological-inventory-client、sources-client、rule-components、remediations-client 和 rbac-client。 如果您的锁定文件在 2026 年 5 月 29 日之后提取了其中任何一个,请将主机视为已受到威胁,并轮换其接触的每个凭据。
Miasma 与早期的 npm 蠕虫有何不同?
Miasma 在预安装挂钩中运行,因此它会在安装后触发,甚至取消的安装也可以触发它,并且它会在开发人员工具(而不仅仅是 CI)中植入持久性。 它将 SessionStart 挂钩注入 Claude Code,将带有 runOnfolderOpen 的tasks.json 写入 VS Code 项目,并为每次感染生成唯一加密的有效负载以躲避签名扫描。 删除node_modules并不会将其删除。
蠕虫窃取什么并将其发送到哪里?
GitHub Actions 机密、npm 令牌、云凭证、Kubernetes 和 Vault 材料、SSH 密钥和 Git 凭证。 它将渗漏伪装成端口 443 上的 api.anthropic[.]com 流量,并回退到 GitHub 作为辅助通道,因此仅对未知域进行出口过滤无法捕获它。
单一用途的 HTTP API 如何降低这种风险?
带有预安装钩子的包可以在每台安装它的机器上运行任意代码。 对单一用途 API 的 HTTPS 调用在本地不运行任何内容,并由可撤销密钥控制。 如果 API 提供商遭到破坏,您可以轮换一把密钥。 如果树中的某个包被破坏,则恶意软件已经执行。 交易的代价是很小的延迟成本和微小的爆炸半径和即时撤销。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。