StegFS








1.-Introducción

Desde siempre la gente ha sentido la necesidad de ocultar información a los ojos de alguien en concreto, "evitar los ojos intrusos". Se han hecho necesarios sistemas que llamamos criptográficos que se encargan de convertir una información en otra muy diferente e ininteligible de manera que tan sólo el poseedor de una clave puede devolver la información a la forma inicial. En estos tiempos en que vivimos, conocemos más por criptografía a cualquier método de encriptación de la información (datos) de un computador?

Pues bien, con el propósito de dar una cierta seguridad y privacidad a la información que poseemos en nuestro sistema se han creado métodos criptográficos cuyos algoritmos son casi invulnerables al criptoanálisis. Estos encriptan la información mediante la clave que el usuario introduce. Pero no sólo están los programas para encriptar algunos archivos, también existen los llamados sistemas de archivos criptográficos, gracias a los cuales se encripta todo lo que hay en el sistema de archivos. Existen algunos como CFS (Unix), TCFS (Linux), EFS (windows),etc? que encriptan los archivos individualmente y otros como Linux Loopback Device y el SFS para plataformas Microsoft que encriptan las particiones del disco enteras.

Son muy útiles y seguros, pero todos tienen cierta pega. La información, aunque cifrada, se puede observar en nuestro sistema y por lo tanto siempre se puede saber que ahí hay algo aunque no se sepa qué y utilizar métodos de extorsión para hacernos revelar la clave o simplemente mediante el acceso físico a nuestro sistema introduciendo programas como el UHF que transmiten las teclas pulsadas y las claves de sistema por la red.

Con motivo de estos inconvenientes, se crea este sistema de archivos esteganográfico, que pretende solucionar este problema con un mecanismo que los autores denominan Negabilidad Creíble y consiste en poder negar que cierta información se encuentra en nuestro poder. El termino esteganografía proviene del griego, stegos=encubrir y graptos=escrito, con lo cual significaría algo así como escritura oculta. Así pues, la negabilidad creíble se conseguiría ocultando en nuestro sistema los archivos que han sido grabados en los distintos niveles de seguridad de este sistema de archivos y poder negar su existencia. A continuación detallaremos como es capaz de realizar estas funciones y cuales son las pegas de éste.
 
 

2.-Los inicios de los sistemas de archivos esteganográficos

Anderson, Needham y Shamir fueron los primeros en diseñar un sistema de archivos con un mecanismo de Negabilidad Creíble que llamaron esteganográfico. Encontraron dos caminos para construirlo como sistema. El primero asume que el atacante no tiene conocimiento de esos archivos y por lo tanto en lugar de fuertes algoritmos de cifrado usar solo operaciones de álgebra linear. Operaría modificando las cubiertas iniciales de los archivos con contenidos aleatorios. Los archivos se almacenan modificando las cubiertas aleatorias iniciales de los archivos tal que el texto sin cifrar puede ser recuperado por una combinación lineal de estas cubiertas. La clave para acceder a los archivos corresponde al subconjunto de las cubiertas aplicándole XOR para reconstruir el archivo oculto.

El segundo propone llenar el sistema de archivos con datos aleatorios. Los bloques de los archivos serían escondidos entre estos datos aleatorios escribiendo los bloques encriptados a posiciones pseudo-aleatorias usando una clave derivada del nombre del archivo y del password del directorio. El problema es que al ser ahora indistinguible de los datos aleatorios, puede producirse una sobrescritura de esta información oculta, lo cual suele ocurrir a partir de la raíz de n boques usados, donde n es el total de bloques del sistema de archivos.

Van Schalt y Smeddle implementaron otro sistema basado en uno de los anteriores (2º método) el cual marcaba los bloques como "debe estar usado por un nivel de seguridad superior". Pero éste tiene el problema de que una vez abierto un nivel de seguridad se puede saber si existen otros pero no la cantidad de información que hay en ellos.

