19 noviembre 2010

Herramienta StegoSense: Automatizando la reja de cardano…

Vivimos tiempos intensos... Tiempos de lobbies, Sindes y demás tropa Goofy. Tiempos de Wikileaks, Climategate, Anonymous y V de Vendetta, de disclosure projects... de informaciones "reveladoras" para todos los gustos, sabores y creencias [1][2].

Hoy, como siempre, existe información, sensible o no, que debe ser protegida de miradas indiscretas, restringiendo su uso al personal oportuno. La criptografía históricamente ha facilitado esta tarea. Adicionalmente, a sus múltiples ventajas incluye un inconveniente: su visibilidad. Las comunicaciones cifradas pueden ser fácilmente detectadas, aunque no por ello necesariamente fáciles de invertir, y en según qué escenarios esto no es interesante que ocurra. A lo largo de los siglos la esteganografía ha aportado su grano de arena para proporcionar un nivel de seguridad adicional y minimizar esta problemática. No sólo las comunicaciones no serán legibles sino que además se ocultará la propia existencia de las mismas. Existen gran multitud de técnicas y procedimientos según el escenario de comunicación y el tamaño de la información a transmitir (un breve resumen puede verse en [3]), así como herramientas de estegoanálisis (algunas gratuitas, con sus limitaciones, como StegSecret) .

Hace aproximadamente 1 año inicie una serie de investigaciones, por diversos motivos, sobre un tipo concreto de esteganografía, la esteganografía lingüística, teniendo en mente una serie de criterios.

Dado que el artículo es un "poco" extenso lo he divido en 4 partes, de forma que el lector que lo desee pueda leerse el artículo entero o directamente ver como funciona la herramienta (la última parte) y dejar para un futuro, si es de su interés, su funcionamiento interno. Las 4 partes son: a) Criterios a considerar en la esteganografía lingüística, b) la reja de Cardano, c) algoritmo Ryfle y d) mini-tutorial y ejemplos de la herramienta stegoSense.

PARTE I. Criterios a considerar en la esteganografía lingüística.

Criterios que tengo en mente cuanto trabajo este tema.

1. El texto en lenguaje natural es el "contenedor" más difundido en las comunicaciones. Es el mejor estegomedio para enmascarar y distribuir una información oculta.

2. Esta ciencia será utilizada para ocultar información de pequeño tamaño (decenas o pocas centenas de bits) consiguiendo procedimientos muy seguros (probabilidad de detección muy baja). Si la información a ocultar es grande suele ser más conveniente utilizar otros procedimientos, no necesariamente esteganográficos. Por tanto, existirán entornos donde sea interesante su uso (por ejemplo, canales altamente monitorizados) y otros en los que no.

3. Los algoritmos serán públicos (a diferencia de propuestas de esteganografía textual que manipulan textos basados en algoritmos secretos u oscuridad) y su seguridad dependerá de una clave criptográfica.

4. El estegotexto (creado o modificado) será independiente de canal. Es decir, sólo trabajo algoritmos que permitan manipular el lenguaje (modificaciones léxicas, sintácticas y semánticas), de forma, que un mismo estegotexto generado pudiera ser transmitido por diversos canales sin perder la información (impreso en una revista, intercambiado por e-mail, leído por teléfono, etc.)

PARTE II. La reja de Cardano.

Actualmente los algoritmos, que he publicado en este sentido, automatizan la ocultación de información en texto natural y permiten la posibilidad de corregir los estegotextos manualmente, generando textos "con validez humana" que no puedan ser detectados por software automatizado ni, incluso, por analistas humanos. Esto es muy interesante porque cualquier persona sin conocimientos técnicos podría crear estegotextos de gran calidad, sólo necesitaría saber leer y escribir.

En esta dirección va, por ejemplo, la herramienta Stelin, publicada entre otros, en la Rooted Con 2010. Esta herramienta permite ocultar centenas de bits en textos en lenguaje natural de tamaño medio, si bien es cierto se necesita un cierto entrenamiento en esta herramienta y la utilización de textos fuente (por ejemplos, libros de narrativa) con validez lingüística y tamaño de más de 10.000 palabras. El resultado permite generar estegotextos con validez lingüística indistinguibles no sólo por máquinas sino también por seres humanos.

