Inicio / Blog / Bootkits: Atacando el arranque

Bootkits: Atacando el arranque

Publicado el 07/07/2015, por Antonio López (INCIBE)
Bootkits

El proceso de arranque es un momento crítico en la inicialización del hardware y la carga del sistema operativo. Esta circunstancia supone una oportunidad inmejorable para que un software malicioso tome control de la máquina de forma totalmente silenciosa y transparente para el sistema operativo. En artículos anteriores se habló de los rootkits y los mecanismos empleados para comprometer un sistema. En este caso hablaremos de los bootkits, cuya finalidad es también infectar un sistema, pero aprovechando la oportunidad del arranque para lograrlo.

Este tipo de software es considerado una de las variantes de malware más peligrosas y de difícil detección/eliminación.

Mecanismos de arranque: BIOS y UEFI

Para introducir el concepto de bootkit es conveniente conocer con cierto detalle que sucede en la puesta en marcha de un PC y qué elementos intervienen.

Independientemente del sistema operativo, la práctica totalidad de ordenadores domésticos tipo PC-compatible utilizan para su arranque uno de estos dos mecanismos firmware: el tradicional basado en BIOS o el más moderno UEFI (Interfaz unificado extensible del hardware).

BIOS (Basic Input/Output System) es un estándar firmware para la verificación e inicialización del hardware y la gestión del arranque del sistema operativo de un ordenador tipo PC. Aparece en 1975 por primera vez en dispositivos con sistema operativo CP/M. Posteriormente IBM divide BIOS en dos partes: modo real (con acceso total a cualquier dirección de memoria física) y modo protegido (con memoria virtual y control de acceso a memoria). BIOS es un sistema de 16 bits con ciertas limitaciones en cuanto a seguridad (código no firmado digitalmente y arranque en modo real de CPU) y restricciones de tamaño para manejar discos/particiones.

UEFI es un firmware que nace con el objetivo de relevar a BIOS, superando a este último en asuntos como la limitación del tamaño de particiones de disco o la seguridad intrínseca del proceso de arranque. En 1998 nace EFI, una iniciativa de que ha ido pasando por distintas evoluciones, hasta llegar a la especificación UEFI en 2005. En 2006 es adoptada como mecanismo de arranque en dispositivos Apple basados en Intel. Desde 2011 la mayoría de los PCs incorporan firmware UEFI, aunque es muy habitual el uso del módulo de compatibilidad CSM (Compatibility Support Module) para arrancar el sistema al viejo estilo BIOS. Desde 2012, todos los ordenadores con Windows 8 incorporan UEFI.

Manejo de particiones y seguridad: BIOS vs UEFI

BIOS utiliza el primer sector del disco de arranque (512 bytes), denominado MBR (Master Boot Record) para almacenar el código inicial de arranque, parámetros de disco y la tabla de particiones. Para la tabla de particiones se destinan 16 bytes y con un máximo 4 particiones primarias. BIOS utiliza entradas de direccionamiento lógico de bloque o LBA de 32 bits, que unido a un tamaño de bloque en disco de 512 bytes resulta en un límite de espacio máximo de 2^32 * 512 = 2TB.

A diferencia de BIOS, UEFI almacena integrado en el propio firmware tanto el código de arranque como una tabla de particiones GPT, y puede manejar hasta 128 particiones. Se establecen 64 bits para LBA lo que se traduce en un máximo tamaño (para discos con sectores de 512 bytes) de 2^64 * 512 = 9 ZB. Adicionalmente y por compatibilidad con BIOS puede hacer uso de MBR. UEFI reserva una pequeña partición en formato FAT32 para ubicar ficheros que gestionan el arranque del kernel (bootloader).

Manejo de particiones: BIOS/MBR vs UEFI/GPT

- Manejo de particiones: BIOS/MBR vs UEFI/GPT -

En cuanto a la seguridad, BIOS no firma digitalmente el código firmware, confiando en un control CRC para verificar la integridad del mismo. UEFI sin embargo, utiliza criptografía para verificar mediante firma digital el firmware y el código de arranque (Secure Boot). Por otra parte, BIOS se inicia con la CPU en modo real de ejecución, lo que permite un acceso total a la memoria y recursos hardware. El modo protegido se emplea en UEFI durante todo el proceso, haciendo uso de memoria virtual lo que restringe el acceso arbitrario a cualquier zona de memoria y acceso directo al hardware.

