Mini Shai-Hulud 再次出击:314 npm 软件包受损

2026-05-19 1 阅读 theanonymousone
返回博客 Mini Shai-Hulud 再次出击:317 个 npm 软件包遭到破坏 恶意软件 SafeDep 团队 • 2026 年 5 月 19 日 • 阅读 26 分钟 目录 TL;DR npm 帐户 atool ( [email protected] ) 于 2026 年 5 月 19 日遭到破坏。攻击者在 22 分钟内自动爆发,发布了 317 个软件包中的 637 个恶意版本。受影响的软件包包括 size-sensor(420 万次下载/月)、echarts-for-react(380 万)、@antv/scale(220 万)、timeago.js(115 万)和数百个 @antv 范围内的软件包。有效负载是一个 498KB 的混淆 Bun 脚本,与三周前 SAP 妥协中使用的 Mini Shai-Hulud 工具包相匹配:相同的扫描仪架构、相同的凭证正则表达式集、相同的混淆模式。它跨整个 AWS 链(环境变量、配置文件、EC2 IMDS、ECS 容器元数据、Secrets Manager)收集凭证、Kubernetes 服务帐户令牌、HashiCorp Vault、GitHub PAT、npm 令牌、SSH 密钥等。通过将被盗数据作为 Git 对象提交到在受感染令牌下创建的公共 GitHub 存储库,并将用户代理伪造为 python-requests/2.31.0 ,从而窃取被盗数据。在 CI 环境中,有效负载将 GitHub Actions OIDC 令牌交换为 npm 发布令牌,使用窃取的身份通过 Sigstore (Fulcio + Rekor) 签署工件,并将持久性注入 .github/workflows/codeql.yml 。该有效负载通过注入 SessionStart 钩子来劫持 Claude Code 和 Codex,这些钩子在每个 AI 会话上重新执行恶意软件,无论是在本地还是通过提交到可访问的 GitHub 存储库。 VS Code 获取带有 "runOn": "folderOpen" 的tasks.json 以获得相同的效果。持久性 systemd 服务/macOS LaunchAgent ( kitty-monitor ) 安装 GitHub dead-drop C2 后门:一个 Python 守护进程,每小时轮询 GitHub 的提交搜索 API,以查找包含关键字 firealazer 的提交消息中的 RSA-PSS 签名命令,然后从签名 URL 下载并执行任意 Python。一个单独的 gh-token-monitor 守护进程以 60 秒的间隔轮询被盗的 GitHub 令牌。有效负载还尝试通过主机套接字逃逸 Docker 容器,并将感染传播到其他本地 Node.js 项目。该攻击使用两条执行路径。每个受损版本都会添加一个预安装挂钩(bun run index.js)。 637 个版本中的 630 个版本还注入了一个可选的依赖项条目,指向 antvis/G2 GitHub 存储库中的冒名顶替者提交。这些是伪造作者身份的孤儿提交,在存储库的分支历史记录中不可见,利用 GitHub 的分叉对象共享来托管有效负载的第二个副本,而无需对目标存储库进行任何写访问。 npm 的 github:依赖解析通过 SHA 获取并执行内容。影响:使用 semver 范围(例如 echarts-for-react 的 ^3.0.6 )的项目会自动解析为受感染版本 凭证收集目标为 npm 令牌、GitHub PAT、AWS 密钥(包括 EC2 元数据和 ECS 容器凭证的完整凭证链)、GCP 服务帐户、Azure 凭证、数据库连接字符串、Stripe 密钥、Slack 令牌、SSH 密钥、Docker 身份验证、Kubernetes 服务帐户泄露的数据被提交到在被盗令牌帐户下创建的公共 GitHub 存储库,使用 GitHub API 作为 C2 通道,并使用 python-requests/2.31.0 用户代理 npm OIDC 令牌在 CI 中进行交换,允许攻击者使用管道自己的身份获取发布令牌 使用被盗 OIDC 令牌进行 Sigstore 签名,创建具有伪造来源的合法签名工件 Docker 套接字访问启用使用主机文件系统绑定的特权容器逃逸通过 .github/workflows/codeql.yml 注入(名为“Run Copilot”)安装 CI/CD 持久性,将 toJSON(secrets) 作为 GitHub Actions 工件转储,然后通过删除工作流运行并重置分支进行自我清理 AI 代理劫持:Claude Code SessionStart 挂钩、Codex 挂钩和 VS Code“runOn”:“folderOpen”任务,所有这些都会触发 Bun重新执行负载的引导程序持久性 systemd 用户服务和 macOS LaunchAgents:kitty-monitor 运行 GitHub dead-drop C2 后门,该后门通过 GitHub 提交搜索接受 RSA 签名的远程命令; gh-token-monitor 以 60 秒的间隔轮询被盗的令牌 本地项目感染将有效负载文件复制并挂钩到同一台计算机上的其他 Node.js 项目 即使预安装挂钩被阻止,通过 GitHub imposter 提交的冗余有效负载交付仍然存在 妥协指标 (IoC):atool ( [email protected] ) 于 2026 年 5 月 19 日 01:44 至 02:06 UTC 期间发布的任何软件包预安装脚本:bun run index.js Payload SHA256:a68dd1e6a6e35ec3771e1f94fe796f55dfe65a2b94560516ff4ac189390dfa1c Imposter在antvis/G2中提交(孤儿,伪造作者,消息:“新包”): 1916faa365f2788b6e193514872d51a242876569(626个版本)7cb42f57561c321ecb09b4552802ae0ac55b3a7a(2个版本) dc3d62a2181beb9f326952a2d212900c94f2e13d(1 版本,垃圾收集)可选依赖项:@antv/setup:github:antvis/G2# 过滤存储库匹配