简介
关于虚拟机(VM)的检测并不新奇。恶意软件这样做已经有十多年了。随着时间的推移,防御者学会了躲避虚拟机检测的新方法,技术也随之进步。
不久前,我和我的一个朋友正在进行一个项目,该项目与通过网络应用程序进行的漏洞传递有关,目的是为了重新组建团队。我想用一种方法对网站的访问者进行指纹识别,并对指纹数据进行散列,这样我就可以寻找潜在的重复访问者。在调查指纹的时候,我偶然间发现了一件非常有趣的事情。当我在看一些收集WebGL功能信息的代码,我很快意识到,一些指纹信息可能对虚拟机检测很有用,因为供应商的名字被暴露了。在这个特殊的例子中,"VMWare "这个字符串被包含在WebGL信息中。经过一些更多的测试,我还发现VirtualBox也报告了同样的信息。
我一开始意识到有可能从浏览器中检测到虚拟机信息,我就开始深入挖掘,并开始搜索与这一发现有关的其他研究。我发现了一篇研究相当深入的学术论文,与跨多个浏览器追踪用户有关。这给了我一些可以应用于虚拟机检测的其他潜在技术。
这项研究的最终目标是为VM检测提供多种技术。多种技术可以提供更准确的检测。由于一些技术比其他技术更容易出现假阳性,因此可以对检测能力采用加权系统。这使我们能够产生检测信心评分。这可以帮助说明某些检测方法的不准确之处。如果有足够的测试和数据,那么就有可能得出一个合理的阈值。如果一个浏览器的得分高于阈值,那么它很可能是在一个虚拟机内。或者,如果浏览器的得分低于阈值,它可以被认为是在物理硬件上运行。
技术
现在我已经介绍了这篇文章的一些背景知识和历史,我们可以开始探讨实际的技术了。
正如之前在介绍中提到的,WebGL可以提供很多关于OpenGL实现的信息,包括供应商信息。WEBGL_debug_renderer_info extension可以用来查询调试信息,如WebGL供应商和渲染的信息。
var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl');
var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
console.log(vendor);
console.log(renderer);
除此之外,可以使用WebGL上下文的getExtension方法来查询扩展的可用性。我还没有完全探索过这个途径,但是也许可以根据可用的扩展来检测虚拟机提供的某些WebGL实现。尽管这个想法可能非常容易产生假阳性的。
下面是来自WebGLReport的截图,该网站专门用于指纹识别WebGL。
现在,需要注意的是,这取决于虚拟机的配置方式。例如,在VirtualBox中,将显示配置下的图形控制器设置为VMSVGA将报告导致WebGL使用基于CPU的OpenGL实现,这与浏览器有关。不过,这仍然是一个有用的指标,这表明客户机器是在虚拟机中运行的,因为大多数 现代硬件都集成了GPU,可以提供对OpenGL的原生访问。请记住,基于CPU的OpenGL实现并不一定意味着它是一个完全的虚拟机。
这张截图描述了谷歌浏览器利用基于CPU的OpenGL实现渲染器Google SwiftShader。
在普通恶意软件中看到的另一种技术是确定屏幕的宽度和高度。这也可以在Javascript中实现。此外,颜色深度和每像素的位数也是与显示有关的其他潜在的好指标。
var width = screen.width;
var height = screen.height;
var color_depth = screen.colorDepth;
var bitspp = screen.pixelDepth;
我们能检测到客户端的RAM数量吗?当然可以。再次使用JavaScript,我们可以大致确定浏览器上可用的RAM的数量。这里需要注意的一个细节是,浏览器只会以千兆字节(gb)为单位报告RAM值。还有一处细节,即它只报告8gb的数值,低至256mb(0.25gb)。不过,这些数值范围仍然足以作为虚拟机检测方法使用。现在的大多数物理工作机器至少有8GB的内存。检测较小的内存,如2gb或更少,将是一个很好的指标,表明客户端浏览器是在一个虚拟机中。
var ram = navigator.deviceMemory;
最后,我要介绍的最后一项技术是检测CPU核心的数量。这是通过使用同时运行的多个网络工作者进行定时攻击来实现的。在我对这项技术的测试中,我发现它非常准确。少量的CPU核心可以是一个体面的虚拟机指标,过去曾被恶意软件使用过。
总结
这篇博文涵盖了四种可以通过Javascript进行的独特的虚拟机检测功能。当我第一次发现这些技术时,我最初的想法是将这些概念应用于虚拟机检测。希望防御性和进攻性的安全专业人员都能找到有用的东西来应用这些技术。
有趣的是,学术界和其他各种研究人员已经将一些相同的概念应用于指纹和隐私问题。