Seguridad

Para evitar la ejecución de cargas útiles arbitrarias dentro de un pVM, Android Virtualization Framework (AVF) utiliza un enfoque de seguridad en capas donde cada capa agrega medidas adicionales. A continuación se muestra una lista de capas de seguridad AVF:

  • Android: Android garantiza que solo las aplicaciones con permisos pVM puedan crear o inspeccionar pVM.

  • Cargador de arranque: el cargador de arranque garantiza que solo las imágenes pVM firmadas por Google o los proveedores de dispositivos puedan arrancar y respeta el procedimiento de arranque verificado de Android . Esta arquitectura implica que las aplicaciones que ejecutan pVM no pueden agrupar sus propios núcleos.

  • pVM: el pVM proporciona una defensa en profundidad, como con SELinux , para las cargas útiles que se ejecutan en el pVM. La defensa en profundidad no permite mapear datos como ejecutables ( neverallow execmem ) y garantiza que W^X se mantenga para todos los tipos de archivos.

Modelo de seguridad

Confidencialidad, integridad y disponibilidad, también conocida como la tríada de la CIA, es un modelo diseñado para guiar las políticas de seguridad de la información:

  • La confidencialidad es un conjunto de reglas que limitan el acceso a la información.
  • La integridad es la garantía de que la información es confiable y precisa.
  • La disponibilidad es garantía de acceso confiable a la información por parte de entidades autorizadas.

Tenga en cuenta que pKVM fue diseñado para mantener la confidencialidad y la integridad, pero no la disponibilidad, de los invitados. Estos principios influyen en las decisiones de diseño que abarcan todos los aspectos de la arquitectura, desde el hipervisor hasta los componentes del espacio del usuario.

Confidencialidad e integridad

La confidencialidad surge de las propiedades de aislamiento de memoria impuestas por el hipervisor pKVM. pKVM rastrea la propiedad de la memoria de páginas de memoria física individuales y cualquier solicitud de los propietarios para compartir páginas. pKVM garantiza que solo los pVM autorizados (host e invitados) tengan la página determinada asignada en sus tablas de páginas de etapa 2 que están controladas por el hipervisor. Esta arquitectura mantiene que el contenido de la memoria propiedad de un pVM permanece privado a menos que el propietario lo comparta explícitamente con otro pVM.

Las restricciones para mantener la confidencialidad también se extienden a cualquier entidad en el sistema que realice accesos a la memoria en nombre de pVM, es decir, dispositivos y servicios con capacidad DMA que se ejecutan en capas más privilegiadas . Los proveedores de SoC deben satisfacer un nuevo conjunto de requisitos antes de poder admitir pKVM; de lo contrario, no se puede proporcionar confidencialidad.

La integridad se aplica tanto a los datos en la memoria como a los de cálculo:

  • Los pVM no pueden modificar la memoria de los demás sin consentimiento.
  • Los pVM no pueden influir entre sí en el estado de la CPU.

Estos requisitos los aplica el hipervisor. Pero los problemas relacionados con la integridad de los datos también surgen con el almacenamiento de datos virtual, donde se deben aplicar otras soluciones, como dm-verity o AuthFS.

Estos principios no son diferentes del aislamiento de procesos que ofrece Linux, donde el acceso a las páginas de memoria se controla con tablas de páginas de la etapa 1 y el contexto del kernel cambia entre procesos. Sin embargo, la porción EL2 de pKVM, que aplica estas propiedades, tiene aproximadamente la mitad de la superficie de ataque en comparación con todo el kernel de Linux (aproximadamente 10 mil frente a 20 millones de líneas de código) y, por lo tanto, ofrece una mayor seguridad para usar casos que son demasiado sensibles para confiar. sobre el aislamiento de procesos.

Dado su tamaño, un pKVM se presta a una verificación formal. Apoyamos activamente la investigación académica, cuyo objetivo es probar formalmente estas propiedades en el binario pKVM real.

El resto de este documento cubre las garantías de confidencialidad e integridad que proporciona cada componente de un pKVM.

Hipervisor

pKVM es un hipervisor basado en KVM que aísla pVM y Android en entornos de ejecución que no son de confianza mutua. Estas propiedades se mantienen en caso de un compromiso dentro de cualquier pVM, incluido el host. Los hipervisores alternativos que cumplan con AVF deben proporcionar propiedades similares.

  • Un pVM no puede acceder a una página que pertenece a otra entidad, como un pVM o un hipervisor, a menos que el propietario de la página la comparta explícitamente. Esta regla incluye el pVM del host y se aplica tanto a los accesos a CPU como a DMA.
  • Antes de que una página utilizada por un pVM se devuelva al host, como cuando se destruye el pVM, se borra.
  • La memoria de todos los pVM y el firmware de pVM del inicio de un dispositivo se borra antes de que se ejecute el cargador de arranque del sistema operativo en el inicio posterior del dispositivo.
  • Cuando se conecta un depurador de hardware, como SJTAG, un pVM no puede acceder a sus claves previamente creadas.
  • El firmware pVM no arranca si no puede verificar la imagen inicial.
  • El firmware pVM no arranca si la integridad del instance.img está comprometida.
  • La cadena de certificados de arranque (BCC) y los identificadores de dispositivos compuestos (CDI) proporcionados a una instancia de pVM solo pueden derivarse de esa instancia en particular.

SO invitado

