傅继晗,沈 炜
(浙江理工大学信息学院,浙江杭州 310018)
发改运行〔2021〕1283 号文件指出虚拟货币挖矿活动是通过专用“矿机”计算生产虚拟货币的过程,该活动能源消耗与碳排放量大,对国民经济贡献度低[1]。比特币[2]发明以来,使用各类挖矿算法的加密货币层出不穷,至今已经超过了8 600 种,总市值超过了2.21 万亿美元[3]。在如此高的挖矿热度下,挖矿已经从矿场扩散到零星设备,更有甚者,通过恶意挖矿网页等非法方式占用用户资源牟取非法利益[4]。自从2017 年诞生第一个网页挖矿程序coinhive[5]以来,越来越多恶意挖矿网页采用内嵌挖矿脚本的形式,在用户登录网页期间,利用网页代码实施挖矿劫持攻击(cryptojacking),严重耗费了计算机资源,影响了人们正常的生产生活。因此,通过科学可信的检测手段对挖矿网页进行准确检测、判断是当今网络安全研究中一个重要课题。
随着网页内置挖矿程序越来越多,不少网页挖矿网站黑名单被曝光,如Nocoin[6]和MinerBlock[7]将含有挖矿木马的URL、域名、IP 地址等信息保存在黑名单库中,通过检索判断是否为恶意网页。然而,随着恶意挖矿网页变种增多,不少网站都使用DGA 域名生成算法等手段生成无规律随机的域名来绕过一般的检测机制,因此对恶意挖矿网站进行行为特征分析十分重要。在国内外相关研究中,主要分为恶意挖矿网站的静态分析和动态分析,国内辛毅等[8]对挖矿木马进行检测分析,应宗浩等[9]对木马攻击手段进行研究。国外如Romano 等[10]提出MinerRay 技术,通过语义分析网页代码分析挖矿行为;Domhnall Carlin 等[11]通过ollydbg 调试运行恶意网页的Chrome 浏览器,从机器指令集角度分析恶意网页特征;Papadopoulos 等[12]通过网页运行时的CPU、内存使用情况以及系统温度识别挖矿网页。
但上述恶意挖矿网页分析方法存在以下3个问题:
(1)由于恶意代码在Chrome 浏览器的JavaScript 虚拟机中运行,因此通过ollydbg 等调试器进行机器指令级分析效率不高,且在不同架构CPU 的机器上通用性差。
(2)恶意代码存在严重混淆,导致如上文提到的minerray 等一些JavaScript 分析框架容易出错,在实验中难以对付越来越多的恶意挖矿变种。
(3)通过网页运行时的CPU、内存使用情况以及系统温度识别挖矿网页容易造成误报,错误地将一些网页游戏识别成挖矿程序,而且检测环境必须是在只运行浏览器的情况下,实际生产环境中难以做到,并且受外界温湿度的影响较大。
针对以上问题,本文提出基于Chrome 浏览器自带的开发人员工具检测网页挖矿的方法,能有效提升检测效率与准确度。通过FOFA 引擎搜索authedmine.com 接口,获取有代表性的挖矿网页http://218.29.203.186:7788,并以该网站为例,使用Chrome 自带的开发人员工具分析其挖矿期间的各种特征,从而提高对网页恶意挖矿行为的检测及防范水平。
一个HTML 格式的网页主要由head、body 组成,其中head 和body 里可以插入script 标签或者iframe 以引入其他外部js 脚本。在本例恶意挖矿网页中发现了两处恶意挖矿代码的引入点。其中,位于head中的script标签如下:
从上述script 标签引入的恶意代码中,可以看见设置了API_KEY(见图1),恶意代码植入者通过设置API_KEY来连接挖矿服务提供者,从而将挖矿收益记录到自己的账户。同时,该恶意代码还创建了新的iframe 标签(见图2),iframe 也被称为HTML 内联框架元素,能将另一个HTML页面嵌入到当前页面中[13],恶意代码通过创建iframe 进一步引入新的恶意代码并执行。由于iframe 的代码执行虚拟环境独立于主网页,因此通过iframe 执行恶意代码也能一定程度上绕开相关检测机制。
Fig.1 API_KEY imported with malicious code图1 恶意代码引入的API_KEY
Fig.2 Impovting new malicious code by creating new iframe图2 通过创建新的iframe引入新的恶意代码
进一步分析新引入的iframe,发现其本质是一个表单,一旦点击表单上蓝色高亮的同意按钮,该iframe 会加载混淆过的恶意挖矿代码,如图3所示。
Fig.3 Impovting new malicious code图3 引入新的恶意代码
对恶意代码进行反混淆,发现恶意挖矿代码的原理是通过隐式方式引入wasm 文件,使用WebAssembly 语言通过浏览器进行挖矿,如图4 所示。WebAssembly 是一种新型编码方式,是一种低级的类汇编语言[14],具有紧凑的二进制格式,可以接近原生的性能运行。恶意代码使用WebAssembly 提升了挖矿效率。
Fig.4 Wasm object imported in malicious code图4 恶意代码中植入的wasm文件对象
对上述恶意样本进行静态代码分析后可以发现,恶意样本的代码混淆程度较高,且使用iframe 执行代码,导致使用一般的方法难以识别挖矿代码。本文将使用Chrome自带的开发人员工具从网络行为以及javascriptCPU 性能剖析器的角度对恶意样本进行分析。
在恶意网站加载完所有恶意代码之后,浏览器控制台会打印一条WebSockets 连接的建立和多个worker 的创建情况,随后另一组WebSockets 和worker 建立,通过分析日志打印的来源(Chrome JavaScript 引擎脚本VM6 与VM8)以及两条不同的wss 连接路径,得知这两组WebSockets 和wocker 分别来自前一节两处不同恶意代码引入点的执行环境,如图5所示。
WebSockets 是一种先进的技术,可以在用户的浏览器和服务器之间打开交互式通信会话[15],与http 协议共享端口。通过分析WebSockets 网址和传输的json 格式消息,可以确定该WebSockets 连接用于下发挖矿任务,同时向挖矿服务器上传挖矿结果。由于其采用了wss 即WebSockets over SSL/TLS 加密方案,导致各单位难以从网关过滤中发现此类流量,如图6 所示。对恶意网站另一处iframe 引入的代码(见图1)进行比较分析后发现,该处引入的恶意代码与图6 处一致,且引入该代码的url 中key 的数据一样,均为jC8oUd3fagiDXAm,表明该处代码与前一处script标签的代码为同一黑客引入。
Fig.5 Two sets of console logs图5 两组控制台日志
Fig.6 Wss sessions created while malicious code executing图6 恶意代码建立的wss消息内容
通过分析wss 的消息内容,得知挖矿服务器下发了多个任务,同时继续对恶意样本进行网络日志审计,发现该恶意网站加载了多组相同的恶意代码,其中包括与上一节相同的wasm 代码,如图7所示。
Fig.7 Malicious samples loaded multiple groups of minning codes图7 恶意样本加载了多组挖矿代码
由此可以推断该恶意样本至少同时使用8 个线程进行挖矿。虽然挖矿软件的网络流量经过了SSL 加密,外部网关难以获取相关流量,但由于挖矿软件本身是在浏览器中运行,因此使用Chrome 自带的开发人员工具能够绕开SSL 层,无需解密即可直接获取挖矿程序运行时的网络流量日志,为特征分析提供方便。
由于浏览器开发人员自带的工具使用Chrome Dev-Tools Protocol 协议连接调试页面,也即是说,任何一个实现了Chrome DevTools Protocol 的程序都可以用来调试页面。据此,提出以下检测恶意挖矿网站的方法,即使用remotedebugging-port 参数启动Chrome 浏览器无头模式,暴露出Chrome DevTools Protocol 协议端口,再使用nodejs 调用Chrome-remote-interface 库,通过该协议与无头模式的浏览器进行通讯,控制浏览器访问恶意挖矿网站,最后通过记录websocket 日志,从中提取特征信息,如“wasm”“set_job””get_job”等,与挖矿流量日志数据库进行比对即可筛选出挖矿网站,流程如图8所示。
Fig.8 Web mining detection program based on traffic analysis图8 基于流量分析的网页挖矿检测程序
虚拟货币挖矿需要大量计算,必定会增加CPU 负荷。劫持挖矿一般利用CPU 较多、GPU 较少,导致CPU 利用率过高,因此观察CPU 利用率可作为判定是否被劫持挖矿的特征之一。JavaScript CPU 性能剖析器是一个Chrome 开发人员工具里自带的JavaScript 动态分析组件,能自动记录放入其中的JavaScript 代码运行时每个函数调用栈消耗CPU 的特征。由于恶意网站使用了代码混淆技术,使用JavaScript CPU 性能剖析器能够很好地抗混淆并记录虚拟机实例中执行的函数名称。鉴于恶意挖矿木马往往在视频网站中寄生,故将普通视频网站与恶意样本的运行结果进行比对,分析其动态运行特征,结果如下:
由图9、图10 可知,在恶意网站中,存在多个JavaScript虚拟机实例,且每个实例中wasm-function 函数占用CPU 的时间最多,而在普通的视频网站中,则是program 函数占用时间最多,如图11所示。
火焰图是一种基于堆栈跟踪剖析器收集数据绘制的用于性能剖析的可视化图表。在火焰图中,元素以堆叠方式显示,函数的调用堆栈从下到上显示,其中最上面的元素代表堆栈中最新调用的函数[16],如图12、图13 所示,元素越宽代表该函数占用CPU 资源越多。Chrome 开发人员工具每隔一段时间(timeDeltas)进行采样得到绘制火焰图的原始数据,对以上函数调用情况绘制火焰图表可以发现,挖矿网站的资源使用情况呈现一定规律,而普通网站的资源使用情况相对不规律,如图14、图15所示。
Fig.9 Malicious code creates multiple JS virtual machine instances for mining图9 恶意代码创建多个JS虚拟机实例挖矿
Fig.10 Function calls of malicious websites图10 恶意网站中的函数调用情况
Fig.11 Function calls of ordinary video websites图11 普通视频网站中的函数调用情况
由于开发人员工具导出的性能分析数据为函数调用栈顶函数名的排列串,因此排除这些函数串中名称为“(program)”或者“(idle)”的函数,从剩下的函数名子串中选择函数名相同的连续子串s1s2s3…sk。通过Amir 等[17]提出的周期模式挖掘算法获取其中可能的排列周期,即选定一个ε∈[0,1),存在ρ,使得s1s2s3…sk中存在最大子串序列snsn+1sn+2…sn+m,满足其中任意子串长度的绝对误差大于ρ且小于ρ(1 +ε),从中获得的最大子串序列长度m即为挖矿函数周期数M,ρ为挖矿函数周期长度P,用伪代码表示如下:
Fig.12 Code snippets and data collected by the corresponding performance profiler图12 代码片段与对应性能剖析器采集的数据
Fig.13 Flame diagram based on the data collected in figure 12图13 根据图12采集数据绘制的火焰图
Fig.14 CPU performance flame diagram of malicious websites图14 恶意网站的CPU性能火焰图
Fig.15 CPU performance flame diagram of ordinary video websites图15 普通视频网站的CPU性能火焰图
由此,设计一个基于JavaScript 剖析器的网页挖矿检测程序,其工作模式如图16所示。
Fig.16 Web mining detection program based on performance profile图16 基于性能剖析器的网页挖矿检测程序
硬件环境为HP probook 440 G6,软件环境为windows10 20H4 以及python3.10,实现方式为通过python 控制基于Chrome 的无头浏览器访问样本中的网页。
利用Adblock 防火墙提供的基于浏览器的秘密挖矿黑名单[18]和部分浏览器插件内置的挖矿黑名单,收集有挖矿静态特征的20 个挖矿网页样本。通过网络各收集20 个有视频网页样本和无视频一般网页样本,使用本文提出的网页挖矿检测方法通过流量分析和CPU 分析进行验证。
在特征分析中,本文定义疑似存在挖矿静态特征的网页特征分析为真(T),否则为假(F);在流量分析中,使用remote-debugging-port 参数启动Chrome 浏览器无头模式,暴露出DevTools Protocol 协议端口,再使用nodejs 调用Chrome-remote-interface 库,通过该协议与浏览器进行通讯,控制浏览器访问恶意挖矿网站,从记录websocket 日志中提取特征信息,并与挖矿流量日志数据库比对,符合特征为真(T),否则为假(F);在CPU 分析中,利用JavaScript CPU 性能剖析器进行验证,网页占用CPU 资源多且占用情况呈现一定规律的为真(T),否则为假(F)。具体验证结果如表1所示。
Table 1 Experimental verification results表1 实验验证结果
结果表明,挖矿网页3 项全部为真即真阳性TP(预测为正,实际也为正)最大检出数为18 个,最小数也有17 个,其准确率在85%~90%之间,而其他网页假阴性FN(预测为负、实际为正)最多只有1 个。因此,该方法能有效检测出大多数挖矿网页,有较高准确率。
本文以一个真实的挖矿网站为例,提出两种基于Chrome 浏览器自带开发人员工具(DevTools)的自动化动态检测分析方法,将两种动态检测分析方法相结合具有效率高、抗混淆和出错率低的特点。未来开发人员可以基于Chrome DevTools Protocol 结合相关封装好的调用库开发相关检测工具,以提升检测水平。在实际中,有一些矿池采用加密通信,对于加密流量如何检测,本文未作研究,将在下一步进行探索。