Existen otros sistemas de archivos esteganográficos que usan la idea de guardar la información en sitios no aleatorios como podrían ser imágenes o archivos de audio. El ScramDisk para windows es uno de ellos.
 
 

3.- Aportaciones del sistema StegFS
 
 

El sistema de archivos StegFS esta basado en el segundo modelo de sistema esteganográfico pero incluyendo nuevas mejoras. Este nuevo sistema de archivos esta creado para funcionar bajo sistemas unix en su sistema de archivos más utilizado, el extend 2. Este no requiere de una nueva partición, sino que funciona prácticamente = que el extend2 y utiliza el espacio libre de que dispone la partición para alojar los archivos ocultos. En lugar de utilizar una función hash para guardar la situación de los bloques, este sistema crea a parte una tabla de localización de los bloques. Utiliza una función similar a la de localización de bloques en un mapa de bits en los sistemas de archivos normales excepto en que en lugar de un bit para cada bloque, este posee una entrada encriptada de 128 bits la cual es indistinguible de bits aleatorios hasta que se introduce la clave para el nivel de seguridad. La longitud de esta tabla depende sólo del tamaño de la partición. Por esta tabla se puede saber que esta instalado este sistema de archivos, pero nunca se podrá saber si existe algún nivel de seguridad utilizado ni la cantidad de información que puede estar contenida en él. Es imposible llegar a saber cuántos niveles de seguridad existen en nuestro sistema.

Como ya dijimos, se utiliza como el mismo sistema de archivos existente en la partición y por lo tanto, cuando esta instalado, se acerca bastante a la semántica del sistema de archivos Standard de Unix. Utiliza directorios, subdirectorios, inodos, links, etc? Esto nos permite utilizar todo el disco duro para el propósito y trabajar con el.

Así, aportando nuevas características al sistema anteriormente citado, el StegFS se convierte en mucho mas práctico y seguro, gracias a que se basa en el sistema de archivos anterior y utiliza de su espacio disponible para ocultar la información, lo cual lo hace mas práctico en cuanto a utilización y seguro en cuanto a que oculta la información en bloques que marca como libres y por lo tanto casi imposible, por no decir imposible, saber si existe información oculta en algún nivel de seguridad. Parte de la seguridad que propone este sistema, aunque discutible, es la duplicación de bloques para evitar la pérdida de información por sobrescritura. Dije discutible porque esto supone un incremento del espacio ocupado en el sistema y por otra parte nunca es seguro que no se produzca una perdida de información, aunque si muy muy poco probable. Así ahora daremos paso ha hablar de cómo funciona este sistema de archivos y sus características técnicas más profundamente?
 
 

4.- Implementación
 
 

El sistema de archivos en el kernel de linux esta estructurado en un interfaz llamado Virtual File System Interface, algunos drivers específicos de sistema, la buffer cache y una serie de drivers de hardware específicos. Ya que el sistema de archivos Standard de linux es el second extended filesystem se utiliza éste como base del StegFS. Podríamos usar el StegFS en un sistema con Ext2 y viceversa, lo cual nos permite borrar el StegFS y seguir utilizando los archivos no ocultos del sistema. Antes de seguir hemos de decir que el StegFS se situa entre el VFS y la blockbuffer cache. Una vez cerrados todos los niveles de seguridad el funcionamiento es muy similar al del Ext2 con una excepcion, que al borrar algún archivo sus bloques son inmediatamente sobrescritos con byts aleatorios. También otra modificación importante es que al crear nuevos archivos una pequeña parte de ellos es situada en algun lugar aleatorio del disco diferente del normal. Así no se puede sospechar de bloques sueltos a través de sectores en los que no debería haber nada y ahora hay algo de información. Cuando los niveles de seguridad están abiertos, el sistema cambia por completo. Los bloques que antes estaban ocultos ya no pueden ser sobrescritos.

El StegFS contiene esencialmente 2 usos paralelos de las funciones del ext2. Una muy similar a la del ext2 cuando los niveles están cerrados y otra muy diferente cuando los niveles de seguridad están abiertos. Sólo hemos de ver que el StegFS añade 5000 líneas a las 5400 del driver del ext2.

