主页 > imtoken官网 > 篡改 npm 包窃取比特币

篡改 npm 包窃取比特币

imtoken官网 2023-09-18 05:09:31

比特币钱包 Copay 被依赖链攻击。 这个瓜上周在技术圈引起了广泛的讨论。 看了很多大佬的分析,理清了前因后果。 在这里我也将和大家分享一波黑客是如何一步步实现他的惊人计划的。

一、背景介绍

event-stream 是开源社区中用于处理 Node.js 流数据的 npm 包。 它使创建和使用流变得容易。 也正是因为这个原因,它受到了开发者的欢迎。 目前该库的下载量达到上周。 [165万]。

如何盗取钱包内的比特币_黑客怎么盗取比特币_为什么黑客可以盗取比特币

事件流托管在 npm 上

此次事件的起因是项目作者@dominictarr 受时间和精力所限,将其维护工作交给了另一位开发者@Right9ctrl。 开发者获得event-stream权限后,通过dependency flatmap-stream将恶意代码注入到event-stream中。 也正是这种依赖性引入了窃取比特币的后门。

同时,知名比特币钱包Dash Copay在其应用中引用了对事件流的依赖,从而导致了中毒事件。

梳理一下,黑客的具体步骤如下:

如何盗取钱包内的比特币_黑客怎么盗取比特币_为什么黑客可以盗取比特币

原作者的解释

如何盗取钱包内的比特币_为什么黑客可以盗取比特币_黑客怎么盗取比特币

黑客怎么盗取比特币_为什么黑客可以盗取比特币_如何盗取钱包内的比特币

黑客的攻击步骤

2.盗窃和盗窃曝光

那么黑客的代码究竟是如何窃取比特币的呢? 通过分析flatmap-stream的源码,我们可以将其分解为四步:

外部代码判断执行环境。 如果在copay-dash项目中运行,会解密执行16进制加密的内码。

内码判断用户的使用环境(是否使用Cordova),同时获取受害者个人钱包信息。

通过遍历受害者钱包中的所有ID,找到账户余额超过100个BTC(市值300万元人民币)或1000个BCH(市值125万元人民币)的账户。

将受害者的账户信息和钱包密钥分别发送到部署在吉隆坡的服务器111.90.151.134和copayapi.host(之前的DNS解析为:145.249.104.239,目前为:51.38.112.212)。

为什么黑客可以盗取比特币_黑客怎么盗取比特币_如何盗取钱包内的比特币

接触

整件事的曝光非常戏剧化。 一个完全不相关的第三方开发者在他的项目中引入了Nodemon监控,但是在控制台出现了警告“DeprecationWarning: crypto.createDecipher is deprecated”。

Crypto是一个常用的加解密库。 最近因为api升级,新版本废弃了它的crypto.createDecipher方法,所以系统报错。

如何盗取钱包内的比特币_为什么黑客可以盗取比特币_黑客怎么盗取比特币

一场事故暴露了整个事件

但是一般情况下,nodejs的监控是不需要加解密的。 因此,为了解决这个意外的警告,热情的开发人员将问题上报给了社区。 在解决问题的过程中,他们一路向上遍历了他项目的依赖树,最后发现这个依赖是由flatmap-stream引入的。 通过解密flatmap-stream的代码,拉开了整个事件的序幕​​。

如何盗取钱包内的比特币_黑客怎么盗取比特币_为什么黑客可以盗取比特币

攻击和发现

如何盗取钱包内的比特币_为什么黑客可以盗取比特币_黑客怎么盗取比特币

3.代码分析

下面我们一步步分析黑客是如何通过回溯代码实现他的窃取的。 不想看详细解析的可以直接跳到章末总结图:)

首先对攻击者上传的原始代码flatmap-stream@0.1.1进行压缩:

如何盗取钱包内的比特币_为什么黑客可以盗取比特币_黑客怎么盗取比特币

其中,问题代码偷偷放在最后。 我们对代码进行解压和格式化,得到可读的问题代码1:

如何盗取钱包内的比特币_为什么黑客可以盗取比特币_黑客怎么盗取比特币

上面的代码部分转换成十六进制,我们可以进行十六进制转换得到转码码1,其中r(e("2e2f746573742f64617461")),翻译过来就是require("./test/data"); 目前 data.js 文件已从原项目中删除。 按照FallingSnow的描述,data.js文件是一个数组如下,对应原代码中的数组n。 对数组进行转码后,可以得到:

如何盗取钱包内的比特币_黑客怎么盗取比特币_为什么黑客可以盗取比特币

如何盗取钱包内的比特币_黑客怎么盗取比特币_为什么黑客可以盗取比特币

将问题代码的数组n替换为data.js,可以得到如下转码代码2:

黑客怎么盗取比特币_为什么黑客可以盗取比特币_如何盗取钱包内的比特币

其中数组n很特殊。 前两项n[0]、n[1]的长字符串需要用依赖项目的“npmpackagedescription”进行解密,只有描述恰好是“A Secure Bitcoin Wallet”才能成功解密. copay项目的描述是这样的“巧合”,所以这是针对copay钱包的针对性攻击。 同时,crypto.createDecipher这个过时的api终于暴露了,因为这里被黑客利用了。 经过两轮解密,我们得到最终的解密代码,我对其进行了语义和注释如下:

如何盗取钱包内的比特币_为什么黑客可以盗取比特币_黑客怎么盗取比特币

由于上面的解密代码比较清楚,这里只简单描述一下。 它大概分两步窃取用户的个人信息和钱包密钥,然后加密后发送到自己位于吉隆坡的服务器。 实现方法是利用JS的原型链引用重写flatmap-stream中的Credentials.getKeys方法。 这个方法被copay-dash项目组用来获取用户的秘钥。 程序执行该方法后,用户将密钥发送到自己的服务器。

为了让大家更好的梳理攻击过程如何盗取钱包内的比特币,我画了一张解密流程图供参考:

黑客怎么盗取比特币_为什么黑客可以盗取比特币_如何盗取钱包内的比特币

四、影响与反思

黑客怎么盗取比特币_如何盗取钱包内的比特币_为什么黑客可以盗取比特币

问题暴露后,copay钱包项目组紧急修复并推出v5.2.0版本,但仍有大量未更新的旧钱包版本(v5.0.2~v5.1.0)中毒。 他们还建议用户升级并将比特币转移到新钱包。 目前,已有用户声称钱包中的比特币被盗,copay声称正在解决此事。

黑客怎么盗取比特币_为什么黑客可以盗取比特币_如何盗取钱包内的比特币

已有用户声称电子钱包被盗

作为第三方开发者,我们可以使用“npm ls event-stream flatmap-stream”来查看我们项目中是否安装了相关的依赖包。 下面是一个安装了中毒依赖包的本地项目。 如果你还安装了event-stream@3.3.6如何盗取钱包内的比特币,请将依赖升级到最新版本。

为什么黑客可以盗取比特币_黑客怎么盗取比特币_如何盗取钱包内的比特币

依赖链攻击目前还没有很好的解决方案。 虽然社区中有建议限制依赖包的权限或者要求npm提交明文,但短期内实现的可能性不大。

我们唯一能做的就是在引用依赖项之前仔细审核引用的包。 同时,锁定经过安全认证的包版本,确保不引入新的有毒依赖。

参考文件

下载量高达800万的npm包被黑客篡改,你的设备或成矿机

JavaScript 黑客如何窃取比特币,Vue 开发者不用担心! @Fundebug