原文:https://www.virusbulletin.com/virusbulletin/2018/10/dark-side-webassembly/
在本文的上篇中,我们为读者详细介绍了WebAssembly的基础知识,现在,我们以案例的方式,为读者介绍它在恶意软件方面的用途。
案例1:技术支持诈骗
什么是技术支持诈骗?
技术支持诈骗是一种电话欺诈,其中诈骗者声称可以提供合法的技术支持服务。该骗局可能以陌生电话开始,骗子通常会声称来自合法的第三方的员工,如“微软”或“Windows部门”。他们会要求通过远程桌面软件连接受害者的计算机,然后施展各种骗人手段,比如使用各种Windows组件和实用程序(如事件查看器)、第三方软件(如假冒的安全软件)以及维基百科等参考资料网站或安全公司撰写的摘要,让受害者相信计算机存在需要修复的安全问题,然后再要求受害者支付“支持”费用。这些骗局通常针对老年人这样的用户,因为他们不熟悉骗子使用的工具,特别是收到陌生电话后,常常会人慌无智。
在其他情况下,骗局是通过浏览器弹出窗口进行的,该弹出窗口会“警告”受害者,声称他们的机器已经感染了病毒,并敦促他们拨打技术支持电话。图5中显示了技术支持诈骗中的一个浏览器弹出窗口的示例。
图5:用于技术支持诈骗的浏览器弹出窗口。
攻击者希望受害者能在浏览器中看到警报,并继续弹出“系统感染病毒”之类的窗口对其进行轰炸。当受害者拨打技术支持电话时,骗子要么要求用户付钱来解决“问题”,要么干脆在受害者的机器上安装一些恶意软件/后门。
技术支持诈骗来源
技术支持诈骗的来源包括:
技术支持诈骗数量呈上升趋势
长期以来,漏洞利用工具包是恶意软件作者的首选恶意软件交付工具。但是,随着浏览器和相关插件不断更新,以及操作系统安全性的不断提高,漏洞利用工具包变得越来越不可行,恶意软件作者的感染率也越来越低。为了保持资金流动,与漏洞利用工具包相关的重定向活动逐渐倾向采用技术支持诈骗方式。这导致了技术支持骗局的大量涌现。这一点,我们可以从微软[10]和FBI的互联网犯罪投诉中心(IC3)[11]提供的报告中可以找到相应的证据。
技术支持诈骗技法越来越难以发现
技术支持诈骗刚出现时,所有恶意的网页行为都是通过JavaScript来实现的,并且这些JavaScript未经过混淆处理,所以很容易被检测到。然而,随着技术支持诈骗开始成为网络安全威胁领域的主要力量,各种反检测功能也不断被加入进来:刚开始,只是使用诸如十六进制编码之类的轻度混淆处理,后来升级为使用打包编码,甚至采用各种高级加密算法,如AES(高级加密标准)[12,13](参见图6)。
图6:随着技术支持诈骗开始成为网络安全威胁领域的主要力量,各种反检测功能也不断被加入进来。
下一步:应用WebAssembly
前面,我们已经介绍了WebAssembly和技术支持诈骗的背景知识,下面,让我们来深入了解它们的融合情况。
对于技术支持诈骗来说,几乎所有的过程都是通过JavaScript来实现的。通过WebAssembly,攻击者可以把JavaScript编译为二进制形式来执行,这样可以降低被检测到的机率。因此,两者结合后,不仅可以通过基于WebAssembly代码的诈骗行为来实现吓唬受害者的目的,而且还不会留下任何痕迹。
图7展示了这种组合的POC,即执行JavaScript代码的C代码片段。
图7 POC:执行JavaScript代码的C代码片段。
Emscripten编译器提供了一种使用EM_ASM()[14]从C代码中调用JavaScript代码的方法。
EM_ASM()标签中的代码将被执行,就像这里是已经生成的代码一样。也就是说,这里的JavaScript代码就像平常在Web上找到的普通JavaScript代码一样被执行。
对于这段JavaScript代码,首先会显示警告用户系统被感染的弹出窗口和图像,具体如图8所示。
图8:弹出窗口警告用户系统已被感染。
之后,代码会检查以下按键:
键码 按键
13 ENTER
27 ESC
18 ALT
123 F12
85 u
9 TAB
115 F4
116 F5
112 F1
114 F3
17 CTRL
这可以防止用户通过按下ESC或CTRL+ALT+DELETE组合键或表格中显示的其他按键来退出诈骗窗口。
此外,该代码还监控鼠标点击事件,并在每次点击鼠标时都会弹出恶意警告窗口。
在这个场景中,只有“document.write()”标签中的代码会在浏览器中呈现,而JavaScript代码是动态加载的。这些C代码唯一可见的踪迹,就是在浏览器缓存中可见的Wasm文件,其内容如图9所示。因此,安全产品只会看到已编译的Wasm文件,而不会看到JavaScript源代码。这类似于使用文本编辑器考察可执行文件,从而使检测变得愈加困难。
图9:在浏览器缓存中看到的WASM文件的内容。
案例2:网站型键盘记录程序
键盘记录程序是什么?
键盘记录(Keystroke logging)通常被称为键盘记录(keylogging)或键盘捕获(keyboard capture),指的是记录用户的击键动作,当然,通常都是秘密进行的,这样使用键盘的人就不知道他们的动作正在被监控。然后,操作日志程序(更广为人知的说法是键盘记录程序[15])的人可以捕获相应的数据了。
键盘记录程序最常用于窃取密码和其他机密信息。
键盘记录器通常会以各种形式出现,包括可执行文件、脚本文件等,但最终目标都是窃取机密数据,如密码、信用卡信息等。
键盘记录程序对应的可执行文件可以通过各种渠道植入文件系统,例如通过垃圾邮件、社会工程诈骗、漏洞利用程序,等等。不管当前系统上面运行的是哪种应用程序,键盘记录程序的可执行代码都可以监视相应的按键操作——也就是说,无论用户正在填写网站表单、向记事本文件输入内容,还是通过键盘执行任何其他操作,键盘记录程序都能发挥作用。
脚本型键盘记录程序通常都是使用诸如JavaScript、VB之类的脚本语言编写的。之后,它们会被注入到被入侵的网站中,以窃取网站访问者的密码和其他机密信息。在大多数情况下,网站所有者和访问者都不知道这种键盘记录活动的存在。同时,这些脚本型键盘记录程序只能在被注入的网站上面发挥作用。在本文中,我们将讨论如何将脚本型键盘记录程序与WebAssembly结合起来。由于这种键盘记录程序完全是用JavaScript代码编写的,因此,很容易被基于字符串的检测方法所发现。通过以下概念证明代码,我们将为读者展示如何绕过这些检测方法。
图10:POC代码。
对于图10所示的代码来说,其中包含了四个主要功能:
在第43行和第57行,我们可以看到"change"事件监听器被附加到了用户名和密码的文本字段中。当用户输入完用户名/密码后,将会触发该事件。触发该事件时,将分别调用myFunction0()或myFunction1()中的代码,以捕获相应的登陆凭证。
代码的其余部分只是为用户输入表单构建相应的HTML前端。
在这种情况下,安全产品只会看到编译后的Wasm文件而非JavaScript源代码,从而使检测工作变得更加困难。
概念证明代码的输出结果可以在图11中看到。
图11:概念证明代码的输出结果。
该示例表明,WebAssembly可用于在网络钓鱼活动捕获机密信息,并且不会留下许多痕迹,从而提高了安全检测的难度。
WebAssembly——探索新领域
正如我们所看到的那样,WebAssembly可以通过各种方式用于实现邪恶的目标。但是,这些只是一个开端而已。我们坚信,在未来,WebAssembly将涉足以下一个或多个领域:
因此,我们可以使用WebAssembly构建一个很长的重定向链:首先,让被入侵的网站加载上面的Wasm,而Wasm代码则用于生成一个定制的网络钓鱼页面,进而通过WebAssembly代码来窃取机密信息。
参考资料
[2] http://2ality.com/2013/02/asm-js.html.
[4] https://brendaneich.com/2015/06/from-asm-js-to-webassembly/.
[5] https://auth0.com/blog/7-things-you-should-know-about-web-assembly/.
[7] https://developer.mozilla.org/en-US/docs/WebAssembly.
[8] https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Emscripten.
[9] http://kripken.github.io/emscripten-site/.
[11] https://www.ic3.gov/media/2018/180328.aspx.
[12] https://www.symantec.com/connect/blogs/tech-support-scams-increasing-complexity.
[13] https://www.symantec.com/blogs/threat-intelligence/tech-support-scams-aes.