
Hipervisor mínimo Intel VT-x para Windows y UEFI que virtualiza un host en vivo para introspección, con soporte para hyperjacking dinámico, unhyperjacking, EPT y VPID.
SimpleVisor es un hipervisor simple y portátil, específico para Intel x64/EM64T VT-x, con dos objetivos concretos: usar la menor cantidad de código ensamblador posible (10 líneas) y tener la menor cantidad de código relacionado con VMX para soportar hyperjacking y unhyperjacking dinámico (es decir, virtualizar el estado del host desde dentro del host) mientras también soporta características avanzadas como EPT y VPID. Actualmente se ejecuta tanto en Windows como en entornos UEFI.
¿Siempre has tenido curiosidad por saber cómo construir un hipervisor? ¿La documentación de Intel (los cientos de páginas) te ha desanimado? ¿Los ejemplos que has encontrado en línea solo han complicado más las cosas, o han requerido semanas de lectura de docenas de miles de líneas de código? Si es así, SimpleVisor podría ser el proyecto para ti.
Sin contar los exhaustivos comentarios que explican cada línea de código, y las idiosincrasias específicas relacionadas con Windows o Intel, SimpleVisor consta de aproximadamente 500 líneas de código C y 10 líneas de código ensamblador x64, todo ello con la capacidad de ejecutarse en todas las versiones recientes de Windows de 64 bits, y soportando carga/descarga dinámica en tiempo de ejecución.
Además, SimpleVisor utiliza una biblioteca de sistema operativo ligera para funcionalidades específicas de Windows, separando las partes del hipervisor de las partes específicas de Windows. Aprovechando este diseño portátil, ahora también está disponible una versión UEFI de SimpleVisor. Ten en cuenta, sin embargo, que no tiene soporte robusto para entornos MP debido a problemas con UEFI, y que cargar un sistema operativo eventualmente resultará en un fallo, ya que el SO alcanzará rutas de código no implementadas debido a su reconfiguración de los recursos del procesador. Virtualizar todo el arranque del sistema operativo desde UEFI está fuera del alcance del proyecto.
SimpleVisor se puede compilar con Visual Studio 2015 Update 3, y aunque los compiladores más antiguos/nuevos no han sido probados y no son compatibles, es probable que también puedan compilar el proyecto. Sin embargo, es importante mantener las diversas configuraciones del compilador y del enlazador tal como las ves.
SimpleVisor ha sido probado actualmente con éxito en las siguientes plataformas:
En este momento, no ha sido probado en Bochs, pero no hay razón por la que SimpleVisor no pudiera ejecutarse en dicho entorno también. Sin embargo, si tu máquina ya está ejecutándose bajo un hipervisor como Hyper-V o Xen, SimpleVisor no se cargará.
Ten en cuenta que las versiones x86 de Windows no están expresamente soportadas, ni los procesadores anteriores a la microarquitectura Nehalem, ni Windows 7. El soporte para los dos últimos es fácil de añadir y existe en ciertos forks.
Demasiados proyectos de hipervisores ahí fuera son o extremadamente complicados ([Xen][1], KVM, VirtualBox) y/o de código cerrado (VMware, Hyper-V), además de estar fuertemente enfocados hacia el desarrollo o sistemas basados en Linux. Adicionalmente, la mayoría (excepto Hyper-V) están expresamente construidos con el propósito de permitir la ejecución de máquinas virtuales, y no la virtualización de un sistema en vivo y en ejecución, para realizar introspección u otras tareas relacionadas con la seguridad sobre él.
Sin embargo, algunos proyectos destacan del resto, como el original [Blue Pill][2] de Joanna, o proyectos como [VirtDbg][3] y [HyperDbg][4]. Desafortunadamente, la mayoría de estos ya son bastante antiguos, y algunos solo funcionan en procesadores x86, y no soportan sistemas operativos más nuevos como Windows 10. Otro ejemplo bastante simple, similar a Blue Pill en algunos aspectos, pero que en realidad ofrece un buen ejemplo del uso de EPT para "Split-TLB" es [MoRE][7] de Jacob Torrey/AIS.
El proyecto más cercano que realmente ofrece un hipervisor centrado en Windows, moderno y soportado es [HyperPlatform][5], y recomendamos encarecidamente su uso como punto de partida para un desarrollo de hipervisores de tipo investigación más ampliamente utilizable. Sin embargo, al intentar crear una "plataforma" genérica que sea más ampliamente robusta, HyperPlatform también adolece de cierta hinchazón, lo que dificulta entender cuáles son realmente las necesidades básicas de un hipervisor, y cómo inicializar uno. En una vena similar, y mostrando un amor igual por STL/C++, pero también incluyendo un cargador ELF y soporte UEFI/Linux junto con pruebas unitarias y aún más robustez está [Bareflank][8], también de AIS. Más allá de eso, probablemente estés entrando en la complejidad de nivel de Xen.
El objetivo expreso de este proyecto, como se indicó anteriormente, era minimizar el código de cualquier manera posible, sin causar efectos secundarios negativos, y centrándose en las necesidades de 'bare-metal'. Esto incluye:
Otro objetivo implícito era soportar lo más reciente en características de hardware, ya que incluso [Bochs][6] no siempre tiene las instrucciones y/o definiciones VMX de Intel más recientes. Estas se encuentran a menudo en archivos de cabecera como "vmcs.h" y "vmx.h" que varios proyectos tienen en varios niveles de definición. Por ejemplo, Xen master tiene algunas razones de VM Exit no publicadas, pero no ciertas publicadas, que Bochs sí tiene, ¡aunque no tiene las no publicadas! Un ejemplo de ello es el uso de entradas EPT de 1GB, que por ejemplo VMWare no virtualiza correctamente.