Conociendo los dos mecanismos principales de arranque de un PC es necesario saber qué sucede en todo el proceso, desde que se conecta el ordenador hasta que se carga el sistema operativo.

Arrancando el sistema: Desde el interruptor al Sistema Operativo

Secuencia de arranque BIOS

En un arranque basado en BIOS, tras encender la computadora se ejecuta un test de hardware, y el firmware BIOS almacenado en flash/rom se carga en memoria y busca el primer dispositivo de arranque disponible siguiendo el orden configurado. A continuación, se lee el primer sector del dispositivo conocido como MBR (Master Boot Record). El MBR consta de un total de 512 bytes que contiene el código inicial de arranque (fase 1), unos parámetros descriptivos del disco, la tabla de particiones y firma del disco, terminando con un marcador de 2 bytes que identifican el MBR (0x55AA). La firma son 32 bits destinados únicamente a identificar el hardware del disco.

Estructura de un MBR

- Estructura de un MBR -

 Dado el limitado tamaño disponible para código en el MBR (unos 400 bytes, dependiendo del sistema), éste se limita generalmente a localizar y saltar a la siguiente fase de arranque: el bootloader, o fase 2 del arranque.

El bootloader es una porción de código encargado que se encuentra en el primer sector de la partición marcada como partición de arranque VBR (volume boot record), la cual cuenta con una estructura similar al MBR. El bootloader contiene el código que gestiona las opciones del menú de arranque (multi-sistema) y carga de sistema operativo.

Algunos de los bootloaders más conocidos son NTDLR (Windows 2000,XP), BOOTMGR (Windows 7,8, 10) o GRUB2 para Linux.

VBR: primer sector de una partición de arranque

- VBR: primer sector de una partición de arranque –

Secuencia de arranque en un sistema basado en BIOS

- Secuencia de arranque en un sistema basado en BIOS –

Secuencia de arranque UEFI

Como se ha indicado, el proceso de arranque en un sistema basado en UEFI es distinto a BIOS e incorpora mejoras respecto a la limitación de número y tamaño de particiones, así como medidas de seguridad. Un sistema UEFI no necesita recuperar código de arranque desde un MBR/VBR puesto que se encuentra embebido en el firmware en ficheros con formato PE para binarios ejecutables y drivers.

Este firmware UEFI dispone de unas variables cuyos valores son accesibles y modificables para configurar la gestión del arranque. Esta interacción con el firmware y sus variables puede realizarse utilizando herramientas como efibootmgr para Linux, bootcfg para Windows o bless para Mac OS X.

Así por ejemplo, puede especificarse al firmware donde encontrar el bootloader, el fichero que un sistema UEFI ubica en una partición especial con formato FAT32 y que contendrá la información para cargar el kernel del sistema operativo.

Adicionalmente, y por compatibilidad con BIOS, UEFI puede hacer uso tradicional de MBR/VBR. Por otra parte, UEFI hace uso del modo protegido de la CPU lo que se traduce en restricciones de acceso a memoria y entrada/salida hardware mientras que BIOS arranca en modo real, que permite acceso sin restricciones a los recursos con las implicaciones de seguridad que esto supone.

Finalmente, UEFI dispone de opciones (Secureboot) que realizan verificaciones criptográficas sobre bootloaders, drivers y variables UEFI antes de permitir el arranque.

Arranque BIOS vs arranque UEFI

- Arranque BIOS vs arranque UEFI. Fuente: NIST SP800-147 -

Bootkits

El arranque representa, en cualquiera de las fases del mismo, una situación inmejorable para evitar medidas de protección, tratar de inyectar código al kernel del sistema operativo y tomar el control de la máquina en el momento de la carga. Un bootkit aprovecha esta circunstancia para conseguir la infección antes del inicio del sistema operativo con lo cual, su detección y eliminación es mucho más complicada.

Aunque la aparición de UEFI como relevo de BIOS puso muchas dificultades a este tipo de software para infectar un sistema, la evolución de los bootkits empieza a explorar nuevas vías para atacar y conseguir evadir las protecciones implementadas por UEFI.

Introducción: Evolución y muestras

El primer concepto de infección de arranque (y también de virus) data de 1987, conocido como Brain y aunque no podemos considerar este ejemplo como un bootkit con objetivo de controlar un sistema, sí es cierto que es la primera ocasión que aparece la idea de atacar el sector de arranque de un sistema (en este acaso un disquete).

