HVMI(虚拟机管理程序内存自检)简介

2020-07-31 19:53:09

虚拟机管理程序内存自省(HVMI)已经存在很长一段时间了,并且有几个开源项目以某种方式利用了虚拟机自省(VMI)。通常,现有项目侧重于调试或跟踪来宾VM的执行。在这篇博客文章中,我们介绍了一种略微不同的内存自省方法:来宾VM的实时保护。我们讲述了我们的HVMI引擎背后的动机,它是如何构思的,它是如何随着时间的推移而演变的,最后,我们为什么让它对每个人都可用。

纵观本博客,我们假定读者对虚拟化技术(特别是Intel VT-x)和操作系统内部结构(Windows和Linux)有一定的基础知识,尽管我们试图在涉及到技术细节时尽可能多地进行介绍。

内存自检是从外部分析来宾VM内容的技术。实现这一点的最常见方式是使用虚拟机管理程序-运行的来宾虚拟机由虚拟机管理程序分析或自省。可以查看CPU上下文,可以观察物理内存的内容,等等。除了简单地分析VM的状态之外,自省逻辑或HVMI(从这里开始我们如何称呼它)还利用CPU提供的虚拟化功能来提供安全性。

例如,通过使用英特尔CPU提供的扩展页表(EPT)功能,HVMI会覆盖来宾操作系统内存保护策略。例如,HVMI可能会对某些内存区域强制执行不执行策略,即使攻击危及操作系统内核,也会失败。除了使用EPT实施内存访问限制外,HVMI还可以使用其他虚拟化功能来提供安全性。它可以防止修改某些关键资源,例如控制寄存器或型号特定寄存器。依赖于修改这些的rootkit或利用漏洞攻击将失败,因为HVMI会阻止修改。

HVMI不仅仅是优点,它确实有一些缺点。HVMI最重要的缺点之一是语义鸿沟-从VM外部,我们只能看到原始的物理内存,没有明显的意义。要做一些有用的事情,我们必须推断那些内存页包含什么。它是进程结构,还是堆栈页等。从性能角度来看,除了语义差距之外,为某些系统资源提供保护可能是具有挑战性的。在包含受保护结构的页面内进行的许多合法访问可能会导致严重的性能开销;这使得选择保护哪些结构成为一项非常困难的任务。最后,实现HVMI通常非常复杂,因为它通常需要对操作系统内核块进行反向工程,需要有关虚拟化的高级知识,当然还有软件工程。

HVMI在大约10年前(2011年末)作为一个研究理念开始。该团队最初只由一名研究人员(真的是您的)组成,他开发了最初的PoC(通过EPT实现简单的驱动程序-对象保护,以阻止TDL rootkit)。一旦得到了当权者的祝福,更多的时间和精力投入到了这项研究中,团队开始壮大。最初能够保护Windows 7上少数非分页内核内存页的非常简单的代码,后来变成了能够保护所有Windows版本(从Windows 7开始)、几个Linux发行版,甚至在每个版本上的用户模式进程免受各种类型攻击的野兽。

HVMI于2017年作为商业产品提供,作为SVE包-虚拟化环境安全的一部分。在此期间,对其进行了改进,提高了性能,并开发了几个新特性。在2019年末,我们决定将这项技术开源,让每个人都可以看到、使用、使用和扩展新的特性和功能。

实质上,HVMI需要一个虚拟机管理程序来提供所需的API来提供保护。所需的API可以在官方文档TODO参考中找到。一旦提供了这样的API,HVMI就会在来宾中放置几种类型的挂钩。例如,它可以拦截控制寄存器3(CR3-包含用于将线性地址转换为物理地址的页表地址的寄存器)-这样,HVMI就会拦截来宾内部的上下文切换。例如,通过拦截syscall MSR写入,HVMI拦截并阻止操纵syscall入口点地址的尝试。最重要的是,它使用EPT更改物理内存访问权限,从而覆盖和限制对来宾内存的某些区域的访问。

