短短 22 分钟,npm 生态被按下了“极速发布”键:一个名为 atool 的账号被攻破,攻击者接管其发布权限,脚本化地向 317 个 npm 包推送了 637 个带毒新版本,被慢雾命名为 Mini Shai-Hulud“迷你沙虫”供应链攻击。与传统入侵不同,这是一场发生在依赖发布与分发环节的投毒,通过看似正常的版本更新顺着信任链一路下潜。慢雾在最新威胁情报中点名,受影响的不只是无名小库,而是 AntV、Echarts-for-react 以及 Python SDK durabletask 等高频依赖,其中 AntV 这类可视化组件在 npm 上月下载量以百万计,早已成为前端和数据面板的“基础设施”。在大量 Web3 与区块链项目的前端界面、可视化看板和运维工具普遍依赖这些 npm 组件的前提下,一次高频包被投毒的供应链攻击,意味着开发者可能在毫无察觉的日常升级中,把“迷你沙虫”亲手带进自己的开发环境与项目依赖链。
22分钟637个版本:自动化投毒来袭
当安全研究员顺着异常线索回溯时,时间轴被压缩成了一条几乎不讲道理的直线:npm 账号 atool 被入侵,发布权限落入攻击者之手,随后脚本接管了一切。慢雾披露的记录显示,在约 22 分钟内,这个被盗账号通过自动化脚本向 317 个 npm 包连续推送了 637 个新版本——每一次“版本升级”,本质上都是一次精准投毒。没有人可能在这么短的时间里手动点开几百个包逐个篡改、逐个发布,这种节奏只可能来自事先准备好的批量发布程序:读取已有包列表,循环修改版本号与依赖,构建并上传,直到“迷你沙虫”被埋进尽可能多的分发入口。
这就是供应链攻击在开发生态中的典型形态:攻击者并不去逐一攻破每一个前端、每一套看板或每一条区块链交互逻辑,而是专门盯上依赖分发环节。在 npm 这种 JavaScript 生态中最广泛使用的包管理器里,只要控制住发布或更新阶段,在包里植入恶意代码,后续所有下游应用只要执行日常的 npm 安装和更新,就会在完全无感的情况下把被污染的依赖集成进自己的代码库。相比单点入侵,这种高速、批量的投毒方式与现有开发流程形成直接错位:自动化 CI/CD 只看版本号是否更新,开发者只在意功能是否正常,人工审查根本跟不上 22 分钟 637 个版本的节奏,等到有人察觉异常时,“迷你沙虫”很可能早已顺着这条供应链爬过了不计其数的项目与环境。
高频npm依赖被污染:前端到Python全线受伤
被点名的并不是几个无名小库。AntV、Echarts-for-react 这类可视化组件,早就成了前端开发的“基础设施”:从交易终端的K线与深度图,到项目方后台的运营看板,再到多链数据分析平台的仪表盘,Web2 和 Web3 团队都习惯在 npm 上直接拉这些依赖。研究简报提到,AntV 等包在 npm 上的月下载量已经是百万级,一旦维护者账号被夺取、版本被悄悄替换,潜在波及的就是成千上万条前端构建流水线——CI 看到有新版本就自动拉取,前端工程师只看到“构建通过、页面正常渲染”,却很难意识到自己已经把被投毒的图表组件推上了生产服务器。
更麻烦的是,这次“迷你沙虫”并不满足于前端生态。慢雾披露,Python SDK durabletask 同样被列入受影响项目名单,说明攻击路径已经跨出了浏览器界面,伸向任务编排、后端服务等更底层的技术栈。有安全社群的未验证消息称,durabletask 的若干新版本疑似被植入恶意代码,这类传言本身就足以让依赖它的自动化流程、链上数据处理脚本和监控服务变得不再安全。对不少团队来说,更新这些依赖不过是例行维护——改一行版本号、跑一遍测试、合并代码——在任何环节,都没有显式的“危险时刻”,但正是这种无感知、跨语言的同步投毒,让开发者在自以为是安全维护的操作中,把攻击者写进了自己的系统。
当区块链遇上npm:Web3开发环境被牵连
当慢雾这样以链上安全闻名的机构,罕见地把预警瞄准npm和Python生态时,真正被点名的其实不是某几个包,而是Web3团队赖以生存的整条开发链路。研究简报明确提到,这是一次供应链安全攻击:攻击者不直接冲击链上合约,而是潜伏在依赖发布与分发环节,用被信任的更新渠道,把“迷你沙虫”顺着版本号送进每一条下游流水线。慢雾之所以做跨生态预警,是因为这种攻击路径天然穿透Web2/Web3边界——npm本就是JavaScript生态中使用最广泛的包管理器之一,绝大多数区块链项目的前端、脚本与工具,跟传统互联网项目共用同一批基础设施。
对Web3来说,这根“共用的骨头”藏得足够深。许多链上项目的前端面板、管理后台、数据大屏,习惯使用AntV、Echarts-for-react等可视化组件来渲染链上交易、节点状态、指标图表,这些高频组件在npm上的月下载本就以百万计,一旦被污染,真正暴露的不是图表本身,而是承载它们的那台机器:运维同事用来管理节点的控制台、量化团队监控策略表现的可视化看板、内部钱包管理工具的运营后台。再往下一层,负责自动化部署、生成报表、批量操作节点的脚本,大多用JavaScript/TypeScript或Python书写,同样要从npm或相关生态获取依赖。只要其中任一环节被植入恶意依赖,攻击者就有机会在“开发”和“运维”这两个最接近私钥、节点权限和监控告警配置的位置获得立足点,通过间接方式撬动钱包、节点管理和监控平台这些关键组件的安全边界。
开源信任反复破裂:从colors事件说起
这类风险并不是在“迷你沙虫”才第一次出现。研究简报提到,2024年的“colors/faker”事件,就曾让全球大量依赖这两个库的应用集体崩溃:开发者有意或无意地把带有破坏性逻辑的新版本推上主流依赖包,结果只是一轮看似正常的更新动作,就在下游触发连锁反应。对无数开发者来说,一行 `npm install` 背后,是对开源维护者“不会害我”的默认信任;而在colors/faker事件里,这层默认信任第一次在大规模层面被撕开,让人直观看到开源供应链有多脆弱。
“迷你沙虫”攻击只是把同一条伤口撕得更大。此次事件里,npm账号atool被入侵,攻击者获得在多个npm包上发布版本的权限,在约22分钟内自动向317个npm包推送了637个恶意版本,触及AntV、Echarts-for-react以及durabletask等高频依赖。和colors/faker一样,恶意代码并不是从某个终端应用的单点突破开始,而是搭着“正常更新”的便车,从被信任的发布渠道源源不断向下游渗透。研究简报也正是把这两类事件并列,作为开源供应链系统性风险的典型样本:事后大家都会反思依赖管理、讨论锁版本和安全扫描,但在实际工程里,团队对供应链安全的防护依旧不够完备。一次次事故在事实层面证明,开源世界赖以运转的默认信任正在被持续消耗,单靠维护者的声誉、项目的星标和下载量,已经不足以为任何一个依赖链画出可靠的安全边界。
从侥幸到常态防御:开发者如何自保
“迷你沙虫”在22分钟里把637个恶意版本推上317个包,真正暴露的不是某个账号的疏忽,而是Web2和Web3团队在依赖管理上的共性短板:默认全信任npm生态、依赖自动更新和「谁下载多就跟谁」的直觉判断,缺少对依赖链的可见性,也缺少把供应链攻击当成高频威胁的心理预期。colors/faker事件已经证明,只要上游一处被篡改,就能掀翻全球无数应用,这次开源生态再被投毒,则说明这不是偶发现象,而是会被不断复用的攻击路径。在工程实践上,团队层面的自保思路必须从“相信维护者”转向“最小信任”:用锁定依赖版本和锁定文件减少意外升级的暴露面,用依赖安全扫描和构建软件物料清单,让自己至少知道项目引入了哪些包、来自哪里,再配合内部白名单、关键依赖的人工抽查,给高风险组件单独加一道闸。同时,不能把希望寄托在单个包维护者的道德与警觉上,而是要把慢雾这类安全机构的威胁情报纳入流程,一旦某个npm账号或热门包被点名,就能快速对照自身SBOM和锁定文件,判断是否中招并执行回滚。展望之后的开发周期,供应链攻击大概率会长期存在,区块链项目因前端、可视化和运维工具高度依赖npm等传统生态,更需要在整体安全规划里,把这一层风险视为常态背景,而不是运气好就不会发生的例外。
加入我们的社区,一起来讨论,一起变得更强吧!
官方电报(Telegram)社群:https://t.me/aicoincn
AiCoin中文推特:https://x.com/AiCoinzh
OKX 福利群:https://aicoin.com/link/chat?cid=l61eM4owQ
币安福利群:https://aicoin.com/link/chat?cid=ynr7d1P6Z
免责声明:本文章仅代表作者个人观点,不代表本平台的立场和观点。本文章仅供信息分享,不构成对任何人的任何投资建议。用户与作者之间的任何争议,与本平台无关。如网页中刊载的文章或图片涉及侵权,请提供相关的权利证明和身份证明发送邮件到support@aicoin.com,本平台相关工作人员将会进行核查。


