TRESOR, solución de cifrado seguro

Una de las recomendaciones básicas de seguridad es el uso de cifrado para almacenar información sensible y confidencial. De esta forma se restringe el acceso a la misma a quienes conozcan la clave con la que se ha cifrado el medio de almacenamiento correspondiente. Se trata de una medida de prevención ante robo físico o pérdida del sistema de almacenamiento y protección del acceso lógico mientras no esté montada la partición cifrada. Aún así, existen técnicas para obtener la clave de cifrado del sistema operativo, siempre y cuando se tenga acceso físico al sistema objeto del ataque. Se trata de los ataques de arranque en frío (Cold boot attacks) y por otra parte ataques DMA, a través de puertos como el firewire, etc… .

Entre otras medidas de prevención frente a este tipo de ataques, existe una que fue presentada en las charlas de seguridad organizadas por USENIX en 2011: TRESOR. Se trata de un parche para el kernel de Linux compatible con arquitecturas x86 que implementa el algoritmo de cifrado AES basado en el manejo de claves de cifrado en registros del procesador. A diferencia de los sistemas de cifrado habituales, la mayoría de los cuales almacenan las claves en la memoria RAM del sistema, éste aprovecha los registros de debug como medio de almacenamiento seguro. En sistemas de 32 bits estos tienen 4 registros x 32 = 128 bits en total, lo suficiente para almacenar la clave secreta de AES-128. Pero en sistemas de 64 bits estos tienen 4 x 64 = 256 bits en total, suficiente para almacenar cualquiera de las longitudes de clave definidas para AES de 128, 192, y 256 bits. Los registros de depuración son un recurso privilegiado del anillo 0 de privilegios del sistema, lo que significa que ninguna aplicación que se ejecuta en el espacio de usuario, anillo 3, puede acceder a los registros de depuración directamente. Cualquier acceso se realiza a través de llamadas al sistema, es decir, a través de ptrace.

TRESOR parchea la llamada al sistema ptrace para devolver como resultado -EBUSY cada vez que un registro de breakpoint es solicitado, de esta forma se reserva su uso de cara al espacio de usuario. La clave almacenada en estos registros es guardada aplicando 2000 iteraciones del algoritmo SHA256 y consiste en una clave compuesta entre 8 y 53 caracteres que se solicita al usuario durante el proceso de arranque, directamente en el espacio del kernel. Sí que es cierto que durante el proceso de almacenado de la clave, se usa la memoria RAM, pero se trata de una transacción de muy poca duración, que además se realiza un borrado seguro de las partes de la clave que puedan haber quedado en la propia memoria, siempre antes que cualquier proceso de usuario se ejecute.

Ejemplo de uso:

> cryptsetup create tr /dev/sdb1 -c tresor
   Enter passphrase: ******
> mkfs.ext2 /dev/mapper/tr
> mount /dev/mapper/tr /media/tresor/

Tabla comparativa de velocidad de procesamiento de información según el método de cifrado:

Más información:

http://www1.informatik.uni-erlangen.de/tresor