Explotar cargadores de arranque firmados para eludir el arranque seguro UEFI

Versión rusa de este artículo.
El firmware de las placas base de PC modernas sigue la especificación UEFI desde 2010. En 2013, apareció una nueva tecnología llamada Secure Boot, destinada a evitar que los bootkits se instalen y ejecuten. El arranque seguro evita la ejecución de código de programa no firmado o no confiable (programas .efi y cargadores de arranque del sistema operativo, firmware de hardware adicional como tarjeta de video y OPROM de adaptador de red).
El Arranque seguro se puede deshabilitar en cualquier placa madre minorista, pero un requisito obligatorio para cambiar su estado es la presencia física del usuario en la computadora. Es necesario ingresar la configuración de UEFI cuando se inicia la computadora, y solo entonces es posible cambiar la configuración de arranque seguro.

La mayoría de las placas base incluyen solo claves de Microsoft como confiables, lo que obliga a los proveedores de software de arranque a pedirle a Microsoft que firme sus cargadores de arranque. Este proceso incluye el procedimiento de auditoría de código y la justificación de la necesidad de firmar su archivo con clave de confianza global si desean que el disco o la memoria flash USB funcionen en modo de arranque seguro sin agregar su clave en cada computadora manualmente.
Las distribuciones de Linux, los hipervisores, los discos de arranque antivirus, los autores de software de recuperación de computadoras deben firmar sus cargadores de arranque en Microsoft.

Quería hacer una unidad flash USB de arranque con varios programas de recuperación de computadora que arrancaran sin deshabilitar el Arranque seguro. Veamos cómo se puede lograr esto.

Cargadores de arranque firmados de cargadores de arranque

Entonces, para arrancar Linux con Secure Boot habilitado, necesita un gestor de arranque firmado. Microsoft prohíbe firmar software con licencia bajo GPLv3 debido a la regla de licencia de restricción de tivoización , por lo tanto, GRUB no se puede firmar .
Para abordar este problema, la Fundación Linux lanzó PreLoader y Matthew Garrett hizo shim, pequeños cargadores de arranque que verifican la firma o el hash de un solo archivo y lo ejecutan. PreLoader y shim no utilizan el almacén de certificados UEFI db , pero contienen una base de datos de hashes permitidos (PreLoader) o certificados (shim) dentro del archivo ejecutable.
Ambos programas, además de ejecutar automáticamente archivos confiables, le permiten ejecutar cualquier programa previamente no confiable en el modo de arranque seguro, pero requieren la presencia física del usuario. Cuando se ejecuta por primera vez, debe seleccionar un certificado que se agregará o el archivo que se codificará en la interfaz gráfica, después de lo cual los datos se agregarán a una variable NVRAM especial en la placa base que no es accesible desde el sistema operativo cargado . Los archivos se vuelven confiables solo para estos precargadores, no para el Arranque seguro en general, y aún no se pueden cargar sin PreLoader o shim.

El software no confiable se inicia primero con una cuña.
El software no confiable se inicia primero con una cuña.

Todas las distribuciones populares y modernas de Linux usan shim debido a la compatibilidad con certificados, lo que hace que sea fácil proporcionar actualizaciones para el gestor de arranque principal sin la necesidad de interacción del usuario. En general, shim se usa para ejecutar GRUB2, el gestor de arranque más popular en Linux.

GRUB2

Para evitar el abuso del cargador de arranque firmado con intenciones maliciosas, Red Hat creó parches para GRUB2 que bloquean las funciones "peligrosas" cuando Secure Boot está habilitado: insmod / rmmod, appleloader, linux (reemplazado por linuxefi), multiboot, xnu, memrw, iorw. El módulo del cargador de cadenas, que carga archivos .efi arbitrarios, introdujo su propio cargador interno .efi (PE) personalizado sin usar las funciones UEFI LoadImage / StartImage, así como el código de validación de los archivos cargados a través de shim, para preservar el capacidad de cargar archivos confiables por shim pero no confiables en términos de UEFI. No está exactamente claro por qué este método es preferible: UEFI permite redefinir (enganchar) las funciones de verificación de UEFI, así es como funciona PreLoader y, de hecho, la característica Shim está presente pero está deshabilitada de forma predeterminada.

