¿Cuáles son las precauciones de seguridad tomadas para garantizar que un dominio virtualizado no pueda comprometer su host?

4

Recientemente empecé a aprender sobre xen y me interesé más en la visualización. Leí algunos informes, hice una búsqueda aquí, pero no pude encontrar una respuesta. Supongo que alguien me vinculará con algunos documentos útiles.

Diga que estoy usando un domU en xen (o una máquina virtual en cualquier plataforma).

¿Cómo evita la computadora que la máquina virtualizada ejecute instrucciones arbitrarias?

Dado que el dom0 o la máquina host deben ejecutar las instrucciones que necesita el domU ... ¿no debería ser fácil?

¿Cómo puedes validar que algo está aislado? y (una vez más con palabras diferentes) ¿cuáles son los pasos que se han tomado para lograr estos límites?

    
pregunta Rell3oT 22.08.2012 - 01:59
fuente

3 respuestas

6

La implementación de la máquina virtual es un kernel para el kernel.

En un sistema operativo típico, hay código de aplicación (también conocido como "userland") y código de kernel . Utilizan el mismo conjunto de instrucciones; sin embargo, la CPU sabe, en cualquier momento, si está ejecutando la aplicación o el código del kernel. Cuando el código de la aplicación intenta ejecutar algunos códigos de operación que acceden al hardware (los códigos de operación in y out para x86), la CPU atrapa : salta temporalmente al código del kernel (la dirección de ese código es registrado en una tabla específica). El código del kernel decide qué hacer con el acceso (otorgarlo, modificarlo, detener el proceso de la aplicación ...). Si el código del kernel decide otorgar el acceso, o el kernel lo bloquea pero pretende haberlo realizado, entonces el código de la aplicación puede creer que podría acceder al hardware directamente.

Del mismo modo, cuando el código de la aplicación lee o escribe datos en la memoria, utiliza una abstracción de la memoria: un espacio de direcciones virtual que se asigna a la memoria física (o no ...) a través de la MMU . La MMU usa tablas que el kernel llena (y, por supuesto, el kernel se cuida de no hacer que estas tablas formen parte del espacio de direcciones visible desde el código de la aplicación). De esta manera, la aplicación está en un mundo mágico donde está sola en un gran espacio de direcciones, mientras que en realidad hay varias aplicaciones que se ejecutan simultáneamente, que no se pueden ver.

Una máquina virtual usa la misma estructura, un nivel más arriba. Cuando el kernel accede al hardware o a la MMU, en realidad está bajo el control de la implementación de la máquina virtual (el hipervisor ) que atrapa accesos no deseados.

Los detalles varían bastante. La distinción principal es si el kernel es consciente de que se ejecuta en una máquina virtual o no. Con Xen , el núcleo está al tanto; sabe que está bajo el control de una deidad superior (el hipervisor) y no intenta acceder directamente al hardware; en cambio, pregunta muy bien a través de una interfaz dedicada. Con VirtualBox , el núcleo no está al tanto; el sistema operativo invitado cree que se ejecuta en verdadero hardware, y la máquina virtual trabaja arduamente para mantener la ilusión.

Se pueden hacer otras diferencias en los medios por los cuales se aplica la virtualización (es decir, cómo el hipervisor puede atrapar el código del kernel). Los procesadores x86 recientes ofrecen algún soporte específico con opcodes dedicado . Los procesadores x86 más antiguos, en modo de 32 bits, pueden usar los diversos remanentes de los mecanismos de protección más antiguos (registros de segmentos y los cuatro "anillos", en su mayoría) (estos se han eliminado del modo de 64 bits, por lo que la máquina virtual de 64 bits debe utilizar AMD-V / VT-x). Otras técnicas incluyen emular cada código de operación virtualizado (para la totalidad de la máquina emulada, o partes de ella), posiblemente con una traducción más o menos dinámica (también conocida como compilación JIT), aas QEMU lo hace en situaciones de CPU cruzada.

Hay toda una parafernalia de términos sobre el tema (virtualización, paravirtualización, emulación, simulación, hipervisor ...) que no es completamente consensual y, a menudo, bastante bizantina. Algunos lectores que se aferran a algunas doctrinas específicas de la terminología probablemente se hayan sentido algo irritados por la forma sencilla en que uso los términos.

    
respondido por el Thomas Pornin 22.08.2012 - 14:46
fuente
3

Conceptualmente, una máquina virtual es un emulador. ¿Alguna vez has visto los emuladores de Nintendo, donde metes un viejo juego de Nintendo y emula la consola de Nintendo? Funciona así: el emulador lee repetidamente una instrucción del juego, luego emula el efecto de ejecutar esa instrucción (simulando el hardware de Nintendo, pero utilizando un software que se ejecuta en su computadora), etc.

Una máquina virtual es así, excepto que en lugar de emular el hardware de Nintendo, emula el hardware Intel x86. Una máquina virtual lee una instrucción del invitado, emula su efecto (dentro de la caja de arena) y luego pasa a la siguiente instrucción. Dado que la emulación se realiza mediante software, se puede escribir el software para verificar que los efectos de la instrucción permanezcan dentro del recinto de seguridad.

Conceptualmente, así es como funciona una máquina virtual. En la práctica, las máquinas virtuales no funcionan nada de eso; La emulación es muy lenta, por lo que las máquinas virtuales utilizan varios métodos para hacer que el proceso se ejecute realmente rápido. Muchos procesadores modernos incluyen soporte de hardware para la virtualización para hacer que una máquina virtual funcione tan rápido como sea posible. Pero puedes considerarlo como un emulador de CPU grande, mágico y veloz, y eso te dará la intuición correcta.

Entonces, conceptualmente, así es como una máquina virtual puede garantizar que el huésped no pueda escapar de la caja de arena. La máquina virtual puede verificar el efecto de cada instrucción para asegurarse de que no se escapará y ejecutar la instrucción solo si todo está bien.

Para más información sobre este tema, recomiendo leer las siguientes preguntas en este sitio:

respondido por el D.W. 22.08.2012 - 03:12
fuente
2

Eso dependería del tipo de virtualización, con la virtualización de hardware (Xen, ESX, Hyper-V), como D.W. dice, no hay problema.

Sin embargo, con la virtualización del kernel (LXC, openVZ) todavía existe el riesgo de salir de la cárcel. Con openVZ no se han producido ataques recientes para salir de la máquina host, pero sí con LXC.

Desde un punto de vista de seguridad, recomiendo usar la virtualización de hardware en lugar de la virtualización del kernel.

respondido por el Lucas Kauffman 22.08.2012 - 08:12
fuente

Lea otras preguntas en las etiquetas