原文:https://www.virusbulletin.com/virusbulletin/2018/10/dark-side-webassembly/
摘要
WebAssembly(Wasm)格式是一种在Web浏览器中运行C/C++等本机语言编译而成的代码的方法。与其他诸如JavaScript之类的编程语言编译得到的字节码相比,由本机代码编译得到的WebAssembly字节码的运行速度要更快一些。WebAssembly经常用于开发网页游戏。此外,目前包括Chrome、Firefox和Microsoft Edge在内的所有流行浏览器的最新版本都已经对WebAssembly提供了相应的支持。
虽然Wasm已经问世多年,但直到最近被用于浏览器环境下的加密货币挖掘,它才开始崭露头角。同时,这也打开了Wasm恶意应用的潘多拉盒子。
在本文中,我们将研究Wasm恶意应用的一些具体例子,例如:
就目前来说,针对Wasm格式的恶意代码的检测还是非常困难的,因为这是一种编译型文件,使得之前基于字符串的检测方式几乎全部失效。下面,我们将讨论适用于上述方法的某些领域。
简介
JavaScript
JavaScript[1]是一种通用编程语言。JavaScript是一种非常简单的语言,却有着庞大的生态系统,并且与Web密不可分。除非将现有的Web应用程序全部推倒重来,否则根本就无法摆脱JavaScript——没有哪个浏览器供应商希望看到这一幕。此外,所有浏览器技术和安全约束都是专为JavaScript而设计的。
目前JavaScript的速度非常快,但是JavaScript引擎中的某些机制对其速度仍有所限制[2]:
Asm.js
Asm.js[3]是JavaScript语言的一个子集,定义该子集的目的是易于优化,主要用作C和C++等语言的编译器目标。Asm.js代码可以生成没有上述缺点的可执行文件。它们可以“提前”编译,并且比JIT编译的速度更快一些。
由于Web不受任何单一供应商的控制,因此每一次改进大家都必须群策群力。asm.js出自于Mozilla的一群核心开发人员之手。同时,Google开发人员则致力于Native Client(NaCl)和Portable Native Client(PNaCl),这是一种基于LLVM编译器项目的Web二进制格式。虽然这些解决方案都在某种程度上发挥了作用,但它们并没有为上述所有问题提供令人满意的答案。正是基于这种经验,WebAssembly便应运而生了:大家共同努力,旨在提供跨浏览器的编译器目标。
WebAssembly是asm.js不断进化的结果 [4]。WebAssembly的目标是填补一个迄今为止JavaScript被迫扮演的角色:一种可以作为编译器目标的低级代码表示形式。
WebAssembly为C和C++等语言提供了统一的编译目标,而这些语言很难映射到JavaScript语言[5]。
WebAssembly
WebAssembly (Wasm)是一种可以在现代web浏览器上运行的新型代码,它不仅提供了新的特性,同时,性能也有了显著的提升。它被认为是web的一种新的二进制格式[6,7]。通常,对性能要求很高的函数,可以先用Wasm实现,然后,可以像库一样导入到JavaScript代码中。
当然,创建Wasm的初衷并非为了替代JavaScript,而是为了实现两者之间的补充和配合。随着WebAssembly的引入,现代web浏览器的虚拟机将同时运行JavaScript和Wasm代码。
目前,所有主流浏览器都已经支持Wasm。WebAssembly代码的优点包括:
WebAssembly:旨在提供跨浏览器编译器目标的共同协作。
如何生成WebAssembly代码?
像Emscripten [8,9]这样的工具可以用来将用C/C++编写的代码编译成WebAssembly代码:
图2:将上面的C示例代码的副本保存到本地驱动器的新目录下名为“hello.c”的文件中。
emcc hello.c -s WASM=1 -o hello.html
对于上述命令中的各个选项,解释如下:
-s WASM=1 ——规定输出格式为Wasm。如果我们不指定的话,Emscripten将只输出asm.js,就像默认情况下那样。
-o hello.html ——通知Emscripten生成一个HTML页面,用于存放要运行的代码(以及要使用的文件名),以及相应的Wasm模块和JavaScript“胶水”代码(用来编译和实例化Wasm,使其适用于Web环境)。
图3:将代码编译为WebAssembly格式。
我们将来的计划是摆脱上述JavaScript胶水代码,能够以类似JavaScripts (<script type='module'>)
这样的形式来加载WebAssembly模块。
WebAssembly与恶意软件
我们知道,WebAssembly不仅提供了出色的性能,还提供了丰富的功能,这些特性早晚会引起恶意软件作者的注意。WebAssembly在基于浏览器的挖矿方面非常具有竞争力:它能够高效地利用受害者的计算机资源(基本上是CPU周期)来挖掘加密货币。之所以这么说,是因为攻击者可以把用C语言实现的加密货币挖矿算法编译为WebAssembly代码。并且,如果采用这种形式的话,受害者通常感觉不到挖矿软件的运行。
挖矿流程如图4所示。
图4:挖矿流程
了解了上述技术后,下面将讨论恶意使用WebAssembly的其他方法。
小结
在本文中,我们为读者详细介绍了WebAssembly的基础知识,在下一篇文章中,我们将为读者介绍它在恶意软件方面的用途。