20 mayo 2010

KHOBE aka TOCTOU

Hola a todos, en primer lugar, es un placer para mi poder escribir un post para sbd.

La intención de este post es explicar de que trata la condición de carrera llamada "KHOBE" y matizar varias cosas sobre: La técnica usada, matizar algunas de las respuestas de las empresas Anti Virus que he visto y por último sobre los intereses de matousec. Basicamente leyendo las referencias mostradas al final del post podrá usted mismo darse cuenta de todo lo ocurrido con este asunto:

Lo primero es conocer que es KHOBE (Kernel Hook Bypassing Engine), simplemente es una condición de carrera de toda la vida, también conocido como TOCTOU (time-of-check-to-time-of-use). El tipo de fallo no es algo nuevo, y se conoce desde hace muchos años (1996), como se puede ver en:

http://seclab.cs.ucdavis.edu/projects/vulnerabilities/scriv/1996-compsys.pdf

El artículo fue escrito y publicado por matousec el 05/05/2010, algunos Anti Virus modifican la SSDT (System Service Descriptor Table) para modificar/añadir/eliminar funcionalidades en el Sistema Operativo. Para simplificar, imaginemos que existe una API e un SO imaginario, llamada EjecutarFichero(), y existe una tabla en la cual existen las direcciones de memoria donde se encuentran algunas de las APIs, si modificamos la entrada de la API EjecutarFichero() por una dirección en memoria, en la que tengamos nuestra propia implementación, las siguientes llamadas a la API EjecutarFichero() podrían hacer lo que nosotros queramos.

Bien, entendido este cutre-ejemplo, el problema reside en que el planificador (Scheduler) del SO puede cambiar de tarea en cualquier momento, ya que se ejecuta la función de la SSDT con IRQL en PASSIVE LEVEL. Imaginemos el siguiente escenario:

1) Un hilo (thread) llama a una API por ejemplo EjecutarFichero(), se pasa la ejecución al núcleo (kernel), imaginemos que se ha hecho un EjecutarFichero( "cosabuena.exe" );

2) Existe un AntiVirus en el sistema que ha modificado la SSDT para que se ejecute una implementación que comprueba ciertos patrones sobre lo que se quiere ejecutar y decide ejecutarlo o no llamando a la función original del núcleo. En este caso todo está correcto y se procede a ejecutar la función original, pero justo antes el Planificador pasa el control a otro hilo del mismo proceso.

3) Ahora ese hilo como es el mismo proceso, pues tiene acceso al área de memoria donde está la
cadena de caracteres "cosabuena.exe" y la modifica por "cosamala.exe"

4) El planificador devuelve el control al primer hilo y se pasa a ejecutar la función original del sistema operativo EjecutarFichero(), pero se ejecutará otro programa el cual no ha sido comprobado.

La solución para este tipo de escenario puede ser por ejemplo, copiar en una memoria propia y solo accesible desde el nucleo el nombre del programa a ejecutar y después usar solo esa memoria tanto para comprobar, como luego para llamar a la función original.

Nota: Esto solo es un ejemplo para hacerse una idea, en la realidad esto se hace de una forma diferente, pero no quiero complicar demasiado el post.

Pues este tipo de fallos es bastante común y no es el fin del mundo, el artículo de matousec, no cuenta nada nuevo ni debe interpretarse como tal. Este tipo de problemas en la SSDT ya existen desde hace muchos años, por ejemplo En el 2003, también se creó un hilo respecto al tema por Andrey Kolishak, TOCTOU with NT System Service Hooking:

http://seclists.org/bugtraq/2003/Dec/351

También un post muy interesante del tema fue escrito por Ken Johnson (conocido como Skywing): Why hooking system services is more difficult (and dangerous) than it looks:

http://www.nynaeve.net/?p=210