HVMI引擎是一个独立库,是独立的(它没有显式的外部依赖),可以在用户模式、内核模式甚至VMX根模式下运行。它完全是用C语言编写的,并用汇编语言编写了一些小片段。HVMI引擎期望包含多个API函数的接口通过与其集成的任何方式向其公开。在此上下文中,集成器是将HVMI库绑定到提供统一API的特定管理程序的工具。

支持的虚拟机管理程序包括我们内部构建的Napoca虚拟机管理程序TODO ref,以及著名的开源虚拟机管理程序Xen和KVM。使用Napoca虚拟机管理程序,HVMI引擎直接在VMX根目录中与HV并排运行。在Xen和KVM中,HVMI引擎在特定VM(或域)甚至dom0内作为常规用户模式进程运行。HVMI的一般架构如下图所示:

从功能的角度来看,HVMI是一个事件驱动库。当为来宾VM启用自检时,HVMI首先识别来宾操作系统类型、版本,以查找其内存中的各种重要结构。这个过程是异步的,这意味着一旦初始化函数返回,就不能保证HVMI已经完成初始化;客户自检过程的某些部分会在各种事件发生时发生(例如,当写入CR3时)。一旦启用了自省,HVMI就会在来宾系统内发生有趣事件时、创建或终止进程时、在受保护进程内分配新的内存区域时或在受保护区域内发生内存访问时启动。

虽然我们还不会深入讨论细节(现在还没有!)。关于HVMI引擎的内部结构,下面列出了HVMI提供的最重要功能:

对于受保护的进程,具有加载/卸载事件的已加载用户模式DLL的列表,以及具有分配/释放事件的进程的虚拟地址描述符的列表;

在Windows上,解析对象树的能力(这目前用于搜索客户内存中的驱动程序对象,但可以很容易地扩展以处理任何类型的对象);