De todos modos, usar el GRUB firmado de alguna distribución de Linux no satisface nuestras necesidades. Hay dos formas de crear una unidad flash de arranque universal que no requeriría agregar las claves de cada archivo ejecutable a los archivos de confianza:

  • Utilice GRUB modificado con el cargador interno EFI, sin vertificación de firma digital o restricciones de módulo;
  • Utilice un precargador personalizado (el segundo) que conecta las funciones de vertificación de archivos UEFI (EFI_SECURITY_ARCH_PROTOCOL.FileAuthenticationState, EFI_SECURITY2_ARCH_PROTOCOL.FileAuthentication)

El segundo método es preferible ya que el software ejecutado puede cargar e iniciar otro software, por ejemplo, el shell UEFI puede ejecutar cualquier programa. El primer método no proporciona esto, permitiendo que solo GRUB ejecute archivos arbitrarios. Modifiquemos PreLoader eliminando todas las características innecesarias y el código de verificación de parches para permitir todo.

La arquitectura del disco es la siguiente:
______ ______ ______ ╱│ │ ╱│ │ ╱│ │ /_│ │ → /_│ │ → /_│ │ │ │ → │ │ → │ │ │ EFI │ → │ EFI │ → │ EFI │ │_______│ │_______│ │_______│ BOOTX64.efi grubx64.efi grubx64_real.efi (shim) (FileAuthentication (GRUB2) override) ↓↓↓ ↑ ↑ ______ ↑ ╱│ │ ║ /_│ │ ║ │ │ ═══════════╝ │ EFI │ │_______│ MokManager.efi (Key enrolling tool) 


Así es como se ha hecho el disco Super UEFIinSecureBoot .
Super UEFIinSecureBoot Disk es una imagen de arranque con el cargador de arranque GRUB2 diseñado para usarse como base para la recuperación de unidades flash USB.

Característica clave: el disco es completamente funcional con el modo UEFI Secure Boot activado. Puede iniciar cualquier sistema operativo o archivo .efi, incluso con firma no confiable, inválida o faltante.

El disco podría usarse para ejecutar varias distribuciones de Live Linux, entorno WinPE, arranque de red, sin deshabilitar el modo de arranque seguro en la configuración UEFI, lo que podría ser conveniente para realizar el mantenimiento de la PC y las computadoras portátiles corporativas de otra persona, por ejemplo, con la configuración UEFI bloqueada con una contraseña

La imagen contiene 3 componentes: shim pre-loader de Fedora (firmado con la clave de Microsoft que está preinstalada en la mayoría de las placas base y portátiles), Linux Foundation PreLoader modificado (desactiva la verificación de firma digital de los archivos ejecutados) y el cargador GRUB2 modificado.

En el primer arranque, es necesario seleccionar el certificado usando MokManager (se inicia automáticamente), después de eso todo funcionará igual que con el arranque seguro deshabilitado: GRUB carga cualquier archivo .efi no firmado o kernel de Linux, los programas EFI ejecutados pueden cargar cualquier otro ejecutable no confiable o conductores

Para demostrar las funciones del disco, la imagen contiene Super Grub Disk (un conjunto de scripts para buscar y ejecutar el sistema operativo incluso si el gestor de arranque está roto), GRUB Live ISO Multiboot (un conjunto de scripts para cargar Linux Live distribuciones directamente desde el archivo ISO), Uno Archivo Linux (el núcleo y el initrd en un solo archivo, para la recuperación del sistema) y varias utilidades UEFI.

El disco también es compatible con UEFI sin arranque seguro y con PC más antiguas con BIOS.


Gestores de arranque firmados

Me preguntaba si es posible omitir la inscripción de la primera clave de arranque a través de shim. ¿Podría haber algún gestor de arranque firmado que le permita hacer más de lo que esperaban los autores?
Al final resultó que hay tales cargadores. Uno de ellos se utiliza en Kaspersky Rescue Disk 18: disco de arranque de software antivirus. GRUB desde el disco le permite cargar módulos (el comando insmod), y el módulo en GRUB es solo un código ejecutable. El precargador en el disco es personalizado.

