El siguiente post es una traducción (con algunas adaptaciones idiomáticas) del texto realizado por David Harley, Aleksandr Matrosov y Eugene Rodionov, publicado en el blog de ESET en inglés donde podrán observar cómo varían las técnicas utilizadas para la infección de bootkits en arquitecturas x64.
Durante la primera mitad del 2011, hemos sido testigos de un importante crecimiento en la cantidad de códigos maliciosos para plataformas de 64 bits, los ejemplos más interesantes de este tipo de amenazas son los bootkits. Actualmente existen distintas familias de malware:
- Win64/Olmarik, un bootkit de la MBR (Master Boot Record, en español, el sector de arranque).
- Win64/Rovnix, un bootkit de VBR (Volume Boot Record, en español, primer sector del disco).
- Win64/TrojanDownloader.Necurs
- Win64/Spy.Banker
Si se compara la cantidad de amenazas para plataformas x64, los códigos maliciosos para estas plataformas no son muchos. Pero observando las estadísticas, el porcentaje de amenazas de nuevas familias que han aparecido en lo que va del año, demuestra un aumento considerable. En comparación con las índices del verano del 2010, existe un alza en las detecciones de códigos maliciosos para plataformas de 64 bits, lo que marca una clara tendencia. Esto se encuentra relacionado con la aparición de una nueva versión de Win64/Olmarik (TDL4) y sus índices de propagación.
Todas estas amenazas utilizan trucos para evadir (bypass) la comprobación de las firmas digitales, que se encuentran divididas en dos grupos. El primero de ellos, funciona completamente a nivel de usuario (user mode), y el segundo grupo apunta al proceso de inicio del sistema operativo (booting) para manipular la memoria en modo kernel (núcleo):
Las técnicas para evadir las modificaciones de MBR ya fueron descritas en detalle en la investigación de "La evolución de TDL: Conquistando x64",debido a ello, en este post nos vamos a centrar más en las técnicas de modificación para VBR. Recientemente hemos detectado un código malicioso (Win64/Rovnix) cuyo dropper es detectado como Win32/Papras. Esta amenaza utiliza una técnica poco usual para infectar un sistema: en lugar de sobre escribir la MBR, como normalmente lo hacen los códigos maliciosos, infecta la sección de código del NTFS (New Technology File System, en español, nuevo sistema de archivos del sistema) bootsrap del sector de arranque de la partición de disco activa.
Evadiendo las políticas de firmas de código en modo kernel a través de VBR
Antes de hablar acerca del método para evadir la comprobación de integridad, primero vamos a describir algunas de las anotaciones básicas que vamos a utilizar, y los conceptos de carga del sistema operativo. Al comienzo del proceso de arranque, el código de la BIOS lee el primer sector del disco, lo que se conoce como Master Boot Record (MBR), al que transfiere el control. El código del MBR y una tabla de partición que describe el esquema de particiones del disco. La principal función del código del MBR es localizar una partición activa en el disco y leer su primer sector: el Volume Boot Record (VBR). El VBR contiene el código específico necesario para iniciar el loader del sistema opreativo. De hecho, existen 15 sectores consecutivos, a continuación del VBR, que contienen el código de bootstrap de la partición NTFS. El código de bootsrap parsea el sistema de sistema de archivos NTFS y localiza el cargador (loader) del sistema operativo (por ejemplo, BOOTMGR, el Windows Boot Manager, en el caso de Windows Vista). El proceso de inicio se encuentra representado en la siguiente imagen, en dónde se puede observar que Win64/Rovnix tiene como objetivo el código de bootsrap:
En lugar de sobre escribir la MBR, como suele suceder con los bootkits, Win64/Rovnix infecta el código de inicio de NTFS. Esta amenaza lee los 15 sectores a continuación del VBR y el contenido del código de bootstrap. Estos sectores son comprimidos y se les agrega una sección de código extraída de los recursos del malware. El código que queda, como resultado de esta modificación, se escribe en los 15 sectores a continuación de la VBR como se puede observar en la imagen a continuación. Entonces, en el siguiente inicio del sistema el código maliciosos toma el control:
Cuando el código maliciosos alojado en el bootstrap se ejecuta, crea un hook al handler de la instrucción int 13h (el acceso a disco) para poder modificar el ntldr/bootmgr con el objetivo de obtener el control una vez que se cargan los componentes del boot loader. Luego, descomprime el código original y se le devuelve el control. Para poder cargar el código malicioso en el espacio de direcciones del kernel y evadir las políticas de firmas, Win64/Rovnix utiliza algunas técnicas poco usuales. Primero, utiliza la IDT (Interrupt Descriptor Table, en español, Tabla de Vectores de Interrupción) para poder propagarse a través del cambio de contexto del procesador (de modo real a modo protegido). La IDT es una estructura del sistema utilizada en modo protegido y contiene los handles para manejar las interrupciones. El código malicioso guarda una copia de si mismo en la segunda mitad de la IDT, que no es utilizada por el sistema. En segundo lugar, crea un hook a la instrucción int 1h en el handler de modo progetido y define ciertas interrupciones de hardware para recibir el control en determinadas etapas del proceso de carga del sistema operativo:
Mediante el uso de registros de depuración dr0-dr7, que son una parte esencial de las arquitecturas x86 y x64, el malware consigue el control en algún momento durante la inicialización del kernel y carga manualmente su propio driver malicioso, evitando así la comprobación de integridad de código en modo kernel.
La característica distintiva del método descrito anteriormente es su complejidad y la alta dependencia del sistema. El código malicioso alojado en el sector de arranque trabaja en estrecha colaboración con los componentes del bootloader del sistema operativo. Sigue el flujo de ejecución desde el comienzo del proceso de inicio del sistema . Se basa en gran medida en las instalaciones de debug de la plataforma y la representación binaria de los componentes del bootloader del sistema operativo.
Obviamente, el desarrollo de este tipo de códigos maliciosos es muy costoso y conlleva una gran cantidad de tiempo que incluye a desarrolladores con un gran conocimiento técnico. Aunque esta técnica es muy específica y altamente compleja funciona en versiones de Windows de 32-bit como así también en sistemas de 64 bits.
Aleksandr Matrosov, Eugene Rodionov, David Harley