能够拦截客户内部发生的异常(例如,#PF、#BP等);

能够隐藏某些来宾内存内容(在来宾内部发出的读取将以自定义值提供);

高级指令解码和处理(HVMI使用的反汇编程序提供关于解码指令的扩展信息,使得信息提取和仿真非常简单)。

HVMI引擎的主要目的首先是提供保护。下表包含HVMI旨在缓解的主要威胁类型:

Rootkit(各种技术被阻止,例如内核或其他驱动程序内的内联挂钩、SSDT挂钩、驱动程序对象挂钩、系统寄存器修改等);

我们看到了HVMI项目的巨大潜力,这就是为什么我们决定将其开源并向所有人开放。欢迎研究人员克隆该项目、运行该项目、进行实验并添加新功能。我们也接受拉取请求-如果您认为您的功能足够酷,请确保在主HVMI回购上提供!

英特尔正在不断开发新的虚拟化技术,使HVMI变得更好、更快。其中一些已经发布,比如虚拟化异常(#VE)、VM函数(VMFUNC)和子页权限(SPP),HVMI利用了它们。其他的,如Hypervisor线性地址转换(HLAT)最近已经宣布,并将在未来几年进入硅片。我们确信还会有其他技术问世,这表明硬件供应商和软件开发人员都希望投入时间和精力来创建新的虚拟化功能!

文档可以在https://hvmi.readthedocs.io上找到-它包含高级文档和低级源代码文档,格式为DOOXO;

有关该项目的任何讨论,欢迎所有人加入我们的SLACK,网址为kvm-vmi.slack.com(您可以使用此链接自动加入:https://kvm-vmi.herokuapp.com);

对于在HVMI项目中发现的安全问题,请使用以下电子邮件地址进行报告:[email protected];电子邮件必须使用hvmi公共PGP密钥进行加密,该密钥可在帖子末尾找到。

-BEGIN PGP公钥块-COMMENT:USER-ID:hvmi-security<;[email protected]>;备注:创建时间:7/15/2020 2:01 PM备注:过期时间:7/15/2022 12:00 PM备注:类型:2048位rsa(提供密钥)备注:用法:签名、加密、认证User-ID备注:指纹:8FA363D0AD6F31067044FF4D6AA85FC4467740F2mQENBF8O4fkBCADfjTRjJFXASxSm7D8ZOnHmmYh8Achg92P3UcWoYlnLo7rryTZV7vv1LMwHpDXzbv3Za0vo0vbDtjmDC9PBHBo5CCIPOG0Bp4rhk889VZZoeyWs2sq+SFfGSDkIeXc5JRXyAHfhyz8rJFVYU72R+0v62DPZLenoBgbFnY6yq5Xc8EMuwKPxmgpg9J/jdLWy1mBN79ZQrCwp/ZKxBv7TR0quazY9K1WARUplWwVptnYJ0W/THnXeqF0dggWayr6ASZhmyGZEiQFbkJpMzgCWr49CgjVfw1MXidH8bif9Y2Zsv3ATRNm+TQMRlAsi+XlqO5Zcx+hnAOna6IRI6vFOli4LABEBAAG0LWh2bWktc2VjdXJpdHkgPGh2bWktc2VjdXJpdHlAYml0ZGVmZW5kZXIuY29tPokBVAQTAQgAPhYhBI+jY9CtbzEGcET/TWqoX8RGd0DyBQJfDuH5AhsDBQkDwkqXBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEGqoX8RGd0Dy4kMH/1wnPVqFBXOZcR2CRiWHExbIWwnzfDrYm/tEZzSof5QwSFN8DH8hLvNUcbflpkfgB0X8s6RjhCqbpfR/UyWmDNdsRPQ6AUh3aWUkK5BFdIEQB+Aiv3CWOpIGSDMriKaAyxheuqaNvxTyat75XWvmK7OkkiVZZjx9PooqXFYOqSxDZxRwawQYlxXC9GNhXhtD4L8/n5RvB5Lc7coWas0jJKfrh+HTcR1+dybb14HRBh/BU6P/NIn0quN5Gkukqiym/pR7MbfjfrBNibt1rcu9/sP/BzG0sNUHIxLVaXczDEcqG7gtzIEHTma40+OIjchlsWKREDPHUryQ7pHcW8oRTJW5AQ0EXw7h+QEIAL2/tnXRPYX2TEWac9G8bhaWhIoKxh62bQlStp+lG6jGsEGAjonhI+vTRb5I4e7zbA89dHbt/CSyrngm8e+RbInZ7omVPT/QD+DcF+iV7O7DsUnANKamGSLkKbrSwQ+u1ywVTVwF+kubNgluvG50tX3OdtSlQTbwZCPjvB6B5ORNq1lwFFuiF6XyG+sUHRBq9YBUmfGsOS0WSP39Cb/ExGmLw4RnDWQJax7Z8oaKL6QKG3QoEUgP8BdRzgYLHgqHF4mB5GaEqSK+IhZ3NPdWJbTmbBSRJM3xyCunWg4xCqTAyJw/PrTDGZNWPVFt/LQyYhfI4GmH3RXO7gaq3ntvrK0AEQEAAYkBPAQYAQgAJhYhBI+jY9CtbzEGcET/TWqoX8RGd0DyBQJfDuH5AhsMBQkDwkqXAAoJEGqoX8RGd0DyVVoH/0KmyKparR6UrtbDLv4eNOI58DypfY4jJ5mR5PWFH4ewPalu8Sw0Pa6ngI554OQ+0G0dYUXVViUCRnpNTBs32NyOnRWH3vgLoYfhdG7qebO53IYgFwvCDRYWjrDVMgrlmFJIAcdHk1dsZ2mLSFiM3wVmZeQhMExcDABlub8WItBvLo5QD/JJQ55ZlE/Z2DO7m7oOhsUAolp1W7Yq72ITifuDrFrmgyq4B+jBqL55nnDDmXrGNrksj5tsgGUyq5tYKbRLYgqQ9lmNyNXEnibaE27Tr1XnZLzcOMesjEpWBPL3l0Jwxru7pYqA3xWd/8wXZSf9HmJmyoUDXIDythGcFZM==vBFM-END pgp公钥块