导语

当你在使用AI写作工具生成文案时,可能从未想过,这些工具背后的npm包依赖链正面临一场无声的战争。近日,一场针对热门JavaScript套件keyv的供应链攻击,导致444个软件包被植入蠕虫,波及多家知名科技企业。这起事件不仅暴露了开源生态的脆弱性,更向所有依赖第三方代码的开发者敲响了警钟——AI写作的安全,远不止于模型本身,底层的代码供应链同样需要守护。

事件始末:GitHub账号被黑,npm生态遭蠕虫屠城

一切始于一个看似普通的账号入侵。8月初,安全公司StepSecurity披露,热门JavaScript键值存储套件keyv的维护者贾里德·雷(Jared Wray)的GitHub账号被黑客突破。对方获得了其名下所有项目的代码修改和发布权限,随即在keyv、cacheable和ecto三个项目中植入恶意文件,并利用项目原有的GitHub Actions自动构建流程,将11个包含蠕虫的npm包上传至官方仓库。

这些恶意包并非简单的木马——它们携带了蠕虫程序,能够在安装前执行一个名为setup.mjs的脚本。该脚本会先下载合法的Bun JavaScript运行环境作为掩护,随后启动真正的凭据窃取程序。令人震惊的是,黑客的行动效率极高:从植入第一个恶意包到大规模扩散,整个过程不到4小时,受污染软件包总数就飙升至444个,涉及2,212个恶意版本,覆盖超过14个组织。

keyv本身的每周下载量超过1.5亿次,flat-cache和file-entry-cache也接近1.5亿次,并被ESLint等常用开发工具间接引用。这意味着,任何使用这些工具的开发者,只要安装或更新了被污染的版本,都可能成为攻击链上的一环。

蠕虫如何传播?自动复制与权限劫持的致命组合

这场攻击的核心机制并不复杂,但极其致命。黑客利用的是npm生态中经典的“信任传染”模式:一旦某个开发者的机器上安装了恶意软件包,蠕虫便会扫描该机器的npm发布凭证(通常存储在.npmrc文件中)。如果发现凭证,它就会自动查询该账号拥有管理权限的全部项目,下载已有版本的代码,将自身蠕虫程序植入其中,然后重新发布恶意版本。

这种自动传播机制让蠕虫在极短时间内完成了“指数级扩散”。从最初的11个包,到433个被感染的第三方包,黑客甚至不需要手动干预。更可怕的是,蠕虫针对每个历史版本都打包了相应的污染版本,导致最终版本号爆炸式增长。例如,某个原本只有3个版本的包,可能突然出现几十个带恶意代码的新版本。

这一过程与供应链安全领域的经典攻击模式如出一辙,但此次攻击的速度和规模令人侧目。它利用了开源社区中普遍存在的“低权限意识”——很多维护者为了便捷,将npm发布权限直接保存在CI/CD环境中,甚至没有启用双重认证。黑客一旦攻破一个账号,就等于拿到了整个信任链的钥匙。

波及范围:从keyv到444个软件包,影响千家科技产品

受影响的组织名单中,不乏Deliveroo、Picsart、Qlik和ServiceTitan等知名企业。这些公司使用的内部或开源项目中,很可能间接依赖于keyv或flat-cache等被污染的包。由于npm包依赖关系极其复杂,一个底层库的污染可能向上影响数百个上层应用。

对于普通开发者而言,这意味着你电脑上的Node.js项目,只要运行过`npm install`,就可能中招。尤其是那些使用AI工具导航寻找效率工具的团队,若不小心引入了被污染的包,开发环境中的凭证和密钥将直接暴露。

值得注意的是,攻击者不仅窃取NPM、GitHub、AWS、Azure、Google Cloud、Kubernetes和HashiCorp Vault的访问凭证,还专门针对Claude、Codex、Cursor等AI开发工具的登录数据下手。这些工具正是当前AI写作和代码生成领域的热门产品,攻击者显然意识到,AI工具的开发者账户往往拥有更高的权限和更敏感的数据。

攻击者目标:凭证与AI开发工具数据,一场精心策划的狩猎