Microdroid es un ejemplo de un sistema operativo que se ejecuta dentro de un pVM. Microdroid consta de un gestor de arranque basado en U, GKI, un subconjunto del espacio de usuario de Android y un iniciador de carga útil. Estas propiedades se mantienen en caso de un compromiso dentro de cualquier pVM, incluido el host. Los sistemas operativos alternativos que se ejecutan en un pVM deberían proporcionar propiedades similares.

  • Microdroid no arrancará si boot.img , super.img , vbmeta.img o vbmeta\_system.img no se pueden verificar.
  • Microdroid no arrancará si falla la verificación del APK.
  • La misma instancia de Microdroid no arrancará incluso si se actualizó el APK.
  • Microdroid no arrancará si alguno de los APEX no pasa la verificación.
  • Microdroid no arrancará (o arrancará con un estado inicial limpio) si el instance.img se modifica fuera del pVM invitado.
  • Microdroid proporciona certificación de la cadena de arranque.
  • Cualquier modificación (sin firmar) de las imágenes de disco compartidas con el pVM invitado provoca un error de E/S en el lado del pVM.
  • Los BCC y CDI proporcionados a una instancia de pVM solo pueden derivarse de esa instancia en particular.
  • Las escrituras en un volumen de almacenamiento cifrado son confidenciales; sin embargo, no existe protección de reversión en la granularidad de un bloque de cifrado. Además, otras manipulaciones externas arbitrarias de un bloque de datos hacen que ese bloque aparezca como basura para Microdroid, en lugar de ser detectado explícitamente como un error de E/S.

Androide

Estas son propiedades mantenidas por Android como host, pero no son válidas en caso de que el host se vea comprometido:

  • Un pVM invitado no puede interactuar directamente con otros pVM invitados (por ejemplo, establecer una conexión vsock).
  • Solo el VirtualizationService en el pVM host puede crear un canal de comunicación con un pVM (Nota: puede pasar el canal establecido a otros).
  • Solo las aplicaciones que están firmadas con la clave de plataforma pueden solicitar permiso para crear, poseer o interactuar con pVM.
  • El identificador, llamado identificador de contexto (CID) , utilizado para configurar conexiones vsock entre el host y pVM no se reutiliza mientras el pVM del host se está ejecutando. Por ejemplo, no es posible reemplazar un pVM en ejecución por otro.

Disponibilidad

En el contexto de las pVM, la disponibilidad se refiere a que el anfitrión asigna suficientes recursos a los invitados para que puedan realizar las tareas para las que fueron diseñados.

Las responsabilidades del host incluyen la programación de las CPU virtuales del pVM. KVM, a diferencia de los hipervisores tradicionales de tipo 1, como Xen, toma la decisión de diseño explícita de delegar la programación de la carga de trabajo al kernel del host. Dado el tamaño y la complejidad de los programadores actuales, esta decisión de diseño reduce significativamente el tamaño de la base informática confiable (TCB) y permite al host tomar decisiones de programación más informadas para optimizar el rendimiento. Sin embargo, un anfitrión malintencionado puede optar por no programar nunca un invitado.

De manera similar, pKVM también delega el manejo de interrupciones físicas al kernel del host para reducir la complejidad del hipervisor y dejar al host a cargo de la programación. Se hacen esfuerzos para garantizar que el reenvío de interrupciones de invitados solo resulte en una denegación de servicio (muy pocas, demasiadas o interrupciones mal enrutadas).

Finalmente, el proceso de monitorización de máquina virtual (VMM) del host es responsable de asignar memoria y proporcionar dispositivos virtuales, como una tarjeta de red. Un VMM malicioso puede retener recursos del invitado.

Aunque pKVM no proporciona disponibilidad a los invitados, el diseño protege la disponibilidad del host de invitados maliciosos porque el host siempre puede adelantarse o cancelar un invitado y reclamar sus recursos.

Arranque seguro

Los datos están vinculados a instancias de un pVM y el arranque seguro garantiza que se pueda controlar el acceso a los datos de una instancia. El primer arranque de una instancia la aprovisiona generando aleatoriamente un salt secreto para el pVM y extrayendo detalles, como claves públicas de verificación y hashes, de las imágenes cargadas. Esta información se utiliza para verificar los arranques posteriores de la instancia de pVM y garantizar que los secretos de la instancia se revelen solo a las imágenes que pasen la verificación. Este proceso ocurre para cada etapa de carga dentro del pVM: firmware de pVM, pVM ABL, Microdroid, etc.

DICE proporciona a cada etapa de carga un par de claves de certificación, cuya parte pública está certificada en la entrada BCC para esa etapa. Este par de claves puede cambiar entre arranques, por lo que también se deriva un secreto de sellado que es estable para la instancia de VM durante los reinicios y, como tal, es adecuado para proteger el estado persistente. El secreto de sellado es muy valioso para el VM, por lo que no debe utilizarse directamente. En cambio, las claves de sellado deben derivarse del secreto de sellado y el secreto de sellado debe destruirse lo antes posible.

Cada etapa entrega un objeto CBOR codificado de manera determinista a la siguiente etapa. Este objeto contiene secretos y BCC, que contiene información de estado acumulada, como si la última etapa se cargó de forma segura.

Dispositivos desbloqueados

Cuando se desbloquea un dispositivo con fastboot oem unlock , los datos del usuario se borran. Este proceso protege los datos del usuario del acceso no autorizado. Los datos que son privados para un pVM también se invalidan cuando se produce el desbloqueo de un dispositivo.

Una vez desbloqueado, el propietario del dispositivo puede actualizar las particiones que normalmente están protegidas mediante arranque verificado, incluidas las particiones que contienen la implementación pKVM. Por lo tanto, no se confiará en que pKVM en un dispositivo desbloqueado mantenga el modelo de seguridad.

Las partes remotas pueden observar este estado potencialmente inseguro inspeccionando el estado de inicio verificado del dispositivo en un certificado de atestación de clave.