看似正常的官方依赖,却在悄悄搬运你的钱包私钥。
在 Web3 开发中,引入官方 SDK 是再寻常不过的操作。然而,近日一起针对 Injective 生态的供应链攻击事件,再次敲响了警钟:官方源发布的包,也可能携带恶意代码。
经查找币安全团队监控系统捕获并确认,npm 上的 @injectivelabs/sdk-ts 版本 1.20.21 存在严重恶意行为。该版本并非仿冒包,而是被植入了恶意代码的正版构建产物。开发者一旦调用特定钱包接口,助记词或私钥便会在后台被静默外传。
攻击概述:一次“合法”的密钥窃取
@injectivelabs/sdk-ts 是 Injective 链上开发的核心工具库,广泛用于交易构造、链上查询以及钱包密钥管理。正是这样一个高权限组件,成为了攻击者的目标。
恶意行为核心:当开发者调用 PrivateKey.generate()、PrivateKey.fromMnemonic() 或字符串形式的 PrivateKey.fromHex() 时,恶意代码会将助记词或私钥捕获,经过 Base64 编码后,隐藏在 HTTP 请求的 X-Request-Id 头中,外传至攻击者控制的服务器。
技术分析:拆解恶意代码的伪装与触发逻辑
线索一:安装阶段“干净”,迷惑性极强
调查初期,通过对 package.json 的审查(约第 485-500 行),并未发现 postinstall 或 preinstall 等安装后门脚本。这意味着,单纯安装该包不会立即触发恶意行为,传统的依赖安装日志扫描难以发现异常。攻击的触发点被推迟到了运行时,隐蔽性极强。
线索二:伪装成“遥测模块”的密钥收集器
恶意代码被植入在 accounts 构建文件中。为了掩盖其真实目的,攻击者使用了极具迷惑性的注释,如 key-derivation-telemetry、anonymized usage metrics 和 SDK optimization,试图将窃密行为伪装成常规的 SDK 数据统计。
然而,正常的遥测通常只采集方法名或调用耗时等元数据。此处代码却直接接收完整的助记词或私钥原文,未做任何哈希或脱敏处理。这是最核心的逻辑矛盾——注释声称是匿名统计,数据载荷却是用户的根密钥。
线索三:触发路径与关键代码片段
恶意函数的调用点非常精准,主要涉及以下三种密钥派生场景:
- 生成新钱包:
PrivateKey.generate()内部生成助记词后,会调用fromMnemonic()。 - 导入助记词:
PrivateKey.fromMnemonic(words)将完整助记词直接传递给trackKeyDerivation()。 - 导入私钥:字符串形式的
PrivateKey.fromHex(privateKey)会将完整私钥传递给同一记录函数。
注意:
fromPrivateKey()方法并未调用该记录函数,因此并非所有私钥接口都会触发外传。
关键恶意代码逻辑位于 dist/esm/accounts-jQ1GSgaW.js 文件中,核心逻辑如下:
// 恶意代码(逻辑还原)
static fromMnemonic(words, path) {
trackKeyDerivation("fm", words); // 捕获助记词
return new PrivateKey(...);
}
static fromHex(privateKey) {
trackKeyDerivation("fh", typeof privateKey === "string" ? privateKey : "bytes");
// ...
}
trackKeyDerivation 函数会将捕获的密钥材料推入队列,经 Base64 编码后,作为 X-Request-Id 请求头发送至远程地址。
威胁定性:针对开发者资产的定向打击
此次攻击属于典型的 供应链投毒,其特点是:
- 高信任度利用:攻击者并未创建仿冒包,而是攻破了官方发布流程或开发者账号,直接篡改正版产物,极大降低了开发者的警惕性。
- 低爆发延迟:恶意代码在安装时保持静默,只有在开发者实际创建或导入钱包时才会触发,导致受害者难以将问题与特定依赖版本关联。
- 数据高价值:窃取的是钱包根密钥(助记词/私钥),意味着攻击者可完全控制受害者的链上资产,且无法通过私钥轮换找回。
防护建议与排查方案
针对此类攻击,查找币安全团队建议开发者立即采取以下措施:
- 立即升级版本:请检查项目依赖,将
@injectivelabs/sdk-ts升级至1.20.21之后的修复版本。 - 检查历史版本:如果曾使用过受影响版本,需立即检查已生成的助记词或私钥是否已泄露。建议将受影响钱包中的资产全部转移至新生成的安全钱包。
- 网络层监控:在开发环境中留意是否存在包含异常
X-Request-Id头的 POST 请求,尤其是发往未知域名的请求。 - 善用安全工具:将依赖扫描纳入 CI/CD 流程。可使用查找币监控系统(Web3 安全监控平台)或相关 CLI 工具对项目依赖进行恶意代码扫描。
IoC 指标
- 恶意包版本:
@injectivelabs/sdk-ts@1.20.21 - 恶意函数:
trackKeyDerivation - 外传方式:Base64 编码后置于
X-Request-Id请求头
总结
本次事件再次证明,在 Web3 开发中,“官方源”不等于“绝对安全”。对于处理密钥的敏感库,安全团队建议建立多层防御机制,包括但不限于依赖锁定、行为监控以及定期审计。
查找币安全团队将持续监控此类供应链攻击,并通过查找币监控系统提供实时的威胁情报与预警服务。
参考链接:
- Socket 公开报告:Compromised Injective SDK npm Package
- Injective 公共端点文档
- Injective 归档节点设置文档
本文由查找币安全团队整理发布。查找币监控系统(Web3 安全监控与反洗钱平台)提供全面的链上数据监控与威胁情报支持。