Una vez instalado el sistema de archivos podemos ejecutar "stegfsopen" para abrir o crear un nuevo nivel de seguridad cuyos archivos ocultos serán de nuevo visibles. Una vez ejecutado y abierto un nivel habremos de acceder al directorio de root donde se habrá abierto un directorio llamado "stegfs" dentro del cual encontraremos más directorios con los nombres de "1", "2"? según el nivel de seguridad abierto. Cuando los niveles de seguridad están abiertos ya podemos manejar la información que se encuentran en su interior. Ahí se distingue directorios de archivos. Los directorios contienen nombres de archivos y números de inodos. Los inodos contienen los atributos de los archivos y una lista de los bloques asignados para ese archivo. Así podremos comprender el funcionamiento de este sistema.








4.1.- Gestion de los bloques de archivos
 
 

4.1.1.- Tabla de bloques

Es lo equivalente en el StegFS al mapa de bits de alojamiento de bloques (block allocation bitmap). Este contiene una entrada por bloque en el disco. El propósito principal de esta tabla es guardar los checksums encriptados para cada bloque y así es como los bloques sobrescritos pueden ser detectados. También guarda los números de inodos para los bloques que contienen inodos y así es como se encuentran buscando en esta tabla su número. Esta tabla se guarda en un archivo no oculto.

Cada entrada en esta tabla es de 128 bits y esta encriptada bajo la misma clave que la información situada en el correspondiente bloque del disco. Las entradas consisten en 3 variables de 32 bits y 2 de 16 bits de esta manera:
 
 

Ahora intentemos explicar más o menos para que sirve y la función de cada variable. La variable magic1 debe valer siempre 0. La variable magic2 puede valer 0 o 1, depende de si el bloque contiene información o un inodo respectivamente. La variable bchecksum contiene los últimos 32 bits del contenido de un bloque encriptado, lo cual es equivalente al chechsum de los bloques desde que están encriptados por CBC usando el valor de la variable iv como vector inicial. La variable ino contiene el número del inodo de ese archivo. Las entradas de la tabla que corresponden a bloques libres, contienen información aleatoria. Las variables magic1 y magic2 contienen 47 bits de redundancia que nos permite determinar rápidamente a que nivel de seguridad pertenece ese bloque. El checksum nos permite comprobar qué bloques han sido sobrescritos. El StegFS dispone de una utilidad para limpiar estas entradas que están inutilizadas, pero puede ser que borre alguna entrada utilizada accidentalmente, lo cual ocurre con una probabilidad de 2^(-47) por bloque.
 
 
 
 

4.1.2.- Localización de los bloques
 
 

Los datos y los inodos ocultos se sitúan en lugares aleatorios del disco. El kernel del Linux nos ofrece un código, un número aleatorio en la forma de /dev/urandom(?..) Este número aleatorio lo utiliza para situar el primer bloque del archivo oculto. Los siguientes se sitúan en los siguientes bloques libres. Las copias adicionales de los bloques se sitúan empezando de un lugar aleatorio completamente diferente para asegurarse de que la sobrescritura sea menos probable.

Después de que un bloque sea alojado se comprueba si está marcado como usado en el mapa de bits del ext2fs. Si no esta marcado como usado entonces intenta desencriptar la correspondiente entrada en la tabla de bloques usando cada una de las claves conocidas. Si para ninguna de las claves los primeros 47 bits de la entrada desencriptada son 0, el bloque esta alojado y continuamos haciendo lo mismo con el siguiente bloque libre.

Para los archivos tanto ocultos como normales, un bloque y su correspondiente espacio en la tabla de bloques son rellenados con bytes aleatorios cuando son borrados. Esto ayuda a que se hagan indistinguibles estos bloques de los que ocupan los archivos ocultos hasta que una clave del nivel es introducida.
 
 

