42 个 GitHub 仓库遭劫持:原生插件伪装下的 npm 发布者

原创
alex 6分钟前 阅读数 1 #头条

42 个 GitHub 仓库遭劫持:原生插件伪装下的 npm 发布者

42 个仓库、11 个所有者:规模与核心机制

10 月 26 日,JFrog 安全研究员 Guy Korolevski 和 Yair Benamou 披露了一件事:42 个第三方 GitHub 仓库被武装,分属 11 个合法所有者,全部与 testmetest npm 活动挂钩 来源:JFrog。这些仓库里藏着执行钩子,目标直指 AI 编码助手和 IDE。我查资料时第一反应是问,42 个仓库不算小数目,为什么此前没人报过。答案是仓库里的载荷伪装得足够隐蔽,普通扫描路径根本看不到它。

攻击者用的包装器是多态的,大小区间在 12.9 到 13.7 MB 之间。JFrog 把这些样本逐一解码,发现它们殊途同归,全部落进同一个隐藏的 CI 发布者载荷 来源:JFrog。这意味着攻击者背后有一套统一的基础设施,不是零散的个人行为。更值得留意的是,攻击者控制的仓库同时充当加密数据接收端,持续收进"快照信封"(snapshot envelopes)。我理解这个机制是,被劫持的仓库不只是宿主,还是数据出口。

新伪装手段是编译原生插件。这类插件本身不含任何载荷,运行时才解密名为 .napi_cache 的文件,把真实内容吐出来 来源:JFrog。静态检测在插件上找不到恶意代码,因为代码在运行前根本不存在于文件里。JFrog 还挖出账户劫持、伪造的提交时间线、短命发布分支和暴露的 npm 凭据。此外,Shellpanel 工件出现在同一被劫持所有者集群中,把 GitHub 受害者基础设施与先前报告的 GitHub Actions 对互联网 cPanel 系统的利用连起来了 来源:JFrog。

反直觉发现:SafeDep 说没有受害者,JFrog 却找到 42 个仓库

读 JFrog 原文时,我注意到一个不太舒服的差异。在 JFrog 发布同日,SafeDep 报告称尚未确认任何受损第三方包或受害者 来源:JFrog。JFrog 对 GitHub 基础设施做了补充调查,得出相反结论,确认了 42 个武装仓库存在。这个分歧不是谁对谁错,而是两边看的层面不同。SafeDep 站在 npm 包侧,JFrog 钻进 GitHub 仓库基础设施里,发现了实际被武装的仓库。

JFrog 作者在文中写得很克制。SafeDep 把载荷标记为 Miasma 家族,但 SafeDep 自己承认对谱系不确定。JFrog 选择用"testmetest 活动"命名,因为证据确认共享工具和 Shai-Hulud 后代载荷,但不能证明原始 Miasma 操作者负责 来源:JFrog。我的判断是,这个命名差异本身就说明供应链攻击调查里,精确归因比扣帽子难得多。没有过硬证据就套用旧家族名,反而容易让后续调查走偏。

原生插件伪装策略的效果是实打实的。插件自身无恶意载荷,运行时才从 .napi_cache 解密出真正有效负载,静态检测自然落空。多态包装器统一到同一载荷,意味着攻击者在控制多个仓库时没有偷懒,而是用一套成熟方案批量部署。伪造提交时间线和短命发布分支,进一步营造出可信的开发历史。HN 社区对这份披露的关注度极低,1 分、0 评论 来源:HN。我不确定这是内容太长没人读,还是这种技术细节本身引不起大众兴趣。但 42 个仓库被武装的事,不该只值 1 分。

多源交叉验证:10 月 21 日警报与 10 月 22 日 SafeDep 分析的差异

时间线摆出来,先后顺序很清楚。10 月 21 日,JFrog 的扫描器首先在 npm 生态中检测到 shai-hulud 包并发出警报 来源:JFrog。10 月 22 日,SafeDep 的分析才首次记录 npm/包一侧的活动,解码了 event-bus-lite-testmetest@0.0.1 来源:JFrog。JFrog 的警报比 SafeDep 的公开分析早一天,但 JFrog 直到 10 月 26 日才完整披露 GitHub 基础设施调查。中间隔了四天,我猜他们在确认那 42 个仓库不是误报。

SafeDep 把载荷描述为 Miasma 家族,同时明确表达对谱系的不确定性。JFrog 用"testmetest 活动"命名,因为证据确认共享工具和 Shai-Hulud 后代载荷,但不把责任归咎于原始 Miasma 操作者 来源:JFrog。两边对"是否有受害者"的判断也不一致。SafeDep 未确认受损第三方包或受害者,JFrog 确认 42 个武装 GitHub 仓库存在,横跨 11 个合法所有者 来源:JFrog。这个分歧不是时间差能解释的,JFrog 原文里明确说了,载荷 blob 大到足以规避 GitHub 搜索和 API 路径,所以 SafeDep 漏掉并不意外。

在我看来,这次调查最有价值的部分不是发现了什么新恶意软件,而是暴露了单点结论的风险。SafeDep 说没受害者,JFrog 找到 42 个仓库。如果供应链攻击调查只依赖一个层面,结论很可能不完整。多个安全团队从不同角度交叉验证,才可能拼出全貌。至于那 42 个仓库现在什么状态、攻击者是否转移了阵地,我不确定,JFrog 原文没有提供后续清理信息。但有一点我可以判断:原生插件伪装这条路已经走通了,后续再看到类似结构,不能只查表面代码。


原文:

Native addon camouflage: 42 armed GitHub repos reveal hidden NPM publisher · 来源:Hacker News

作者:itfan123 值班编辑 · 发布于 2026年10月27日

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除