虚拟机(VM)检测并不是什么新鲜事物。恶意软件已经这样做了十多年了。随着时间的推移,随着防御者了解了避免VM检测的新方法,该技术也得到了发展。
前一阵子,我和一个朋友正在从事一个与通过网络应用程序进行漏洞利用交付有关的项目,用于团队合作。我想要一种对网站的访问者进行指纹识别并对指纹数据进行哈希处理的方法,以便寻找潜在的重复访问者。在研究指纹时,我偶然发现了一些非常有趣的东西。我正在查看一些收集有关WebGL功能信息的代码。我很快意识到,由于公开了供应商的名称,因此某些指纹信息对于VM检测很有用。在此特定实例中,字符串" VMWare"包含在WebGL信息中。经过更多测试后,我还发现VirtualBox报告了相同的信息。
一旦意识到有可能从浏览器中检测到VM,我便开始更深入地研究并开始寻找与此发现有关的其他研究。我找到了一篇研究得很好的学术论文[1],该论文与跨多个浏览器跟踪用户有关。这给了我一些其他可以应用于虚拟机检测的潜在技术。
这项研究的最终目标是拥有多种用于VM检测的技术。多种技术可以使检测更加准确。由于某些技术比其他技术更容易出现假阳性,因此可以将加权系统应用于检测功能。这使我们能够生成检测置信度评分。这可以帮助解决某些检测方法的不准确性。如果有足够的测试和数据,那么就有可能提出一个合理的阈值。如果浏览器的得分高于阈值,则很可能在VM内。或者,如果浏览器得分低于阈值,则可以认为它在物理硬件上运行。
既然我已经介绍了导致此博客文章的一些背景信息和历史,我们就可以开始研究实际的技术了。
如引言中前面提到的,WebGL可以提供有关OpenGL实现的许多信息,包括供应商信息。 WEBGL_debug_renderer_info扩展[2]可用于查询调试信息,例如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);安慰 。日志(供应商);安慰 。日志(renderer);
此外,可以在WebGL上下文中使用getExtension方法查询扩展可用性。我还没有完全探索这种途径,但是可能可以基于可用扩展来检测VM提供的某些WebGL实现。尽管这个想法很容易产生假阳性。
现在,重要的是要注意,这取决于VM的配置方式。例如,在“虚拟盒子”中,将“显示”下的图形控制器设置设置为VMSVGA将报告导致WebGL使用基于CPU的OpenGL实现,该实现取决于浏览器。但是,由于大多数现代硬件都集成了GPU并可以提供对OpenGL的访问,因此这仍然可能是客户端计算机正在VM中运行的有用指示。请记住,基于CPU的OpenGL实现不一定意味着它完全是VM。
此屏幕快照描绘了利用基于CPU的OpenGL实现渲染器Google SwiftShader [4]的Google Chrome。
普通恶意软件中出现的另一种技术是确定屏幕的宽度和高度。这也可以用Javascript实现。此外,颜色深度和每像素位数是与显示相关的其他潜在的良好指示。
我们可以检测到客户端上的RAM数量吗?你打赌再次使用Javascript,我们可以大致确定浏览器上可用的RAM数量。这里要注意的一个怪癖是浏览器将仅报告GB的RAM值。它也有一个怪癖,它只会报告高达8GB的内存,而低至256MB(0.25GB)。但是,这些值的范围仍然足以用作VM检测方法。如今,大多数物理工作站都配备了至少8gb的RAM。检测到较小量的RAM(例如2gb或更少)将是客户端浏览器在VM中的良好指示。设备存储器的规格可以在[6]中找到。
最后,我将介绍的最后一项技术是检测CPU内核的数量。这是通过使用同时运行的多个Web Worker执行定时攻击来完成的。在测试这项技术的过程中,我发现它非常准确。我使用[7] Core Estimator Demo网站测试了这个概念。少数CPU内核可以作为不错的VM指示器,并且过去已被恶意软件使用。 Core Estimator还在github [8]上提供了Javascript库。
这篇博客文章介绍了可以通过Javascript执行的四种独特的VM检测功能。当我第一次发现这些技术时,我最初的想法是将这些概念应用于VM检测。希望防御者和进攻安全专业人士都能找到有用的东西,以将这些技术应用于其中。
有趣的是,学者和其他各种研究人员已将某些相同的概念应用于指纹识别和隐私问题。