4.1.3.- Replicación de los bloques
 
 

Este sistema de archivos crea múltiples copias tanto de los bloques que contienen inodos como de los bloques que contienen información, lo cual ayuda a que si un bloque es sobrescrito se puede encontrar en otro lugar del disco y su información no esta perdida. Normalmente sólo se comprueba el primer bloque, pero si el checksum de esta copia es incorrecto se pasa a la siguiente copia. Cuando una de ellas es correcta, es desencriptada. Cuando escribimos dentro de un archivo y sólo una parte del bloque es cambiada, se ha de realizar la lectura y desencriptación del correspondiente bloque y después de que los cambios se han hecho el vector inicial correspondiente es cambiado, el bloque es encriptado otra vez y rescrito al disco. La tabla de bloques ha de ser actualizada con el nuevo vector inicial y el nuevo checksum. Desde ese momento ha de recorrer todas las copias de ese bloque y leer cuáles han sido sobrescritas y cuáles no. Si las copias están en buen estado entonces encriptamos la nueva información para ese bloque y la escribimos en el disco. Si por el contrario la copia ha sido sobrescrita y esta siendo utilizada todavía por un archivo normal o de un nivel inferior, la encriptamos y guardamos en un nuevo bloque y actualizamos el inodo y la tabla de bloques.

Para asegurarse de que el número de copias de los bloques es el correcto podemos utilizar un método muy simple como es leer y volver a guardar los archivos. Para esto el StegFS lleva incluida una utilidad llamada rerpl que realiza esa función y ayuda al perfecto funcionamiento del sistema de archivos y a su integridad.
 
 

4.2.- Administración de los inodos

4.2.1.- Estructura
 
 

Los inodos ocultos del StegFS son similares a los del Ext2 pero contienen tambien el número de copias que se hicieron de los inodos de los archivos y los bloques de datos. La lista de bloques de datos es de 12 bloques directos, 1 indirecto, uno doble-directo y otro triple-directo, como un inodo de Ext2 pero con la excepción de que posee referencias a todas las copias de ese bloque:
 
 








Los inodos ocultos son de1024 bytes, que es el tamaño normal de los bloques en un sistema de archivos en Ext2 y también se crean las copias para más redundancia.

En la versión actual podemos poner hasta 28 copias de cada bloque oculto de inodos y 14 copias para cada bloque oculto de archivos.

El número de copias de bloques de inodos y de archivos pude ser alterado con un par de "ioctl request types" que dan acceso a los factores de replicación que se guardan como nuevos atributos en los inodos.
 
 

4.2.2.- Números de inodo
 
 

Un número de inodo es únicamente un entero de 32 bits que identifica un archivo con un sistema de archivos. En el Ext2 la localización de un archivo puede realizarse desde su número de inodo. En el StegFS hemos de buscar en la tabla de bloques desencriptada y tratar de encontrar uno que no haya sido sobrescrito. Este sistema de archivos distingue archivos normales de los ocultos por su número de inodo. Los números de inodo de los archivos ocultos también indican su nivel de seguridad del 1 al 15:
 
 








En cambio un inodo de un archivo normal tendría esta forma:
 
 








Se busca en toda la tabla de bloques los inodos de los archivos ocultos. Su localización se realiza haciendo un hashing de la clave del nivel de seguridad y el número de inodo a su vez con una secuencia hash de números. Cuando creamos un nuevo archivo, el número de secuencia se incrementa hasta que no hay más bloques libres para todas las copias del nuevo inodo. Se va a través de esa secuencia también para encontrar los inodos cuando esta cargado.
 
 

4.3.- Virtual File System
 
 

El VFS de linux usa los inodos genéricos y las estructuras de superbloques en memoria. El StegFS aumenta la estructura de superbloques con espacios adicionales para la administración de los niveles de seguridad, un puntero para la estructura de las funciones de cifrado y el archivo de la tabla de bloques. También incrementa la estructura de los inodos del VFS para poder introducir los factores de replicación y la localización de todas las replicas de los bloques de información. Por todo esto el kernel del linux ha de volver a ser compilado y no puede cargarse el StegFS como un modulo cargable de él.
 
 

