2008-09-02 29 views
23

¿Existe alguna manera de identificar, dentro de una VM, que su código se está ejecutando dentro de una VM?¿Cómo identificar que se está ejecutando en una máquina virtual?

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

+0

¿Está buscando una respuesta teórica (es decir.un documento o algoritmo, implementación requerida, que proporciona un mecanismo destinado a proteger contra una clase de ataque improbable) o práctico (es decir, código de trabajo destinado a manejar casos comunes no maliciosos). –

+5

* Lo que haces es que tienes algo pequeño que llevas puesto en todo momento y que no permites que nadie más lo toque. Y si se siente bien y se comporta bien, entonces no se está ejecutando en una VM. * (No pude resistir. Lo siento) – Zarkonnen

Respuesta

20

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

El truco clásico para detectar una máquina virtual es poblar la ITLB, ejecute una instrucción que debe virtualizar (que borra necesariamente a cabo tal estado del procesador cuando se da el control al hipervisor), a continuación, ejecutar algo más de código para detectar si el ITLB todavía está poblado El primer documento está ubicado en here, y una explicación bastante colorida de researcher's blog y la alternativa Wayback Machine link to the blog article (images broken).

En pocas palabras 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 ocultar.

+0

No estoy seguro de que el enfoque dado funcione con los hosts que usan NPT/EPT. –

0

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 lo necesita, en Linux la forma más común es mirar /sys/devices/virtual/dmi/id/product_name, que enumerará 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 es otro método común, pero creo que requiere acceso raíz.

-1

Si VM hace bien el trabajo, debería ser invisible para el cliente que está siendo virtualizado. 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 ejecute Windows, vmxnet.sys sería el controlador de red, que se muestra como VMware acelerado AMD PCNet Adapter.

0

Un buen ejemplo es que al parecer se está realizando una consulta WMI para el fabricante de la placa base, y si devuelve "Microsoft", se encuentra 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 está en una máquina virtual (VMWare y VirtualPC al menos).

6

Un enfoque más empírico es comprobar 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í está el an example of doing this in Perl, que podría ser trasladado al idioma de su elección.

+0

mi computadora -> propiedades -> hardware -> administrador de dispositivos eche un vistazo al adaptador de pantalla - generalmente verá Microsoft VM algo o VMWare algo ... – thedrs

0

Es posible que pueda identificar si se encuentra 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.

+0

Además, cualquier empresa de VM puede registrarse para un nuevo rango de números de direcciones MAC en cualquier momento. VMWare actualmente tiene 4 rangos de MAC diferentes (según una búsqueda en ieee.org para los números asignados). –

2

Una vez me encontré con un fragmento de código de ensamblado que le indicaba si estaba en una máquina virtual ... Busqué en Google pero no pude encontrar el artículo original.

Lo encontré sin embargo: Detect if your program is running inside a Virtual Machine.

Espero que ayude.

+1

Estás pensando en el enfoque "píldora roja" o "sin píldora". Esta técnica ya no funciona. (Y podría argumentarse que tampoco funcionó en 2004, aunque los sistemas multi-CPU y multi-core fueron menos frecuentes). Véase http://charette.no-ip.com:81/programming/2009-12- 30_Virtualization/index.html # RedPill –

8

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

Usando una herramienta de terceros mantenidos tal esta es una mejor estrategia a largo plazo que tratar de rodar su propia lógica de detección: más ojos (pruebas contra más productos de virtualización), etc.

3

Depende lo que está buscando:

  • Si la máquina virtual no se esconde de usted a propósito, se puede usar un poco de gancho conocido. Desea buscar controladores de VmWare o la presencia de ciertas cadenas en la memoria u otras señales reveladoras.

  • Si la VM realmente desea que haga cosas especiales para ella, tendrá un gancho obvio en su lugar, como la modificación de la ID del procesador o la adición de algunos registros especiales a los que puede acceder para detectarlo. O es un dispositivo especial en una ubicación conocida de la memoria (suponiendo que pueda obtener acceso sin formato 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 de 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 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 del gato y el ratón donde la alteración del tiempo y el perfil de rendimiento diferente de una VM casi siempre van a delatarlo . Obviamente, esto depende de cómo se implemente la VM y de 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 VM en un SO particular que un x86 normal). la máquina es, por ejemplo). Ver http://jakob.engbloms.se/archives/97 para una 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.

0

TrapKIT provides ScoopyNG, a tool for VMware identification - Trata de evitar las técnicas de evasión, pero no necesariamente se dirigen a cualquier otro software de virtualización que VMware. Tanto la fuente como los binarios están disponibles.

+0

Eso fue ... una respuesta bastante escasa, como se escribió originalmente. –

Cuestiones relacionadas