Pero es en la BlackHat de 2005 con una prueba de concepto denominada eEye, cuando se presenta una demostración de la manipulación del MBR para infectar un sistema Windows. Esta demostración fue el punto de partida de sucesivas pruebas que han ido evolucionando técnicamente y la aparición paralela de malware. Los puntos clave en la evolución de bootkits se representan en el siguiente diagrama:

Hitos en la evolución de bootkits

- Hitos en la evolución de bootkits -

Puntos de infección y clasificación de bootkits

Existen muchas variantes de bootkits que explotan distintas vías de infección, sin embargo las estrategias más comunes de ataque pasan por modificar el código de arranque del MBR/VBR en sistemas BIOS (cosa relativamente sencilla al carecer de firma criptográfica), ficheros de gestión de arranque del kernel o bootloaders, drivers o vías más intrusivas, como la modificación del firmware.

Algunos ejemplos

Técnicas de modificación del código de arranque:

Modificación de MBR:

  • Mebroot,TLD4, Oldmasco

Modificación de VBR:

  • Rovnix, Gapz

Técnicas modificación bootloaders o firmware:

  • Modificación bootloader: Ej: Dreamboot (Prueba de concepto, UEFI)
  • Modificación firmware: Ej: Mebromi (BIOS)

Clasificación de bootkits MBR/VBR

- Clasificación de bootkits MBR/VBR (BIOS)- Fuente: ESET

Bootkits contra UEFI y protecciones del arranque

Como se ha apuntado, los sistemas basados en BIOS carecen de verificaciones criptográficas del código que se ejecuta en el arranque y por ello son más vulnerables a que los sistemas UEFI, los cuales firman digitalmente el código del proceso. Por esta razón la mayoría de los bootkits se centran en sistemas BIOS con MBR/VBR. Sin embargo en la actualidad los sistemas basados en BIOS empiezan a quedar obsoletos y por lo tanto comienzan a perder interés para los desarrolladores de malware. La consolidación del arranque UEFI en sistemas modernos empieza a cerrar puertas a toda la línea tradicional de bootkits BIOS y es de esperar que el futuro de investigación y aparición de bootkits se focalice en UEFI.

Conseguir infectar y modificar el firmware resultaría ideal, pero resulta la opción mucho más complicada y con mayor dependencia de la plataforma. La modificación de firmware de BIOS puede conseguirse de forma relativamente sencilla, puesto que no obliga a usar una firma criptográfica sino únicamente un checksum CRC y es posible su reescritura. UEFI implementa verificaciones tanto de los drivers y bootloaders (Secure Boot) como del kernel del sistema operativo así como del firmware y se apoya en claves criptográficas almacenadas en ROM y en tecnología TPM, todo ello con el objetivo de evitar cualquier tipo de manipulación.

Ataques contra la seguridad UEFI

Investigaciones como la prueba de concepto Dreamboot o la investigación presentada en la conferencia Syscan2014 : Setup for Failure: Defeating Secure Boot, abrieron las puertas a las posibilidades de evasión sobre los mecanismos de protección UEFI sobre drivers, bootloader y kernel. Se descubrió la existencia de ciertos elementos integrantes de UEFI sobre los cuales no se aplica estrictamente la verificación de firma digital y que posibilitan abrir vías de ataque:

Vías de ataque UEFI

- Vías de ataque UEFI: Option ROM, DXE driver y bootloader - Fuente: ESET

Futuro

UEFI, Secure Boot y sus mecanismos de protección pone muy difícil las cosas a los bootkits modernos. Por ello, nuevas vías de ataque que se centran en el firmware de dispositivos de red o discos duros están apareciendo en escena. El futuro del malware especializado en atacar procesos de arranque, drivers y control de dispositivos parece que puede dar mucho que hablar.

  • Option ROMS: Ejecución de firmware de drivers no embebido en UEFI, generalmente localizado en tarjetas adicionales (video, tarjetas de red, discos)
  • DXE (Driver Execution Environment): Inicialización y drivers
  • Bootloader: Manipulaciones de variables EFI posibilitan evitar SecureBoot y cargar un bootloader manipulado. (Setup for Failure: Defeating Secure Boot Syscan 2014)