4.4.- Administración de llaves
 
 

Los archivos pueden ser guardados en cada uno de los 15 niveles de seguridad de que dispone este sistema de archivos. Para poder acceder a cada nivel de seguridad con una clave, se añaden 15 contextos de seguridad. Cada uno de esos contextos accede a un subconjunto de todos los niveles de seguridad y esta protegido con su propia clave. En una con figuración típica, un contexto C da acceso a los niveles inferiores al nivel C (1,?..,C). El usuario puede añadir o borrar cualquier nivel de seguridad en cualquier contexto para poder crear jerarquías más complejas de niveles de seguridad.

Cuando un usuario abre un contexto de seguridad C e introduce la clave correspondiente PPc se realiza inmediatamente una función de seguridad hash (h) para producir:
 
 








Al final de la tabla de bloques de un archivo se abre una matriz de15x15 elementos de seguridad (M), en cada cual de sus entradas se guarda una palabra de 128 bits. Si el contexto de seguridad C es para proveer acceso al nivel de seguridad L, entonces contiene la llave del nivel SKL encriptada con HPc.
 
 








Los otros elementos de la matriz contienen sólo valores aleatorios. El tamaño de la matriz M esta predeterminado, como la tabla de bloques, y es independiente de los niveles de seguridad y contextos actualmente usados.

Si el bloque del disco (i) acoge un archivo oculto bajo un nivel de seguridad L, su entrada en la tabla de bloques es encriptada haciendo un XOR de la llave del nivel de seguridad y su número del bloque. Por tanto, la llave de encriptado del bloque sería:
 
 








Cada bloque se encripta por separado con el CBC (cipher block Chaining) usando un vector inicial (iv) que se encuentra en la correspondiente entrada de la tabla de bloques.

En esta versión del StegFS se ofrece la posibilidad de usar el Serpent y el RC6 para el encriptado de bloques y la arquitectura permite otros cifradores con el tamaño de bloque AES de 128 bits para ser rápidamente añadido después.

El SKL de todos los niveles de seguridad abiertos se guarda en una estructura de superbloque en la RAM. Estas claves nunca serán guardadas al disco. Los valores del PPc o HPc serán sobrescritos en la RAM cuando las claves SKL sean desencriptadas.
 
 

5.- Uso del StegFS
 
 

El sistema de archivos se prepara de la siguiente forma:

Creamos una partición en la que metemos el sistema de archivos ext2 de la siguiente manera (aunque también podemos usar una ya existente):

mke2fs /dev/blockdevice








Una vez hecho esto usaremos el comando:
 
 

mkstegfs /dev/blockdevice /path/to/btab








Así se rellenarán los bloques libres del ext2 con información aleatoria y se creará el archivo de la tabla de bloques, cuyo tamaño sólo depende del tamaño del disco.

La tabla de bloques contendrá espacio suficiente para albergar las llaves encriptadas de los niveles y los contextos de seguridad. El numero 15 esta predeterminado y no puede ser modificado por el usuario.Ahora que el sistema de archivos está listo podemos montarlo así:
 
 

mount /dev/blockdevice /mnt/mntpoint -t stegfs \ -o btab=/path/to/btab








Para crear o abrir niveles de seguridad donde guardar archivos o carpetas ocultas utilizaremos el comando:
 
 

Stegfsopen /mnt/mntpoint contextnum








donde contextnum es el número del contexto de seguridad que será abierto. Cuando hemos ejecutado este comando se abrirá un directorio /mnt/mntpoint/stegfs/1/, /mnt/mntpoint/stegfs/2/, etc? Si se realizan operaciones de escritura cuando hay alguno o ningún nivel de seguridad abierto, la herramienta rerpl se usará para actualizar todos los archivos ocultos y asegurarse de que el número de copias es el correcto. El número de copias de cada bloque de inodos y de archivos puede ser controlado usando la utilidad tunestegfs. La utilidad stegfsctrl nos permite añadir y borrar niveles de un contexto de seguridad y gracias a esto la jerarquía de niveles de seguridad puede romperse.
 
 