为什么黑客如此重视AI开发工具的登录数据?答案在于这些工具的新鲜度与价值。Claude、Codex、Cursor等服务通常需要付费订阅,且与用户的GitHub、OpenAI等账号绑定。入侵这些账号,不仅可以直接窃取API密钥,还能通过AI工具的上下文功能获取企业内部的代码片段、文档甚至商业机密。

更令人担忧的是,许多开发者习惯将AI工具的登录凭证保存在本地配置文件中,与npm、GitHub等凭证放在同一目录。蠕虫在扫描时,会一并搜刮SSH密钥、数据库连接信息,以及所有找到的AI工具登录数据。这种“打包式”的窃取方式,意味着一次攻击可能导致多个平台同时沦陷。

最新科技的角度看,这类攻击已经超越了传统的恶意软件范畴,演变为一种针对开发者生态的“身份链”攻击。它不再依赖漏洞,而是利用人的习惯和系统设计的缺陷。例如,部分开发者为了省事,将npm发布令牌设置成永久有效且无IP限制,这为蠕虫的自动传播提供了极大的便利。

供应链安全反思:开源维护者的脆弱性如何破局?

此次事件再次将开源供应链安全推上风口浪尖。keyv的维护者贾里德·雷并非个例,近两年已有多个知名开源项目的维护者账号被入侵,包括PHP的Composer、JavaScript的UAParser.js等。维护者个人账号的安全,实质上成为了整个生态的“单点故障”。

为什么这个问题难以解决?一方面,开源维护者往往缺乏企业级的安全资源,许多人甚至没有专门的安全团队支持。另一方面,npm生态中“发布即信任”的模型根深蒂固——只要一个包有足够多的下载量,就会被下游项目无条件信任。这种信任机制使得攻击者一旦攻破一个高流量包,就能迅速扩散。

对此,安全社区建议维护者采用Passkey或实体安全密钥进行账号保护,并降低GitHub Token的权限范围,启用主分支保护和强制代码审查。对于企业而言,则需要在CI/CD环境中限制软件包安装命令和外部网络访问,并针对新发布的软件包版本设置3至7天的冷却期,以便安全团队有时间进行审查。

此外,借助AI图片生成等技术,开发者可以制作更直观的依赖关系图,快速识别哪些包是“高风险高影响”的。同时,使用文生图工具生成的示意图,也能帮助团队在安全培训中更清晰地展示攻击链路。

防御建议:构建多层次的软件供应链护栏

面对日益复杂的供应链攻击,企业和开发者需要采取“纵深防御”策略。以下是一些实操建议:

1. 凭证管理:将npm、GitHub等平台的发布凭证从CI/CD环境中剥离,使用短期的、基于OAuth的令牌,并定期轮换。 2. 双重认证:强制所有拥有项目写权限的账号启用Passkey或物理安全密钥,而非仅依赖短信或TOTP。 3. 依赖锁定:使用`npm lockfile`或`yarn.lock`锁定依赖版本,避免自动更新到被污染的版本。同时,配置`npm audit`和`npm ci`进行持续监控。 4. 网络隔离:在CI/CD环境中限制对外的网络访问,仅允许连接已知的包仓库地址,并对外部请求进行内容过滤。 5. 行为监控:当某个包在短时间内发布大量新版本时,触发告警并自动暂停发布流程。

对于使用艺术签名AI网名等创意工具的团队,虽然这些工具本身不直接与npm交互,但若开发环境被污染,用户的个人数据和账号信息仍可能泄露。因此,建议所有开发者在本地环境中运行`npm install`前,先检查包的来源和最近更新历史。

最后,别忘了利用AI工具箱中的安全扫描工具,对项目依赖进行定期地毯式排查。安全不是一劳永逸的事,而是一场持续对抗的赛跑。

结语

keyv事件只是供应链攻击冰山的一角。随着AI写作、代码生成等工具深入开发流程,攻击者的目标也从服务器数据转向了开发者的身份凭证和AI工具账号。保护开源生态,既需要维护者提升安全意识,也需要企业建立完善的供应链防护体系。下一次当你运行`npm install`时,不妨多思考一下:你信任的每一行代码,背后是否真的安全?