virtualizacion virtuales ventajas una maquinas maquina instalar instala gratis funciona desventajas como virtualization

virtualization - virtuales - ¿Cómo identificar que se está ejecutando bajo una máquina virtual?



ventajas y desventajas de una maquina virtual (11)

¿Hay alguna manera de identificar, dentro de una VM, que su código se ejecuta dentro de una VM?

Supongo que hay formas más o menos fáciles de identificar sistemas VM específicos, especialmente si la VM tiene instaladas las extensiones del proveedor (como por ejemplo para VirtualBox o VMWare). ¿Pero hay una forma general de identificar que no se está ejecutando directamente en la CPU?


Red Hat tiene un programa que detecta el producto de virtualización (si corresponde) bajo el cual se ejecuta: virt-what .

Al utilizar una herramienta mantenida por terceros, esta es una mejor estrategia a largo plazo que tratar de desarrollar su propia lógica de detección: más ojos (pruebas contra más productos de virtualización), etc.


Es posible que pueda identificar si está en una máquina virtual mirando la dirección MAC de su conexión de red. Xen, por ejemplo, recomienda típicamente el uso de un rango específico de direcciones 00: 16: 3e: xx: xx: xx.

Esto no está garantizado, ya que depende del administrador del sistema especificar la dirección MAC que les gusta.


Si VM hace bien el trabajo, debe ser invisible para el cliente que se está virtualizando. Sin embargo, uno puede mirar otras pistas.

Me imagino que buscar controladores conocidos o software específico para el entorno VM sería la mejor manera posible.

Por ejemplo, en un cliente VMWare que ejecuta Windows, vmxnet.sys sería el controlador de red, que se muestra como VMware acelerado Adaptador PCNet de AMD.


Un buen ejemplo es que aparentemente hace una consulta WMI para el fabricante de la placa base y, si devuelve "Microsoft", está en una máquina virtual. Pensé que creo que esto es solo para VMWare. Es probable que haya diferentes formas de decir para cada software de host de VM.

Este artículo aquí http://blogs.technet.com/jhoward/archive/2005/07/26/407958.aspx tiene algunas buenas sugerencias y enlaces a un par de maneras de detectar si se encuentra en una VM (VMWare y VirtualPC en menos).


Un enfoque más empírico es verificar si hay controladores de dispositivo VM conocidos. Podría escribir consultas de WMI para localizar, por ejemplo, el adaptador de pantalla de VMware, la unidad de disco, el adaptador de red, etc. Esto sería adecuado si supiera que solo tiene que preocuparse por los tipos de host de VM conocidos en su entorno. Aquí hay un ejemplo de cómo hacer esto en Perl , que podría ser transferido al idioma que elijas.



Depende de lo que está buscando:

  • Si la máquina virtual no se está ocultando a propósito, puede usar un gancho conocido. Desea buscar controladores de VmWare o la presencia de ciertas cadenas en la memoria o en otros signos reveladores.

  • Si la VM realmente desea que hagas cosas especiales, tendrá un gancho obvio, como modificar la ID del procesador o agregar algunos registros especiales a los que puedas acceder para detectarlo. O un dispositivo especial en una ubicación conocida de la memoria (suponiendo que pueda acceder sin procesar al espacio de la memoria física de su mundo). NOTA: los diseños modernos de máquinas como IBM Power6 y Sun UltraSparc T1 / T2 están diseñados para ejecutar SIEMPRE un hipervisor y nunca directamente en hardware sin procesar. La interfaz para el "hardware" que utiliza un sistema operativo es, de hecho, la interfaz de una capa de software hipervisor, sin forma de evitarlo. En este caso, la detección es trivial ya que es un "sí" constante. Esta es la dirección futura probable para todos los sistemas informáticos que pueden permitirse los gastos generales, consulte el soporte en los diseños recientes como el chip Freescale QorIQ P4080, por ejemplo (www.freescale.com/qoriq).

  • Si la VM intencionalmente intenta esconderse, y persigue su presencia, es un juego de gato y ratón donde la alteración del tiempo y el perfil de rendimiento diferente de una máquina virtual casi siempre va a delatarlo. Obviamente, esto depende de cómo se implemente la VM y la cantidad de soporte de hardware que exista en la arquitectura (creo que un mainframe zSeries es mucho mejor para ocultar la presencia de una VM o una pila de máquinas virtuales en su sistema operativo particular que un x86 normal la máquina es, por ejemplo). Ver http://jakob.engbloms.se/archives/97 para alguna discusión sobre este tema. Es posible tratar de esconderse como máquina virtual, pero la detección es bastante probable que siempre gane si se esfuerza lo suficiente.



En la mayoría de los casos, no debes intentarlo. No debería importar si alguien está ejecutando su código en una VM, excepto en algunos casos específicos.

Si es necesario, en Linux la forma más común es mirar /sys/devices/virtual/dmi/id/product_name , que mostrará el nombre de la computadora portátil / mainboard en la mayoría de los sistemas reales, y el hipervisor en la mayoría de los sistemas virtuales . dmidecode | grep Product dmidecode | grep Product es otro método común, pero creo que requiere acceso de root.



Gran parte de la investigación sobre esto está dedicada a detectar los llamados ataques de "píldora azul", es decir, un hipervisor malicioso que está intentando activamente evadir la detección.

El truco clásico para detectar una VM es llenar el ITLB, ejecutar una instrucción que debe ser virtualizada (lo que necesariamente borra dicho estado del procesador cuando da control al hipervisor), luego ejecutar más código para detectar si el ITLB todavía está poblado . El primer documento se encuentra aquí , y una explicación bastante colorida del blog de un investigador y el enlace alternativo Wayback Machine al artículo del blog (imágenes rotas) .

La conclusión de las discusiones sobre esto es que siempre hay una manera de detectar un hipervisor malicioso, y es mucho más simple detectar uno que no está tratando de esconderse.