07 marzo, 2007

Kernel Malware

El personal de F-Secure responsable de analizar las amenazas mantiene un blog y un canal en YouTube que son destinos obligados para todos aquellos que les interese aprender un poco más sobre seguridad.

Recientemente Kimmo Kasslin publico en su blog un artículo sobre Malware que se enfoca en los que atacan kernel de los sistemas basados en Win NT. Los virus que ganan acceso al kernel se ejecutan en "ring-0" teniendo acceso a todos los recursos del sistema, a diferencia de los que se ejecutan en modo de usuario que se ejecutan en "ring-3". Aunque estos ataques no son nuevos, han sido poco comunes.

En 1999 se encontró el primer malware basado completamente en el kernel bautizado "WinNT/Infis", un parásito residente en memoria que actuaba como un driver del sistema y ganaba control al engancharse directo al INT 0x2E. Al abrir un PE EXE (Portable Executable Win32 file) lo infecta y le cambia la fecha para distinguir los infectados de los no infectados. Por suerte el daño no era grave, al intentar abrir programas como la calculadora, paint o el cd player el sistema manda un mensaje de error diciendo que "no es una aplicación WinNT válida".
Otro virus interesante de kernel es el Virus.Win32.Chatter que se encontró en el 2003. Este se añade a cualquier archivo ".sys" abierto, se engancha al nt!NtCreateFile de la nt!KiServiceTable ganando así control de cada operación de abrir y crear archivo. Pero como la rutina del virus se ejecutaba en modo de usuario se le clasifica en "semi-kernel".

Una de los puntos que destaca del artículo de Kasslin es el hecho de que en los últimos años (2003 al 2006) se incrementado el número de malware en donde algunas o todas sus partes están diseñadas para explotar vulnerabilidades a nivel de Kernel. En gran parte esto parece ser causa del auge que han tenido los rootkits y la cantidad de ejemplos y documentación existente sobre como utilizarlos.

El malware inicialmente intentará ejecutar su código en ring-0, para lograr esto, nos comenta Kasslin, normalmente utilizan una de las siguientes 2 tácticas:

La primera es cargar un driver en el kernel, normalmente contiene la extensión ".sys" y puede ejecutarse en el thread en modo de usuario que pida una función del I/O, también puede hacerlo en el thread en modo de kernel, o uno aleatorio como resultado de una interrupción. Usando el Service Control Manager de Windows pueden usar la función de CreateService y cargar el driver sin necesidad de reiniciar la máquina. Si el registro del driver es exitoso, creará una entrada en el registro en "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services", Una vez registrado se puede iniciar usando la función de StartService del API provisto, lo cual hace que el sistema realice ciertas acciones comunes a cargar un dll en user mode.

Existe otro método para cargar un driver que no está documentado por Microsoft, pero que lo explican Greg Hoglund y Jamie Butler en su libro Rootkits: Subverting the Windows Kernel y que recomiendo ampliamente que lean. La gran ventaja del método que describen es que el driver no dejá ningún rastro en el SCM de su existencia y por lo tanto no puede ser removido hasta que se reinicie la máquina.

El otro método es utilizar las "call gates" que permiten que un programa cambie su nivel de privilegio en el CPU, por ejemplo de ring-3 a ring-0. Esto es posible a través de dos funcionalidades no documentadas de Windows.

La primera utiliza el objeto \Device\PhysicalMemory, que permite a un programa mapear parte de la memoria física a su espacio de direcciones. Uno de los primeros virus que lograron explotar correctamente esta vulnerabilidad es el W32.Fanbot.A@mm. Una explicación detallada de como utilizar esta funcionalidad la pueden encontrar en un artículo de Crazylord en la revista Phrack.

La segunda funcionalidad que utilizan es a través de la función ZwSystemDebugControl exportada de Ntdll.dll, la ventaja de usar esta es que mapea a memoria virtual, en lugar de memoria física ahorrándose así la necesidad de calcular correctamente la traducción de espacio físico a virtual. (ver el el Gurong.A)

Después de explicarnos a detalle como utilizar los gate calls, Kasslin nos lleva dentro del mundo de dos diferentes malwares que corren en modo Kernel, que bien vale la pena leer a detalle y por lo tanto no los comentaré aquí.

Esto es todo por ahora, como siempre dejen sus experiencias, comentarios y sugerencias.

1 comentario:

Josue Bieletto dijo...

En varias ocasiones he encontrado problemas “Habituales” en Windows, como el ejemplo que mencionas donde no te permite abrir Paint o el cd player y rara vez lo relaciono con un virus e ignorantemente supongo que se debe a algún error interno del sistema y le resto importancia sin tomar en cuenta que probablemente sea algún bicho que puede traer peores consecuencias e inestabilidad en el equipo.

Creo que es importante darle la dimensión real al asunto y ser mas concientes sobre la importancia tienen los virus en la inestabilidad de una red y entender que los parches y actualizaciones no son suficientes para ayudarnos a controlarlo.