Bueno y... ¿qué es lo que pasa con todo esto? Pues lo de siempre, gente con ganas de ganar pasta
y vende motos de ruedas cuadradas. Se le ha dado a todo esto MUCHO más valor del que tiene, esto es peligroso si la gente ejecuta cosas con la cuenta administrador, se pueden hacer muchas más cosas diferentes a esta y no se grita/vende a los cuatro vientos. Opino al igual que DiabloNova (conocido como EP_X0FF) en su artículo sobre KHOBE en rootkit.com:

http://www.rootkit.com/vault/DiabloNova/037_The_story_of_bucks.rar


Lo más gracioso de la publicación de matousec ha sido:

"This paper presents attack pattern called the argument-switch attack which shows that common implementations of kernel mode hooks are not secure. This attack represents serious threat because many security software vendors base their security features on hooking. We tested the most widely used security applications and found out that all of them are vulnerable. Today's most popular security solutions simply do not work."

Curiosidades sobre algunas publicaciones de empresas Anti Virus comentadas en kernelmode.info:

"And HIPS doesn't even use SSDT hooks on Windows versions after XP, because Vista and Windows 7 include Microsoft's Kernel Patch Protection, which precludes the use of SSDT hooking."

Esto solo es cierto en las versiones de x64 a partir del XP.

http://www.kernelmode.info/forum/viewtopic.php?f=15&t=153

IMHO, después de esto, todo lo relacionado con KHOBE se debería olvidar y en el futuro evitar impresionarse y hacer bombo con este tipo de cosas, que sólo vienen por intereses económico y nada académico. Espero no haber sido muy técnico y que se haya podido entender todo para la más técnica como yo recomiendo las referencias del final.

Agradecimientos: 48bits, pluf, griyo, slay, tomac, alon, blackngel, sbd team ...

- By David Reguera García aka Dreg, Dreg@fr33project.org, http://www.fr33project.org/

Referencias:
  1. http://www.matousec.com/info/articles/khobe-8.0-earthquake-for-windows-desktop-security-software.php
  2. http://seclists.org/bugtraq/2003/Dec/351
  3. http://seclab.cs.ucdavis.edu/projects/vulnerabilities/scriv/1996-compsys.pdf
  4. http://www.rootkit.com/vault/DiabloNova/037_The_story_of_bucks.rar
  5. http://blog.gdatasoftware.com/overview/article/1654-khobe-no-problem.html
  6. http://www.itworld.com/security/107345/ignore-nonsense-anti-virus-software-good-ever
  7. http://www.f-secure.com/weblog/archives/00001949.html
  8. http://www.sophos.com/blogs/duck/g/2010/05/11/khobe-vulnerability-earth-shake/
  9. http://www.eset.com/blog/2010/05/11/khobe-wan-these-arent-the-droids-youre-looking-for
  10. http://www.norman.com/security_center/blog/snorre_fagerland/80159
  11. http://en.wikipedia.org/wiki/TOCTTOU
  12. http://www.nynaeve.net/?p=210
  13. http://securesize.com/Resources/files/toctou.shtml
  14. http://www.kernelmode.info/forum/viewtopic.php?f=15&t=153

7 comments :

Anónimo dijo...

Bien explicado. Con mis pobres conocimientos de aficionado lo he entendido. Así que supongo que cualquiera lo pueda entender.

Ruben dijo...

Si señor, bien escrito. Muy didáctico. Hay que desenmascarar a estos de matousec.

chencho dijo...

Genial, para ser un becario lo haces bastante bien ;)

vierito5 dijo...

Muy buen post!

neofito dijo...

Hombre, yo creo que la idea principal la he pillado, asi que enhorabuena por la explicacion!!

Saludos

¿Que opinas de esto? ¿y que te parece esta reaccion (yo estoy con el)?

Fosul dijo...

SBD es un blog realmente interesante, informativo y constructivo. Teneis un nuevo fiel lector. Gracias.

Dreg dijo...

Hola Neofito, perdona por no contestarte antes.

Creo que no soy el más adecuado para hablar de estos temas, pero creo que los comentarios del final del POST ante la duda, hablan por si mismos :-)