6.- Pruebas de ejecución
 
 

A continuación mostraremos una tabla comparativa del rendimiento usando un sistema de archivos ext2 y el StegFS usando archivos normales y archivos ocultos, todo esto usando un factor de replicación 5 para bloques de inodos y de archivos:
 
 








Vemos que la velocidad es similar para el sistema de archivos ext2 y el StegFS normal, pero si observamos el cuadro, el manejo de información en el StegFS oculto es muy inferior a los otros dos. Esto es un precio a pagar por el alto nivel de seguridad de que nos provee el programa. La razón de esto es que ha de escribir también el número de replicas de los archivos, encriptar y desencriptar y también comprobar qué bloques han sido sobrescritos.

También se ha comprobado la durabilidad de los archivos ocultos cuando se escribe en el disco y están cerrados los niveles de seguridad. Se probó creando 250 archivos ocultos de 100 kB cada uno y, una vez cerrado el nivel de seguridad, creando otros 250 archivos en el disco, esta vez visibles. Luego se desmontó el StegFS y se volvió al ext2. Este proceso se repitió 100 veces con los siguientes resultados:
 
 

7.- Conclusiones
 
 

Pues bien, como hemos podido ver, este sistema de archivos dota a nuestro sistema de un grandísimo nivel de seguridad. Al usar criptografía podemos hacer que la información deseada sea ininteligible, pero siempre nos queda que ahí hay alguna información, con lo cual un juez puede sospechar de nosotros. Este sistema de archivos utiliza la esteganografía, un método por el cual los archivos son ocultos en el disco para que nadie pueda llegar a saber que cierta información puede estar alojada en nuestro sistema. Y esto unido a los métodos criptográficos que utiliza, lo hacen un sistema de seguridad ciertamente muy potente. A parte, es podible utilizar los archivos no ocultos de nuestro sistema mientras el driver del StegFS no este instalado e incluye completamente la semántica de los sistemas de archivos bajo Unix. Pero no todo son ventajas. Hay algunos problemas que este sistema de archivos aun no cubre. Por ejemplo, podemos ver en el sistema la presencia del driver del StegFS, y por lo tanto se puede saber que puede haber algo de información, pero nunca con seguridad. Y en cualquier caso nunca pueden saber cuantos niveles de seguridad existen en el sistema, así que si nos vemos obligados a desvelar una clave, podemos dar la clave del primer nivel y nunca se podría saber de la existencia de más. Por otro lado, el manejo de los archivos ocultos es muy lento debido en parte a las tareas de desencriptación, encriptación y búsqueda de copias sobrescritas, etc? Por otro lado, este sistema no puede garantizarnos la integridad de la información oculta, ya que si llenamos el disco con información, los archivos ocultos que se muestran como espacio libre son sobrescritos. Para intentar solucionar esto ofrecen una "solución", que son las copias de los bloques, pero esto sólo nos da un poco más de margen contra la sobrescritura y siempre que no se llene el disco con información.

En definitiva, hablamos de un sistema de archivos que nos ofrece, no la garantía de la integridad de los archivos ocultos, sino mucho más la seguridad de ellos, de que nadie puede saber qué información tienes y si la tienes. Pero con el motivo de dar solución al problema de la integridad y del rendimiento, el equipo esta trabajando para intentar hallar la manera de solucionar los problemas antes expuestos. Si llegaran a solucionar gran parte de estos problemas podríamos estar tratando uno de los sistemas de seguridad más seguros hasta la fecha.
 
 

8.- Bibliografía
 
 
 
 

Para mas informacion sobre los sitemas criptograficos utilizados por este sistema de archivos consultar el siguiente documento en Post Script: