安全团队发现,阻止可疑安装脚本的做法可能已不足以缓解软件供应链攻击中恶意JavaScript依赖包带来的威胁。
Checkmarx公司的安全研究人员警告称,攻击者利用一个名为"indexed-btree"的恶意软件包,冒充合法的sorted-btree库,将恶意代码隐藏在该软件包的正常运行时代码中进行传播。
此次攻击活动放弃了近期常见攻击中使用的preinstall和postinstall脚本,转而利用一个核心软件包函数来投递恶意载荷。Checkmarx表示,该恶意软件包在被标记并于2026年9月3日从注册库中移除之前,每周下载量接近200万次。据Blogspan作者亚历山大·鲍姆加特纳(Alexander Baumgartner)的独立分析显示,这距离首个恶意版本上线大约已过去11周。
此次发现是在npm于6月对生命周期脚本引入更严格控制措施之后出现的。
该恶意脚本并未通过软件包package.json文件中的安装钩子植入,而是直接嵌入到一个运行时方法"BTree.prototype.set"当中。当该方法接收到特定的键值时,代码会以独立的Node.js进程启动一个经过混淆处理的第一阶段加载器。
加载器启动后,会对主机进行指纹识别,收集包括操作系统架构、主机名、CPU、内存和运行时间等信息。随后,这些数据会通过硬编码的Slack频道和Telegram聊天进行外传。
攻击者将命令与控制(C2)服务器地址隐藏在Sepolia以太坊测试网区块链上的一个智能合约中。
Checkmarx的研究人员表示:"该合约暴露了getter和setter函数,恶意软件通过轮询这些函数获取信息,而非直接请求普通域名。相比传统的C2方式,这种技术对域名/IP封锁的抵御能力更强,因为它使用智能合约作为指针,一旦旧地址被封锁,就能随时指向新地址。"
在攻击链的更深处,恶意软件会生成加密密钥,与从区块链获取的公钥建立共享密钥。该密钥最终用于从智能合约中的两个加密数据块中解锁第二阶段的恶意载荷。
Checkmarx并未透露第二阶段加载器的具体功能,但指出该恶意软件会自行清理痕迹。研究人员指出,其中"包含删除恶意软件文件、并从主原型函数中移除触发代码的功能"。
Checkmarx还发现了与此次攻击活动相关的另外九个npm软件包,随后这些软件包也被从注册库中移除。这些软件包包括ordered-kv-index、btree-leaderboard、priority-slot-queue、btree-range-store、btree-core、btree-time-index、btree-lru-cache、neighbor-key-map和sliding-score-window。
其中多个软件包的下载量达到数十万次,而btree-core的下载量更是超过190万次。
Checkmarx指出,攻击者试图让整个软件包生态系统看起来合法可信,为此维护了一个包含大量提交记录的GitHub代码库,同时刻意将恶意代码本身排除在该代码库之外。与之关联的GitHub账户还使用了一张AI生成的头像图片。
Checkmarx表示,此次攻击活动仍在持续,其调查结果可能会随着调查的深入而发生变化。该公司已分享了一份入侵指标(IOC)清单,供安全团队用于检测和监控。
Q&A
Q1:indexed-btree恶意软件包是如何传播恶意代码的?
A:该恶意软件包冒充合法的sorted-btree库,将恶意代码直接嵌入到核心运行时方法"BTree.prototype.set"中,而非使用常见的preinstall或postinstall安装脚本,当方法接收到特定键值时便会触发恶意载荷。
Q2:这次npm供应链攻击的命令控制服务器有什么特殊之处?
A:攻击者将C2服务器地址隐藏在Sepolia以太坊测试网区块链的智能合约中,恶意软件通过轮询合约的getter和setter函数获取地址信息,这种方式比传统C2手段更能抵御域名或IP封锁。
Q3:受indexed-btree攻击活动影响的软件包有哪些?
A:除indexed-btree外,还有九个相关软件包被查明并移除,包括ordered-kv-index、btree-leaderboard、btree-core等,其中btree-core下载量超过190万次。
