Mini Shai-Hulud 攻击波及 @antv 生态系统,639 个 npm 包版本遭到入侵
一场活跃的 npm 供应链攻击通过与 Mini Shai-Hulud 相关的恶意发布浪潮,入侵了 @antv 生态系统中的软件包。
Socket 威胁研究团队正在调查一起活跃的 npm 供应链攻击事件,涉及 @antv 生态系统中被入侵的软件包。
此次攻击影响了与 npm 维护者账户 atool 关联的软件包,包括 @antv,这是一个广泛使用的 Apache ECharts React 封装库,每周下载量约为 110 万次。Socket 迅速检测到该恶意发布浪潮,并将受影响版本归类为已知恶意软件。
Socket 内部审查识别出数百个独立软件包。该模式与 Mini Shai-Hulud 相符——一种涉及通过被入侵维护者账户关联的软件包进行协调恶意发布的高容量 npm 入侵模式。
受影响软件包集包括广泛使用的 @antv 软件包,如 @antv/g2、@antv/g6、@antv/x6、@antv/l7、@antv/s2、@antv/f2、@antv/g、@antv/g2plot、@antv/graphin 和 @antv/data-set,以及 @antv 命名空间之外的相关软件包,包括 echarts-for-react、timeago.js、size-sensor、canvas-nest.js 等。
潜在影响范围非常显著,因为受影响发布账户关联的软件包横跨数据可视化、图形绘制、地图绘制、图表绑制和 React 组件生态系统。即使只有部分软件包收到恶意更新,软件包生态系统的流行度也会对自动拉取新依赖版本的组织造成重大下游影响。
这样的规模使其成为 Socket 最近调查的较大 npm 供应链事件之一。
这是一个持续发展的故事。Socket 将继续调查此次入侵的完整范围,并将在确认其他受影响软件包、版本和载荷详情后更新本文。
5/19 Mini-Shai-Hulud 浪潮
Socket 在今晚的 Mini Shai-Hulud 浪潮中识别出 639 个被入侵软件包版本,涉及 323 个独立软件包。今晚所有新观察到活动都集中在 npm 生态系统,大部分活动集中在 @antv 软件包。受影响集还包括未作用域的 npm 软件包以及 @lint-md、@openclaw-cn 和 @starmind 下的软件包。
今晚恶意发布活动始于 UTC 时间 01:56 左右,一直持续到约 02:56,Socket 检测出现在约 02:02 至 03:09 UTC 之间。在今晚发布的 639 个被入侵软件包版本中,Socket 在发布后约 6 至 12 分钟内检测到大部分活动,中位检测时间约为 6.7 分钟。
在整个 Mini Shai-Hulud 活动中,我们追踪到 1055 个版本,涉及 502 个独立软件包。该活动横跨 npm、PyPI 和 Composer,其中 npm 占绝大多数:1048 个 npm 版本涉及 498 个独立 npm 软件包,加上 3 个软件包的 6 个 PyPI 条目和 1 个 Composer 软件包版本条目。
技术分析:恶意载荷
我们对被入侵 @antv 工件的分析发现了一个安装时载荷,与 Mini Shai-Hulud 供应链恶意软件家族一致。根级 index.js 载荷修改 package.json 以在安装期间执行:
"preinstall":"bun run index.js"注入的 index.js 文件经过高度混淆。它使用大型字符串数组查找表、运行时字符串解码,以及通过 globalThis 作为 fc2edea72 公开的自定义解密器。解码后的字符串揭示了主要数据泄露端点、GitHub API 用法、npm 注册表 API 用法、lock 文件路径和内部执行标记。这种混淆旨在将敏感字符串隐藏在简单静态检查之外,与在 npm 供应链入侵中观察到的先前 Mini Shai-Hulud 变体一致。
该载荷建立了硬编码的 HTTPS 数据泄露路径:https://t[.]m-kosche[.]com:443/api/public/otel/v1/traces。
收集的数据经过序列化、使用 gzip 压缩、使用 AES-256-GCM 加密,并在传输前使用 SHA-256 的 RSA-OAEP 包装 AES 密钥。这防止防御者从网络遥测中轻松恢复被盗的明文。
该载荷针对开发者和 CI/CD 环境。它搜索 GitHub 令牌、npm 令牌、AWS 凭证、Kubernetes 服务账户材料、Vault 令牌、SSH/私钥、Docker 认证文件、数据库连接字符串以及其他高价值开发密钥。它还包含常见 CI/CD 平台的逻辑,包括 GitHub Actions、GitLab CI、Travis CI、CircleCI、Jenkins、Azure DevOps、AWS CodeBuild、Buildkite、AppVeyor、Bitbucket Pipelines、Drone、Semaphore、TeamCity、Bamboo、Bitrise、Vercel、Netlify 和 Cloudflare Pages。
GitHub 回退数据泄露
除了直接 HTTPS 端点外,该载荷还包含基于 GitHub 的回退数据泄露机制。如果它获得可用的 GitHub 令牌,就可以在受害者账户下创建一个仓库,并将被盗数据提交到 results/ 目录下的文件中,使用以下路径模式:
results/results-<timestamp>-<counter>.json这种行为与更广泛的 Mini Shai-Hulud 模式一致,即滥用受信任的开发者平台作为数据泄露和暂存基础设施。Socket 之前记录了在 Mini Shai-Hulud 相关活动中创建 GitHub 仓库的行为,包括遵循 <word>-<word>-<3 digits> 模式的仓库名称和用作活动标记的仓库描述。
当前对反转短语 niaga og ew ereh :duluh-iahs 的公开 GitHub 搜索结果显示约有 1.9k 个仓库使用标记 niagA oG eW ereH :duluH-iahS,该标记反转后为 Shai-Hulud: Here We Go Again。可见的仓库使用《沙丘》主题名称,如 sayyadina-stillsuit-852、atreides-ornithopter-112、harkonnen-phibian-552、fremen-fedaykin-225 和 kanly-lasgun-874。
观察到的一个仓库 Zaynex/sayyadina-stillsuit-852 包含一个 results 目录和一个包含相同反转标记的 README。这与载荷的 GitHub 仓库数据泄露逻辑相符,表明 GitHub 回退数据泄露路径正在运行。
GitHub 搜索揭示了一个快速更新的威胁参与者创建仓库集群,这些仓库使用反转的 Shai-Hulud 活动标记和《沙丘》主题命名,支持对该恶意软件 GitHub 回退数据泄露路径正在大规模运行的评估。
npm 传播逻辑
该载荷还包含 npm 注册表滥用逻辑。它可以通过 npm 注册表 API 验证 npm 令牌、枚举令牌所有者可维护的软件包、下载软件包 tarball、注入恶意载荷、添加 preinstall 钩子、递增软件包版本,并以被入侵维护者身份重新发布修改后的软件包。
注入的软件包修改遵循以下一般模式:
{
"scripts": {
"preinstall":"bun run index.js"
},
"optionalDependencies": {
"@antv/setup":"github:antvis/G2#1916faa365f2788b6e193514872d51a242876569"
}
}添加的 @antv/setup GitHub 依赖类似于先前 Mini Shai-Hulud 活动中观察到的技术,其中恶意基于 git 的依赖在安装期间提供另一个生命周期执行路径。先前 Socket 对 TanStack 浪潮的报告记录了一个类似的可疑 setup 依赖 @tanstack/setup,解析到一个独立 GitHub 提交,该提交包含一个执行 Bun 载荷的 prepare 钩子。
该载荷包含明确的蠕虫式功能,旨在使用被盗的 npm 凭证修改和重新发布其他软件包。
与先前 Mini Shai-Hulud 变体的关系
AntV 载荷与早期 Mini Shai-Hulud 工件(如 TanStack 的 router_init.js 和 Intercom 相关 router_runtime.js 载荷)有所不同。AntV 样本使用根级 index.js、不同的主要 C2 端点以及较小的载荷主体。但是,核心运营模式是一致的:
- 通过软件包生命周期脚本在安装时执行
- 基于 Bun 的载荷执行
- 高度 JavaScript 混淆
- 开发和 CI/CD 密钥窃取
- GitHub API 滥用
- 加密数据泄露
- npm 软件包再感染和重新发布逻辑
- 使用 GitHub 仓库作为数据泄露或暂存基础设施
这些重叠表明应将 AntV 入侵作为 Mini Shai-Hulud 变体处理,而非无关的软件包入侵。
入侵指标
网络指标
t[.]m-kosche[.]comhttps://t[.]m-kosche[.]com:443/api/public/otel/v1/traces
检测机会
以下端点是合法的 npm 和 Sigstore 服务。它们不是威胁参与者控制的基础设施,默认情况下不应被阻止。它们被包含为检测机会,因为从软件包生命周期脚本、依赖安装或非发布 CI 作业意外访问这些端点可能表明凭证验证、软件包枚举或来源/签名滥用。
https://registry.npmjs.org/-/npm/v1/tokenshttps://registry.npmjs.org/-/whoamihttps://registry.npmjs.org/-/v1/search?text=maintainer:<user>&size=250https://fulcio.sigstore.dev/api/v2/signingCerthttps://rekor.sigstore.dev/api/v1/log/entries
GitHub 仓库标记
niagA oG eW ereH :duluH-iahSniaga og ew ereh :duluh-iahsShai-Hulud: Here We Go Againresults/results-*.json
示例仓库命名模式
<dune-word>-<dune-word>-<digits>sayyadina-stillsuit-852atreides-ornithopter-112harkonnen-phibian-552fremen-fedaykin-225kanly-lasgun-874
密钥目标
GITHUB_TOKENACTIONS_ID_TOKEN_REQUEST_URLACTIONS_ID_TOKEN_REQUEST_TOKENAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKENAWS_SHARED_CREDENTIALS_FILEAWS_CONFIG_FILEAWS_CONTAINER_CREDENTIALS_RELATIVE_URIAWS_CONTAINER_CREDENTIALS_FULL_URIAWS_WEB_IDENTITY_TOKEN_FILEAWS_ROLE_ARNAWS_ROLE_SESSION_NAMEKUBECONFIGKUBERNETES_SERVICE_HOSTVAULT_ADDRVAULT_TOKENVAULT_AUTH_TOKENVAULT_API_TOKEN