Por supuesto, no puede simplemente usar GRUB desde el disco para cargar código no confiable. Es necesario modificar el módulo del cargador de cadena para que GRUB no use las funciones UEFI LoadImage / StartImage, sino que cargue automáticamente el archivo .efi en la memoria, realice la reubicación, encuentre el punto de entrada y salte a él. Afortunadamente, casi todo el código necesario está presente en el repositorio de arranque seguro de Red Hat GRUB , el único problema es que falta el analizador de encabezado PE . GRUB obtiene un encabezado analizado de shim, en respuesta a una llamada de función a través de un protocolo especial. Esto podría solucionarse fácilmente transfiriendo el código apropiado desde el shim o PreLoader a GRUB.

Así es como se ha hecho Silent UEFIinSecureBoot Disk. La arquitectura final del disco tiene el siguiente aspecto:
  ______ ______ ______ ╱│ │ ╱│ │ ╱│ │ /_│ │ /_│ │ → /_│ │ │ │ │ │ → │ │ │ EFI │ │ EFI │ → │ EFI │ │_______│ │_______│ │_______│ BOOTX64.efi grubx64.efi grubx64_real.efi (Kaspersky (FileAuthentication (GRUB2) Loader) override) ↓↓↓ ↑ ↑ ______ ↑ ╱│ │ ║ /_│ │ ║ │ │ ═══════════╝ │ EFI │ │_______│ fde_ld.efi + custom chain.mod (Kaspersky GRUB2) 


El final

En este artículo demostramos que no existen suficientes cargadores de arranque confiables firmados por la clave de Microsoft, lo que permite arrancar código no confiable en modo de arranque seguro.
Mediante el uso de archivos firmados de Kaspersky Rescue Disk, logramos un arranque silencioso de cualquier archivo .efi no confiable con Secure Boot habilitado, sin la necesidad de agregar un certificado a UEFI db o shim MOK.
Estos archivos se pueden usar tanto para buenas acciones (para arrancar desde unidades flash USB) como para malas (para instalar bootkits sin el consentimiento del propietario de la computadora).
Supongo que el certificado de firma del gestor de arranque de Kaspersky no durará mucho tiempo, y se agregará a la lista global de revocación de certificados UEFI , que se instalará en las computadoras que ejecutan Windows 10 a través de Windows Update, rompiendo Kaspersky Rescue Disk 18 y Silent UEFIinSecureBoot Disk. Veamos cuán pronto sucederá esto.

Descarga del disco Super UEFIinSecureBoot: https://github.com/ValdikSS/Super-UEFIinSecureBoot-Disk
Descarga silenciosa de UEFIinSecureBoot Disk (red ZeroNet Git Center ): http://127.0.0.1:43110/1KVD7PxZVke1iq4DKb4LNwuiHS4UzEAdAv/

Sobre ZeroNet
ZeroNet es un sistema muy poderoso para servicios y sitios web dinámicos distribuidos descentralizados. El usuario comienza a descargar y sembrar datos del sitio web al visitarlo, siguiendo el principio de BitTorrent. Pero a diferencia de otros sistemas similares, ZeroNet permite crear blogs completos con comentarios, foros, alojamientos de video, sitios wiki, chats, correo electrónico y git.
ZeroNet divide los datos del sitio web a partir del código del sitio web: los datos se almacenan en archivos .json y se combinan en bases de datos sqlite con un esquema definido, lo que permite implementar características alucinantes: búsqueda local en todos los sitios web abiertos en un sentido de milisegundos, todo el sitio real -tiempo de actualización de tipo RSS.
ZeroNet proporciona un sistema de autenticación estandarizado similar al soporte de OAuth, NAT y Tor.
El sistema funciona realmente rápido, es fácil de usar, tiene una interfaz de usuario moderna con características pequeñas pero convenientes como el cambio global de tema noche / día para todos los sitios.

Creo que ZeroNet está subestimado y subió intencionalmente la versión silenciosa del disco solo a ZeroNet Git, para atraer a nuevos usuarios.

Source: https://habr.com/ru/post/446238/


All Articles