安全厂商 Checkmarx 披露一起长期的 npm 供应链投毒行动:恶意包 indexed-btree 通过仿冒合法库 sorted-btree,在峰值时达到约 200 万次的周下载量,波及面远超一般开源投毒事件。与既往攻击不同,该包不含任何安装期脚本,而是把恶意代码藏进库自身的运行时函数中,从而绕过了 npm 在 2026 年 6 月新增的供应链防护机制。
事件概述
该行动已下架的关联包共 10 个,包括 indexed-btree 以及 btree-core(约 195 万次下载)、btree-leaderboard、ordered-kv-index、priority-slot-queue、btree-range-store、btree-time-index、btree-lru-cache、neighbor-key-map 与 sliding-score-window。为让这些包看起来可信,操作者搭建了貌似合理的 GitHub 仓库、填充了可信的提交历史,并精心维护了开发者账号资料,足以通过人工与自动化信誉检查。
技术细节
npm 与其托管平台在 2026 年 6 月的加固更新中,默认阻止 preinstall、install、postinstall 等生命周期钩子,并禁止在未经用户同意时从 Git 仓库或远程 URL 自动拉取依赖——这两项控制正是此前绝大多数 npm 攻击的入口。indexed-btree 的策略是彻底不使用安装期载荷,改为把加载器嵌进 BTree.prototype.set() 方法,这是任何使用该库的应用都会频繁调用的主函数。当应用以某个特定键值调用该方法时,载荷被激活并释放混淆的一阶段文件 sharedLoad.min.js。
由于执行只发生在运行时、且行为看起来与普通库调用无异,Checkmarx 称这是「绕过标准污点分析工具与多数静态扫描器的精巧做法」。第一阶段运行后会采集主机指纹,包括架构、主机名、CPU、内存与运行时长,并通过硬编码的 Slack 与 Telegram 通道外传;随后轮询部署在 Sepolia 测试网上的以太坊智能合约以获取 C2 信息。操作者使用 X25519 密钥交换派生 AES 密钥,用于解密从合约取回的二阶段载荷。该恶意代码还具备自清理能力:在行动收尾时可删除自身文件,并从包源码中精确移除恶意触发点,显著增加事后取证难度。
影响评估
这次事件的关键教训在于,安装期扫描已不再足够。恶意行为只在运行时、以特定参数触发,既不出现在依赖安装日志中,也不留下常规的脚本执行痕迹。对以内网环境构建、使用内部镜像与自研工具链的团队而言,依赖树中任何来源不明的工具类包都可能成为入口,而一旦开发机被感染,窃取的将是环境变量、凭据、Cookie 与加密货币钱包数据等核心资产。
修复建议
立即审计依赖树,移除上述包及其非官方分支;轮换可能被触及的密钥、令牌与环境变量,从已知良好的备份重建开发环境;在依赖扫描之外引入运行时行为分析,并对内部工具类包建立来源与哈希校验机制;关注开发者账号发布行为的异常变更,例如包所有者的低频维护与突然的活跃提交。