Al desarrollar Stelin, por algún motivo extraño, me vino a la cabeza la posibilidad de automatizar, de alguna forma, la reja de Cardano. Este procedimiento, la rejilla de Cardano, fue desarrollado en el renacimiento por Girolamo Cardano (1501-1576) y funciona de la siguiente manera:


Cada destinatario posee un pedazo de papel o cartón con agujeros cortados en él (la verja o rejilla). Cuando esta plantilla se pone encima de un mensaje inocente, los agujeros dejan ver letras específicas del mensaje, revelando el mensaje oculto. Este procedimiento, en tanto en cuanto la plantilla se mantenga privada, presenta una elevada seguridad (¿secreto perfecto?), aunque tiene muchos inconvenientes entre los que destaca la necesidad de intercambiar una plantilla por cada comunicación o forzar que distintos textos escritos, que se usan de tapadera, tenga en las posiciones que "destaca" la plantilla la información oculta. A todo esto, hay que sumarle la baja capacidad de ocultación de este procedimiento.
La automatización de esta idea no parece sencilla en principio.


El problema que se debe resolver es cómo sincronizar las posiciones que el emisor quiere modificar con las posiciones que el receptor debe conocer para recuperar la información ocultada. Si se encuentra solución al problema se conseguirá generar estegotextos muy difíciles de detectar.

PARTE III. Algoritmo Ryfle.

Aunque el problema anterior se podría abordar de diferentes formas, decidí un camino mezclando esteganografía basada en diccionario y corrección manual (idea sacada de Stelin). Con esto diseñé un algoritmo que es el que he implementado en la herramienta StegoSense que hago pública hoy y de la que hablaré más adelante.

El algoritmo que realicé para generar estegotextos es muy simple y consiste en lo siguiente (fue publicado en el Third IEEE International Symposium on Trust, Security and Privacy for Emerging Applications, June 2010. Brandford-UK.)

1. Seleccionar uno o más textos fuentes privados, conocidos sólo por emisor y receptor. No hay ninguna limitación en la "calidad" de estos textos (a diferencia de Stelin). Además, como se entenderá al leer este artículo, este algoritmo puede ser adaptado sin problemas a diferentes idiomas simplemente seleccionado un texto privado en otra lengua, por ejemplo en inglés.

2. El texto fuente es divido en grupos (W) de palabras en función de un clave secreta compartida entre emisor y receptor. Actualmente las palabras que forman cada grupo se seleccionan pseudoaleatoriamente basado en un PRNG AES CTR-Mode (block 256 bits - key 256 bits) que depende de la clave de usuario. Para ello reutilizó una implementación de Rijndael, validada, que hice en 2003 en C.

3. La información a ocultar es cifrada mediante AES CTR Mode (block 256 bits - key 256 bits) que depende de la clave de usuario. La información se pasa a binario.

4. De cada grupo se selecciona una palabra (estego-palabra). Cada estego-palabra, oculta log2W bits, es seleccionada en función de la información binaria a ocultar. Es decir, un bloque de 8 palabras ocultaría 3 bits, uno de 16 palabras ocultaría 4 bits por estego-palabra seleccionada, etc.

5. El estegotexto resultante será un conjunto de estego-palabras consecutivas sin validez sintáctica ni coherencia global. Las estego-palabras extraídas van todas en minúscula y sin signos de puntuación. Esto permite mayor flexibilidad al emisor al poder poner mayúsculas o símbolos de puntuación donde desee. Símbolos soportados: tildes, coma y ")(:;.¿?!¡-'. Estos símbolos se pueden añadir en cualquier palabra en cualquier posición.

6. Corregir a mano el estegotexto resultante, anteponiendo una o más palabras en cada posición, hasta producir un texto con validez lingüística. Pueden añadirse una o más palabras de cualquier tipo delante de cada estego-palabra del estegotexto, con la única condición que la palabra elegida no se encuentre en el grupo de posibles palabras de donde se ha extraído esa estego-palabra. En la versión actual, para un funcionamiento adecuado, se debe utilizar las teclas de posición (adelante - atrás) o el ratón para posicionarse y la tecla retroceso para borrar caracteres. Lo más práctico es escribir libremente e ir validando el estegotexto (VALIDATE: control+L). Después de la última estego-palabra se puede añadir tantas palabras como se desee sin restricción.

