在AI绘画工具如火如荼发展的今天,开发者们依赖的npm生态却爆出了一场令人震惊的供应链攻击。一个名为"Shai-Hulud"的蠕虫,通过攻陷一个小型键值存储库keyv的维护者GitHub账户,在短短数小时内向npm发布了带毒版本,并利用合法的provenance签名骗过了安全检测。截至事件曝光,安全公司Aikido已追踪到超过868个受感染包,涉及1381个版本,累计月安装量超过20亿次。这场攻击不仅暴露了软件供应链的脆弱性,更给AI绘画应用开发者敲响了警钟——你正在使用的AI画图工具,可能正依赖着这些受感染的底层库。
一场精心策划的供应链攻击
攻击者并非通过暴力破解或零日漏洞入侵,而是精准地盗取了keyv维护者的GitHub账户权限。一旦得手,他们立即向主分支推送恶意文件,并触发GitHub Actions工作流生成新版发布。由于发布过程使用了维护者本人的工作流,npm自动生成了合法的provenance签名——这种密码学证明本意是让用户确认包确实来自声称的源。但在这里,它成了攻击者披上的合法外衣。
文生图等AI绘画工具通常依赖大量npm包构建前端和后端服务,而keyv作为一个轻量级键值存储库,被超过1.27亿次周下载量广泛使用。攻击者选择的切入点非常刁钻:keyv本身虽然功能简单,但它作为许多流行工具(如缓存库、API客户端)的传递依赖,可以迅速扩散到整个生态。JFrog安全团队独立追踪到了超过400个包和1700个带毒版本,且数字仍在增长。
更令人担忧的是,CrowdStrike在事件发生前一天发布的《2026威胁狩猎报告》中,已经精准预测了这种攻击形态。报告指出,开发者生态系统本身——包括包注册表、CI/CD管道、容器注册表以及代码编辑器扩展——正成为攻击者直接攻击的覆盖面。npm包位居这一转变的中心,占CrowdStrike上半年追踪到的恶意软件注册表威胁的87%。没想到,预言在24小时内就变成了现实。
合法签名为何失效?
要理解这次攻击的可怕之处,必须剖析provenance机制的工作原理。npm的provenance签名基于Sigstore框架,通过OIDC令牌(OpenID Connect)和Fulcio/Rekor服务生成。在正常流程中,开发者通过GitHub Actions发布新版本时,Actions环境会请求一个OIDC令牌,然后将其交换为发布令牌,最终通过Fulcio生成签名并记录到Rekor透明日志中。
攻击者巧妙利用了这一点:因为他们控制了维护者的GitHub账户,所以能够像合法发布一样执行整个流程。在针对opensearch-js的一个特定路径中,JFrog发现攻击者甚至在GitHub Actions运行中请求了OIDC令牌,生成了来自可信工作流上下文的合法provenance。这意味着,任何依赖provenance验证来阻止恶意包的安全工具,在面对已经被攻陷的开发者账户时,全都形同虚设。
这一缺陷对AI绘画开发团队尤为致命。许多AI独角兽企业使用透明背景处理工具时,背后依赖的npm包如果被投毒,整个开发环境都可能沦陷。安全团队通常只检查包是否带有provenance签名,认为有签名就是安全的。但这次事件证明,签名只能证明“这个包确实是这个账户发布的”,却无法证明“这个账户没有被攻陷”。
攻击者如何利用开发者信任?
单个账户被攻陷只是一个开始。真正让攻击扩散到整个生态的是蠕虫的自我复制能力。一旦带毒的keyv包被安装到开发者环境或构建服务器,它的payload会立即开始收集所有能够访问的凭证——包括npm发布令牌、云服务访问密钥、CI/CD密钥等。然后,它利用这些令牌去后门其他受害者控制的包。每一个被感染的维护者都变成了一个无意识的传播节点,Aikido观察到每几分钟就有数十个新感染包出现。
攻击者将窃取的秘密外泄到公开的GitHub仓库中,并标记为"Shai-Hulud: Here We Go Again",这也是此次攻击行动的命名来源。受影响的包并非仅限于小众工具:keyv作为传递依赖,存在于许多主流工具中,包括Deliveroo、Qlik和Picsart等公司的npm scope下的包。这些公司的开发者从没有主动安装过keyv,他们只是依赖了某个依赖了keyv的工具——在依赖树深处,没有人会手动审查每一层。
对于AI绘画生态来说,这种攻击方式尤其危险。AI图片生成工具通常需要大量图像处理库、缓存库和中间件,这些库的依赖关系错综复杂。一个开发者可能只是为了加速图像加载而引入了一个缓存库,却不知道这个缓存库依赖了被感染的keyv。攻击者真正瞄准的并不是这些缓存库本身,而是它们能到达的云基础设施。JFrog和Wiz都发现,恶意软件会收集云访问密钥、CI秘密以及生产基础设施的认证令牌。包投毒只是载体,云才是最终目的地。
从工具链到AI助手:攻击面扩大
窃取凭证并不是终点,因为蠕虫还把自己植入了开发者工作的核心工具中。Wiz分析发现,恶意软件会在受感染机器上创建两个持久化目录:一个用于Visual Studio Code,另一个名为.claude(Anthropic的Claude Code Agent的工作目录)。这些目录中的设置文件意味着,当开发者打开受感染项目进行编辑,或者启动AI编程会话时,payload会再次运行——而不仅仅是在安装时爆发。
这正是CrowdStrike报告中提到的“开发者生态系统”:开发者最信任、最不常检查的两个工具——代码编辑器和AI编程助手——被直接攻击。想象一下,当一个AI绘画工程师使用AI工具导航来寻找效率工具并安装后,下次打开VS Code或启动Claude Agent时,恶意代码就会自动执行,窃取他用于访问GPU集群的云密钥。这种攻击面让传统的安全扫描和补丁管理难以应对。
这一趋势与当前的企业数字化转型浪潮密切相关。越来越多的AI独角兽企业将开发流程完全工具化,依赖npm、pip等包管理器来快速构建服务。然而,这种便利性也带来了巨大的风险。攻击者不再需要寻找系统漏洞,他们只需要等待开发者下载一个被污染的包,就能进入整个企业内部网络。
防御之道:简单却有效的“延迟更新”
面对如此复杂的攻击,有一个控制措施却简单得令人惊讶,而且几乎零成本。CrowdStrike的反对抗行动负责人Adam Meyers在事件发生前的采访中明确指出了这一点:“保护软件供应链,最简单的方法就是不让任何工具拉取最新的依赖,而是拉取上周的依赖。”这个延迟就是关键。
“你仍然可以获得相当新的版本,但不会冒风险去拉取几分钟前刚更新的包——那可能已经植入了恶意代码。”将版本发布延迟一周,给安全社区留出足够的时间来发现投毒行为,否则恶意代码会在几分钟内到达所有下游构建。
这一建议并非空想。npm在2026年2月发布的CLI 11.10.0版本中,已经内置了名为min-release-age的设置。pnpm更早,在五个月前就提供了minimumReleaseAge选项。团队只需配置这个参数,就可以拒绝任何发布时间小于指定天数的包版本。对于AI绘画项目的开发团队来说,这可能是抵御类似Shai-Hulud攻击的最有效手段。
此外,企业还应考虑对大模型训练等敏感任务使用独立的开发环境,并限制开发机的凭证访问范围。同时,引入AI工具箱类的安全扫描工具,自动检测依赖树中的异常更新。这些措施虽然不能完全杜绝风险,但可以大幅降低攻击面。
对AI独角兽和AI赛道的启示
这次事件给整个AI赛道敲响了警钟。AI独角兽们通常以快速迭代为荣,频繁更新依赖包以获取最新功能。但正如Shai-Hulud事件所示,速度也可能成为致命弱点。在AI绘画、文生图等热门领域,许多初创公司为了抢占市场,甚至会在生产环境中使用尚未稳定发布的包。这种做法无异于在沙地上建城堡。
从更宏观的角度看,AI独角兽企业需要重新审视自己的安全架构。软件供应链攻击已经成为国家级黑客和犯罪组织的主要手段,而AI行业由于依赖大量开源工具和云基础设施,正处于风口浪尖。CrowdStrike发现,云相关犯罪活动在2026年上半年增长了171%,而供应链投毒是主要路径之一。
对于AI绘画领域的开发者,一个实用的建议是:在package.json中固定依赖版本,并定期审查锁文件(lockfile)的变化。同时,关注艺术签名等小众工具(它们可能使用不安全的第三方库),确保整个工具链都在可控范围内。毕竟,在AI独角兽追逐下一个爆款应用的路上,安全不应该成为被忽视的代价。
未来,随着AI Agent技术的普及,开发者对自动化工具的信任会进一步加深。但正如这次攻击展示的,任何信任链条都可能被攻破。只有将安全内嵌到开发流程的每一个环节,才能真正抵御不断演化的威胁。