7. El receptor no necesita conocer los "retoques" introducidos por el emisor, sólo el texto privado (fuente), el estegotexto recibido y la clave criptográfica. En principio, el valor "Bits Word/group" al ser reducido (3, 4, 5 o 6) no haría falta compartirlo ya que se podría probar cada uno, esto permitiría mayor libertad al emisor en la selección del mismo y por tanto facilitarle la creación de un estegotexto u otro.




PARTE IV. Mini-tutorial y ejemplos de la herramienta StegoSense

En la parte III se explica el algoritmo publicado y ahora hago pública una aplicación gráfica para utilizarlo de manera sencilla. Es una versión beta (con lo que ello implica), y aunque este algoritmo tiene sus limitaciones se puede ver fácilmente su utilidad. Su uso recomendado (si no se quiere invertir mucho tiempo en edición) es para información pequeña, cómo el intercambio de claves criptográficas, urls (URIs en general), direcciones de mail, coordenadas gps, etc.

Por ejemplo, con la herramienta podríamos enviarle a nuestra amiga Sinde en un "texto inofensivo" un enlace a una web, donde tenemos N películas (cifradas o no), y que por algún motivo no queremos que nadie detecte que en realidad Sinde intercambia películas de vaqueros amorosos... Existen, pues, muchos usos legítimos y no legítimos de esta herramienta/tecnología, cada cual que piense los suyos... yo prefiero no dar ideas "raras".

En fin, la aplicación gráfica es muy sencilla de utilizar. Destaco algún punto:

1. File: Open Source (abrir fichero fuente) y Open stegoText (abrir un estegotexto recibido).

2. Stegotexto: Generate (generar estegotexto, necesita Open Source & Msg&Password), Unhide (recupera la información oculta, necesita Open Source & Password).

3. StegoTexto -> Validate

La utilidad principal de esta herramienta gráfica (StegoSense) es que permite mayor comodidad al emisor al redactar los estegotextos. Puedes desplazarte por el estego-texto con el teclado y ver el conjunto de palabras que no puedes añadir delante de cada estego-palabra. El funcionamiento más práctico consiste en dada una serie de estego-palabras, escribir libremente el estegotexto y luego darle a "Validate". Si hemos metido alguna palabra no válida la herramienta indicará, por orden de aparición, la primera en la que la hemos "cagado". De esta forma es más rápido construir estegotextos por este procedimiento.

4. Bits Word/group

El algoritmo construye bloques de palabras. Lógicamente si el bloque es más grande se oculta más información por estego-palabra seleccionada, pero es más difícil elegir palabras delante de ella. Por el contrario, menos palabras por bloque implican ocultar menos información, pero es más fácil hacer un estegotexto manualmente. Como se indica en el paper publicado (en la web de la herramienta) esto es un valor de compromiso. Los valores más adecuados son W=3 (8 palabras por grupo) o W=4 (16 palabras por grupo). En el software doy soporte hasta W=6 (64 palabras por grupo).

5. Alfabeto

Para generar estegotextos más pequeños sólo doy soporte a un alfabeto concreto (optimizo relación carácter-bits a ocultar), en el cuál las mayúsculas "ocupan más" (se generaría un código de mayúscula y el carácter en minúscula correspondiente).
El alfabeto soportado es: abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789:;=@/?%&|!_"'<>()*.[]space +-

Si has llegado hasta aquí recuerdame que te debo una caña...

Ahora los ejemplos:

[Texto fuente]: Descargado de internet... (fuente.txt)

[EJEMPLO 1]

Clave: faletecome
Msg: spy@gmail.com
Bloque: 6 (15 stego-words generated)
Generado:

imagenes de aqui manos este lleno tus específicamente noche amo utilidades que envuelto montes de


StegoTexto Posible (stegotexto1):

Te envío imágenes de aquí, mi nuevo piso. Hoy tengo las manos destrozadas de limpiar este nidito lleno de posibilidades. Tus deseos, específicamente tus perversiones, esta noche serán satisfechos (te amo). Ya le sacaremos utilidades a todos estos rincones... que ganas. Te espero envuelto con sábanas construyendo montes de lujuria.

[EJEMPLO 2]

Clave: awikileakslegustanlosrusos
Msg: 5ps!7j4?
Bloque:4
Generado: (14 stego-words generated)

vivos estrechas mil cuando sierra murallas llama julio dos sobre el o sea racimos

StegoTexto posible (stegotexto2):

Todavía hay vivos intelectuales de estrechas miras. Mil veces repetiré, cuando sea necesario, que ni una sierra puede rajar esas mentes tan cerradas (murallas primitivas) ni una llama quemar sus prejuicios. En Julio quería haber escrito dos artículos sobre este asunto: a) el nuevo esnobismo o elitismo rancio y b) el corporativismo chusquero. Sea como fuere, bombas de racimos lanzaba yo a unos cuantos. A ver si saco tiempo...

[EJEMPLO 3]

http://bit.ly/d0bLRY

Clave: mandanga
Msg: d0bLRY
Bloque: 6
Generado (11 stegowords)

hacha verdad hacha padre mano es camino da ha medio claras

StegoTexto posible (stegotexto3):

Hacha afilada es mi verdad, hacha incisiva. No siempre fue así. Mi padre tiempo atrás (apretó mi mano con fuerza para aconsejarme) me recomendó medir mis palabras, no pude hacerle caso. Es mi camino no tengo dudas: da o recibe. Ha resurgido mi alma revolucionaria, medio dormida, ahora tengo claras mis ideas.

Conclusiones

Todavía quedan pendientes unas cuantas mejoras y corregir algún asunto. No obstante, se puede hacer uno una idea de la utilidad, ventajas y limitaciones de una propuesta "peculiar" de este tipo.

Para invertir poco tiempo en el maquillaje del estegotexto creado es aconsejable suprimir de la información a ocultar todos aquellos datos fácilmente deducibles, por ejemplo, de una url el http://.
A día de hoy no se conocen ataques a este algoritmo, en tanto en cuanto la clave criptográfica se mantenga en privado y adicionalmente no se pueda relacionar un estegotexto con un texto fuente concreto (agradezco sugerencias).

A veces, ideas sencillas... vencen a tecnologías complejas y caras de monitorización :)

Hasta la próxima tool...

Alfonso Muñoz  
http://stegosense.sourceforge.net

[1] http://www.disclosureproject.org
[2] http://video.google.com/googleplayer.swf?docid=-2425164651672376306&hl=es&fs=true"
[3] http://www.slideshare.net/chemai64/asegrit-iv-esteganografa-en-la-web-presentation

18 comments :

Jandro dijo...

Muy buen post alfonso. Felicidades

Anónimo dijo...

Me debes una caña, me lo he leido entero... ;P

Salu2

Daryl dijo...

Muy bueno. Pero antes de usarlo habrá que fabricarse la pantalla de que eres escritor o poeta o que te gustan nuevas formas expresivas pues dado el nivel que se ve en numerosos blog frases como "mentes tan cerradas (murallas primitivas)" ó "Ha resurgido mi alma revolucionaria, medio dormida," quedan tan literáreas que, en muchos contextos, serian chocantes o darian el cante de que hay algo raro.

Anónimo dijo...

Funciona perfectamente, eres un crack.

Salu2

Anónimo dijo...

Gracias por las palabras.
@Daryl: El estegotexto final estará limitado por la capacidad editora del emisor y por las estego-palabras generadas. Ese texto fue lo primero que se me pasó por la cabeza... :)

Un abrazo
Alfonso Muñoz

Anónimo dijo...

Felicidades el post muy bueno !!!

Brixton_Cat dijo...

Clap, clap, clap....

Sin palabras ;)

hecky dijo...

Felicidades, Gran Gran Trabajo!!! Todo un Maestro de la esteganografia Aplicada y un Idolo.

Saludos ;)

Juan Escobar dijo...

Hola Alfonso, muchas gracias por la herramienta, se ve que esta muy buena. Yo la he descargado y la estoy tratando de probar pero he tenido problemas. Al generar el estegotexto algunas de las palabras que genera tienen tildes y por lo tanto quedan irreconocibles. He probado quitandole las tildes pero al validarlo me da error. El texto que he elegido como fuente es el de don quijote de la mancha. ¿Que debo hacer?


Gracias.

http://img816.imageshack.us/img816/1561/stegosense.png

Anónimo dijo...

@Juan escobar:
Estimado Juan, lo que indicas no debería suceder puesto que las tildes (y otras cosas) se filtran. Para no meter mucho ruido en los comentarios, enviame los ejemplos detallados al correo y lo vemos. Si es algo que no he considerado en la versión beta se corrige y se sube a la web.
Un saludo
Alfonso

Anónimo dijo...

@Juan escobar: Debería funcionarte, la tilde se filtra. Si quieres enviame los ejemplos concretos por mail y lo vamos hablando.
Un saludo
Alfonso

Anónimo dijo...

Tengo la impresión de que Juan Escobar lo ha corrido en Linux utilizando el fichero fuente.txt.

El problema es la codificación del fichero source, de hecho, si se abre el fichero con cualquier editor de texto (ej. vi), se puede observar que los acentos, eñes y otros caracteres especiales aparecen como caracteres no imprimibles.

Juan Escobar dijo...

Hola, perdona la demora en responder. Tienes razón lo he corrido en Debían Lenny y utilizando varios ficheros de texto. También he abierto los ficheros de texto con vim y se pueden ver las letras con acentos perfectamente. Entonces ya te envío al correo lo que hago.

Gracias por responder

Anónimo dijo...

¡NO FUNCIONA!. Usando un texto fuente de 10 palabras, un password de 10 caracteres y un mensaje a esconde de tres palabras todo en español, no es capaz de generar el stegotexto posible...

Anónimo dijo...

Revisando el algoritmo implementado en StegoSense (desde Junio no he pensado más en él) me he dado cuenta que es posible minimizar el número de palabras presentes en el estegotexto final y conseguir que el número de palabras por grupo sea pequeño (es decir que el tiempo de edición sea más rápido) realizando unos cambios mínimos al algoritmo.

Es decir, es posible conseguir textos más pequeños y más faciles de editar. Por ejemplo, el tamaño de textos como si "Bits Word/group" fuera igual a 6 pero con la facilidad de edición como si "Bits Word/group" fuera igual a 3.

Me he puesto a ello, en unos días liberaré un versión beta 0.2.

Si resulta interesante al blog y a los lectores se puede publicar una segunda parte...

Un saludo
Alfonso

Anónimo dijo...

@ANONIMO (NO FUNCIONA):
Si quieres la explicación detallada escribeme y te lo cuento despacio. Pero basicamente el texto fuente tiene que tener un número de palabras suficientes para generar el estegotexto. Si por ejemplo, la información a ocultar son todo minúsculas y Bits Word/group=3, necesitas bloques de 8 palabras distintas para ocultar en cada palabra extraida de ese bloque 3 bits.
Conclusión: SI Funciona, usa textos fuentes con un número adecuado de palabras.
Si el texto fuente es de centenas de palabras no tendras que preocuparte de este asunto para ocultar mensaje breves (mails, coordenadas, etc).

Un saludo
Alfonso

Anonymous dijo...

@Juan escobar:
Estimado Juan, lo que indicas no debería suceder puesto que las tildes (y otras cosas) se filtran. Para no meter mucho ruido en los comentarios, enviame los ejemplos detallados al correo y lo vemos. Si es algo que no he considerado en la versión beta se corrige y se sube a la web.
Un saludo
Alfonso

Daryl dijo...

Muy bueno. Pero antes de usarlo habrá que fabricarse la pantalla de que eres escritor o poeta o que te gustan nuevas formas expresivas pues dado el nivel que se ve en numerosos blog frases como "mentes tan cerradas (murallas primitivas)" ó "Ha resurgido mi alma revolucionaria, medio dormida," quedan tan literáreas que, en muchos contextos, serian chocantes o darian el cante de que hay algo raro.