Mostrando entradas con la etiqueta PGP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PGP. Mostrar todas las entradas

martes, noviembre 07, 2023

Serverless & Bullet-Proof Web Sites (1 de 2)

En este artículo me gustaría contaros una pequeña PoC que hicimos en el equipo de Ideas Locas que teníamos guardada para algún evento de Web3, pero que como tengo ganas de contárosla, he decidido hacerlo desde hoy. No es un estudio completo, ni mucho menos, porque el escenario es enorme, pero se basa en un idea muy sencilla, que es hacer Serverless & Bullet-Proof WebSites, capaces de soportar el intento de bloqueo o censura de cualquier entidad.

Figura 1: Serverless & Bullet-Proof Web Sites (1 de 2)

Esto no es algo nuevo, y la Serverless Web lleva tiempo estudiándose, y trabajándose con diferentes arquitecturas, todas ellas totalmente distribuidas.

Dust-RSS

Uno de esos ejemplos fue un proyecto personal del equipo de Ideas Locas, en aquel entonces en Informática 64, en aquel entonces del año 2010, y que presentamos en la RootedCON de 2011 y se llamó Dust-RSS.


La idea era muy sencilla, evitar la censura de los servidores RSS de los blogs para permitir que cualquiera que tuviera algo que comunicar lo pudiera hacer siempre, y para eso diseñamos una arquitectura muy sencilla, basado en claves PGP y una red P2P para hacer la distribución. Esto hacía que no hubiera un único punto de fallo en el servidor web, ni en el DNS, y que con tener la clave pública PGP del publicador se pudiera buscar por redes P2P las publicaciones. 
De esta forma, el publicador lo único que debía conservar era su clave PGP privada para poder poner en la red P2P una nueva publicación. La arquitectura funcionaba, pero se quedó en una PoC que presentamos en DefCON 2012, y que se quedó como un bonito experimento.

OSIRIS SPS

Uno de las arquitecturas que buscaba solucionar estos problemas de censura de servidores Web se trataba de OSIRIS SPS (Serverless Portal System) y su Gateway ISIS, para poder publicar servidores Web que no dependieran de un único punto de fallo. Para ello, la solución era similar a tener a páginas web cacheadas y compartidas por una red P2P.

Figura 4: Foro de Anime publicado en Osiris SPS visible vía Isis Gateway

Las páginas web de los portales que se ven a través de esas URLs realmente no están en ningún servidor web concreto, sino distribuidos por toda la red P2P de Osiris SPS, lo que impediría un bloqueo o censura del sistema. Es perfecto para crear foros y portales de denuncia social que no puedan ser quitados de Internet si no quieren sus usuarios.

DeepWeb: TOR, I2P, FeeNet, Hyperboria, CJDNS

Todas estas soluciones no accesibles a través de los navegadores de "superficie", son consideradas redes de la DeepWeb, no solo porque no son accesibles con las herramientas más comunes de Internet, sino porque además cuentan con herramientas y protecciones contra el control, ya sea cifrados especiales o como hemos visto, para evitar el bloqueo de sus contenidos, como en el caso de OSIRIS SPS o el sistema DUST RSS que utiliza mecanismos P2P para ello.  q

Figura 5: Libro de Deep Web: TOR, FeeNEt & I2P.  Privacidad y Anonimato 
de Daniel Echevarry a.k.a. "adastra" en 0xWord.

Por supuesto, muchas de las funciones de seguridad que se buscan en estas redes, están en las más conocidas de la DeepWeb como son  TOR, FreeNET e I2P, donde el cifrado de las comunicaciones es una de las claves en todas ellas.

Pero la búsqueda de arquitecturas distribuidas y seguras ea algo que se ha estudiado mucho, como el caso de CJDNS y su red Hyperboria con conexiones cifradas y certificadas sobre IPv6, GNUNet, Lantern, YaCy para conseguir que no puedan ser accesibles los contenidos por nadie.

Malware en BlockChain

Por supuesto, pensar en arquitecturas Serverless y Distribuidas, es hablar del core de las cadenas de bloques de BlockChain, y utilizar las capacidades que tiene para poder almacenar datos de forma permanente y protegida con la distribución por diseño que tiene esta tecnología.

Figura 7: PoC de C&C con OP_Code en cadena de BitCoin
propuesta por Yaiza Rubio y Felix Brezo en EuskalHack 2017


En la EuskalHack del 2017, Felix Brezo y Yaiza Rubio hacían una demostración de cómo se podrían almacenar comandos de un C&C de una Botnet de malware en el campo OP_CODE la cadena de bloques de BitCoin.
Esto, al precio que está hoy el BitCoin parece un poco caro, pero esta idea de usar la cadena de OP_CODE para hacer servicios no es nueva, y algunos proyectos lo han utilizado en el pasado, aunque co la proliferación de cadenas de bloques a precios mucho más más económicos, hace que ya no sea necesario centrarse en ese campo.
Y como muestra de esto lo hemos tenido con el caso del malware de Etherhiding, donde el binario del malware se han escondido dentro de la cadena de Binance Smart Chain, y ha utilizado SmartContracts para actualizarse.

Redes Sociales Descentralizadas

Por supuesto, la explosión de las cadenas de Blockchain, y otras arquitecturas distribuidas, hayan ido apareciendo en todos los verticales tecnológicos nuevos servicios que pretenden ser más resistentes contra los ataques a servicios descentralizados, como son las Redes Sociales.

Ahí, propuestas como Mastodom, Diaspora, Matrix, Block Square, que son sólo una pequeña muestra, han ido apareciendo por todos los rincones de Internet, y se han convertido en parte de la transformación y disrupción que se está viviendo en este mundo de las redes sociales.

Pero la descentralización de todos los servicios digitales que se están construyendo hoy en día. Algunos que se han hecho piezas fundamentales en las arquitecturas Web3, como el almacenamiento IPFS (Inter Planetary File System) del que ya hablamos.

Y esto nos lleva a nuestra PoC, que es cómo aplicar todas las arquitecturas al servicio fundamental de la web, y que como veremos es rápido y sencillo, pero será en la segunda parte de este artículo.

¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


miércoles, febrero 09, 2022

Blockchain & Smart Contrats: El Internet descentralizado y el almacenamiento Off-Chain con IPFS

Durante la serie de Smart Contracts y Blockchain hemos visto diferentes maneras de descentralizar parte de la lógica de una aplicación, pero los Smart Contracts y la tecnología Blockchain no son la única manera de hacerlo. En sus inicios Internet podría haberse considerado descentralizado puesto que solo corría en algunos ordenadores distribuidos por unos pocos garajes y salas de universidades del mundo. Con el paso de los años y la creación de centros de datos y la llegada del “Cloud Computing” Internet se ha ido centralizando hasta hoy día en el que un par de empresas prácticamente poseen Internet.

Figura 1: Blockchain & Smart Contrats: El Internet descentralizado
y el almacenamiento Off-Chain con IPFS

Con el resurgimiento de la tecnología Blockchain en 2013 volvió la idea de descentralizar Internet, para tener así una red mundial resistente a la censura en el que los dueños de los datos tuvieran el control de verdad sobre ellos. Y desde entonces se han dado grandes avances como el surgimiento de redes sociales descentralizadas y Open Source, protocolos para la descentralización de internet como el proyecto DUST-RSS para usar PGP e P2P para tener blog serverless sin censura, los portales web serverless distribuidos con Osiris SPS o el archi-famoso hoy en en día IPFS que vamos a ver en esta serie

Redes sociales descentralizadas

Está claro que el paradigma de hoy día que siguen la mayoría de redes sociales es el de la WEB2.0 un modelo en el que rige la centralización y el comercio de los datos del usuario, en el que esté casi no tiene ningún control sobre cómo se maneja su propia información. En la actualidad tenemos el paradigma de WEB3 en el que gracias a la tecnología Blockchain y a los Smart Contracts pueden crearse “fácilmente” plataformas descentralizadas. Sin embargo no ha sido del todo necesaria esta tecnología para crear redes sociales de este tipo véase el ejemplo de las siguientes, de las cuales algunas incluso surgieron antes que los smart contracts.

● Mastodon: Esta red social es totalmente Open Source además claro de ser descentralizada dada la arquitectura que tiene. La estructura que sigue es muy parecida a la de nodos entrelazados además de que implementa el protocolo Activity Pub, un protocolo open source para la descentralización de servicios.

En esta red cada nodo puede ser alojado en un servidor normal o en tu mismo pc y da igual al nodo que te conectes, ya sea un gran servidor o tu propio ordenador estarás conectado con todos los demás.

● Diaspora: Surgió alrededor de agosto de 2012, aunque sus creadores empezaron con ello en 2010. Sus tres ideas claves como medio de conexión social son: libertad, descentralización y privacidad(donde tú eres el dueño de tus datos), asimismo también es Open Source (repo). 

 
Para lograr su descentralización siguen una arquitectura similar a la de Mastodon, solo que en este caso en vez de usar nodos usan pods, que son servidores auto alojados a la hora de ejecutar la app.

● Matrix: Fue creada en 2019 y se definen a sí mismos de la siguiente manera “Matrix is an open source project that publishes the Matrix open standard for secure, decentralised, real-time communication.”

Figura 4: Representación gráfica del funcionamiento de Matrix

Proveen de un gran SDK para desarrolladores con el fin de que estos creen diferentes apps y web que funcionen sobre su infraestructura, la cual es descentralizada también y que funciona de manera similar a los nodos de la blockchain en los que se va replicando toda la información en tiempo real.

● Block Square: Hace unas semanas Jack Dorsey dejó su puesto de CEO de Twitter por continuar su proyecto personal, en su momento se llamaba Square y tenía como objetivo ser una red social descentralizada que ofreciera servicios SaaS.

Figura 5: Logo de las empresas Square y Block

Pero ahora con su salida de Twitter ha surgido Block que será un conglomerado tecnológico que aúne Square, Cash app, Spira y Afterparty con su reciente adquisición para poder operar transacciones en Europa.

Almacenamiento Descentralizado

Si has leído alguno de mis anteriores artículos sobre Smart Contracts sabrás que a la hora de crear uno es muy importante optimizar al máximo posible el almacenamiento que va a utilizar puesto que existen unos límites que no son rebasables y todo aquello que se almacena en la Blockchain tiene un coste y no suele ser bajo.
Teniendo esto vemos que es prácticamente imposible montar una red social completamente descentralizada en la que todos los datos se guarden en la propia Blockchain y si aun así fuera posible a día de hoy los costes serían inasumibles.

Figura 6: Entender e investigar BlockChain & BitCoin
de Felix Brezo y Yaiza Rubio en 0xWord

Por ello existen soluciones Off-Chain (fuera de la propia cadena de Blockchain) que se encargan de almacenar datos de manera descentralizada asegurándonos que los archivos subidos son inmutables. Permitiéndonos así delegar parte del almacenamiento a otros servicios que no sean la Blockchain sin tener que romper los principios de la descentralización en nuestra aplicación.

IPFS (Inter Planetary File System)

Un buen ejemplo de almacenamiento Off-Chain es IPFS o "Inter Planetary File System", un sistema que permite guardar archivos en su red descentralizada para que estos estén siempre accesibles. En el sitio web oficial se definen como:

“A peer-to-peer hypermedia protocol designed to preserve and grow humanity's knowledge by making the web upgradeable, resilient, and more open.”

A un alto nivel cuando se sube un archivo al sistema este separa tu archivo en pedazos más pequeños y a cada uno le asigna un identificador único después a cada uno lo envía a diferentes nodos de la red que se encargaran de almacenarlos.


Cuando se requiera un archivo del sistema este pedirá a los diferentes nodos que envíen las diferentes partes que almacenan con el identificador único que antes nos dio. Además cuando un nodo descarga u observa un fichero al completo lo copia y lo cachea para que así próximas veces el archivo esté disponible más rápidamente. Luego cuantas más veces sea accedido un archivo más rápidamente estará disponible desde los diferentes nodos de la red, con lo que se crea una especie de servicio CDN (Content Delivery Network) en el que los archivos más “populares” son aquellos serán más rápidamente accesibles.

Figura 8: Estructura de almacenamiento

Los archivos una vez subidos a la red son inmutables y por lo tanto resistentes a la censura y al cambio. Y lo más interesante aún es que para subir un archivo a la red simplemente hay que correr su programa en el ordenador o utilizar algún servicio como Infura que nos cobrará 0.2 dólares/GB. Estas son unas sumas ridículas si la comparamos con la cifra de 76.000 dólares/GB que cobra Ethereum a día de hoy.

Figura 9: El almacenamiento distribuido de IPFS

Por supuesto, esta es una explicación del funcionamiento de IPFS hecha de una manera muy abstracta y a alto nivel, para aquellos que queráis entender más en profundidad cómo funciona el sistema os dejo aquí el enlace del whitepaper original de IPFS. Hoy día cada vez son más los protocolos y redes como IPFS que facilitan la descentralización de las aplicaciones y sus datos pero aún falta mucho camino y tecnologías para que internet pueda ser descentralizado pero quién sabe qué nos deparará el futuro ;)


Si tenéis cualquier duda con algo de estos artículos sobre el mundo de la Web3 estaré encantado de responderos tanto en mi perfil de MyPublicInbox como en mi cuenta de Twitter (aparece en mi perfil de MyPublicInbox). Nos vemos en los siguientes artículos.

Autor: Chema Garabito. Desarrollador Full-Stack. Ideas Locas Telefónica CDO.

lunes, septiembre 23, 2019

El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 2 de 4)

Como hemos visto en la parte anterior de este artículo, ya habíamos solucionado los problemas de usabilidad e interconexión entre los diferentes ecosistemas de usuarios, para que todos ellos pudieran enviar y recibir correos utilizando todo tipo de clientes de escritorio, web, móviles, etcétera a usuarios que se encontraran en cualquier otro destino. Se había conseguido una infraestructura global e interconectada, algo que desde luego no han fomentado las redes sociales en versiones posteriores y de lo que hablaremos un poco más adelante.

Figura 4: El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 2 de 4)a

Con la construcción de esta infraestructura global interoperable y compatible para la comunicación, aparecieron los primeros problemas de seguridad, que tenían que ver más con las comunicaciones sobre Internet, un medio que se definió de forma insegura sin un modelo de amenazas claro desde el principio, lo que nos llevó a aplicar las primeras soluciones de cifrado y firma digital para garantizar la integridad y confiabilidad de la información que sobre el e-mail se envía.

Para el cifrado y la firma digital de los correos electrónicos aplicamos túneles SSL a los protocolos de red, y para el cifrado y la firma digital de los mensajes se puede utilizar a día de hoy S/MIME (certificados digitales para e-mail) o PGP (Pretty Good Privacy), que permiten firmar y cifrar extremo a extremo - sin contar con que los servidores de correo electrónico aplican una capa de seguridad o no -. Los clientes de correo electrónico, por su parte, avisan a los usuarios del nivel de cifrado y privacidad utilizado en cada uno de los mensajes. Pero no es suficiente ni mucho menos para todas las amenazas que fueron apareciendo.

Más soluciones de seguridad para saber de dónde viene un correo:
Reverse MX Lookup, SPF, SenderID, DKIM & DMARC

Con el escenario de envío masivo de mensajes no solicitados a direcciones de correo electrónico comenzamos a poner un montón de soluciones para ir tapando la sangría de problemas que supone para una persona y una organización – no olvidemos que el 90% de los APTs de seguridad han provenido por un correo electrónico en un ataque de spear phihing enviado a una persona de la empresa - que su buzón de correo electrónico esté abierto y disponible para cualquiera que conozca la dirección.

En esta primera remesa de soluciones vamos a intentar centrarnos en el problema de la suplantación del remitente o e-mail Spoofing, que da lugar a los ataques de Phishing y Spear Phishing. Por supuesto, la firma digital S/MIME y PGP son lo ideal, pero como hemos dicho repetidas veces, no es muy popular en el mundo global.

Reverse MX Lookup

Para evitar que suplantaran las direcciones de correo electrónico de nuestra organización, es decir, que nadie pudiera enviar mensajes de correo en nuestro nombre como se hace en los ataques de phishing, comenzamos a indicar cuáles eran los servidores de correo electrónico que pueden enviar mensajes con un remitente de nuestro dominio. La primera solución fue sencilla, pero inútil. Como al principio el servidor de correo entrante - donde están los buzones y se implementan POP3 - era el mismo que por el que salían los correos electrónicos - donde se implementa SMTP - algunos servidores de correo comenzaron a aplicar el filtro de Reverse MX Lookup.

Para saber dónde está el servidor de correo entrante de una organización, en el servidor DNS de esa organización se crea un registro especial llamado MX (Mail eXchanger) que apunta a la dirección IP o hostname del servicio que recibe el correo electrónico de ese dominio. Lo que hacían algunos servicios de correo electrónico entrante es rechazar cualquier correo electrónico que viniera de @otrodominio.com si el servidor que entregaba ese mensaje no tenía la dirección que tenía alguno de los registros MX del dominio otrodominio.com.

Como os podéis imaginar, cuando los servidores de correo saliente se separaron físicamente de los servidores de correo electrónico entrante, este filtro dejó de ser útil, ya que nunca coincidían las direcciones IP de los servidores que entregaban los mensajes con los registros MX. Por eso, hubo que crear otro registro. El registro SPF, donde se da la lista de cuáles son los servidores autorizados desde nuestra organización para entregar correos electrónicos que tengan como remitente uno de nuestros usuarios.

SPF (Sender Policy Framerwork)

Creando los famosos registros SPF (Sender Policy Framework) - también conocido como SPFv1 - se identifican los servidores de correo saliente que usa esa organización y qué debería hacer el servidor de correo entrante de un tercero si recibe un mensaje de este dominio que no viene de esos servidores identificados en SPF. A priori, suena como una medida útil, pero tiene muchos "peros" a la hora de su implementación y uso.

Figura 5: Registro SPF de Gmail.com.

Por desgracia, como las empresas tienen cedidos "alias" de correo de sus dominios a campañas de de marketing que se envían desde servidores externos a la organización o que no son controlados por ellos, la política de seguridad suele ser “Softfail” que se identifica con un "~". Para que os hagáis una idea, cuando usamos SPF lo que hacemos es irnos al DNS de nuestra empresa y decir algo como:
"Estos son los servidores que pueden enviar correo de @miempresa.com o @mibanco.com. Si te llega un correo de alguien que dice que es de @mibanco.com debes aplicar esta política."
La política más férrea debería ser “Hardfail” (-), o lo que es lo mismo, “tíralo y no lo entregues al destinatario, que es falso”, pero por desgracia sucede lo que he comentado antes, y las políticas son “Softfail” o lo que es lo mismo:
 “Míralo bien y ponlo un poco en alerta, pero no estoy seguro de que no sea mío”.
La cosa se complica a la hora de detectar si un registro realmente viene de una organización o no, yo que hay muchas variantes. Muchas personas tienen delegada la gestión de su buzón de correos a terceros, por lo que hay casuísticas en las que una persona manda un mensaje en nombre de otra.

SenderID o SPFv2 (antes conocido como CallerID)

Así, en un e-mail tenemos los campos from, pero también sender y también resent-from y resent-sender. y es ahí donde apareció el estándar SenderID, empujado por Microsoft, y conocido como SPFv2. Su idea es garantizar que el remitente de un correo viene realmente de la organización que tiene el servidor de correo electrónico que lo entrega.

Así que, determinar si un correo electrónico viene o no de una organización realmente es complejo. SenderID intentó centrarse en identificar esa casuística del emisor, pero no consiguió ser un estándar de facto, y su aplicación fue residual en el mundo de Internet, así que encontrar registros SPFv2 con políticas Hardfail fue como localizar un unicornio o un mirlo blanco.

De hecho, al final, se utilizan otras cabeceras como Return-Path y X-Return-Path (las cabeceras X- no son parte del estándar oficial y son introducidas por servidores de correo electrónico para dejar información extra que consideran útil hasta que son estandarizadas... o no.)

DKIM (Domain Keys Identified Mail)

Intentar determinar que un mensaje no es legítimo cuando la situación es tan completo hizo que SPF no fuera el único estándar que salió para evitar la suplantación de los remitentes en los mensajes de correo. Y así nació DKIM, con una aproximación distinta, tratando de decir algo como:
"No sé si este correo electrónico que viene de un servidor que no conozco y un resent-from o resent-sender extraño es un correo electrónico legítimo de esta organización o no, pero este otro que viene firmado por uno de mis servidores de correo saliente sí que es mío y puedes estar más que seguro de que su contenido es legítimo."
Como veis, la idea de DKIM (Domain Key Indentified Mail) es que cada correo electrónico que ha salido de un servidor autorizado de la organización, va firmado por una clave privada que tiene configurado el servidor de correo saliente y cuyo par de clave pública está accesible para todo el mundo en el servidor DNS de la organización y se puede consultar.

Figura 6: Clave DKIM usada por un servidor de yahoo.com

Es decir, recibo un correo de paco@yahoo.com y en el texto del mensaje aparece una cabecera DKIM con un HASH, que se supone que ha generado el servidor de correo saliente de Yahoo.com que ha entregado el correo. Así que se mira qué servidor ha entregado el correo, nos vamos al servidor DNS de Yahoo.com, pedimos la clave pública DKIM de ese servidor y comprobamos que el hash que nos han entregado es correcto.

Figura 7: Correo de Ebay firmado correctamente por DKIM

Como veis, la aproximación es diferente, mientras que con Reverse MX Lookup, SPF o SenderID se trata de eliminar lo que no venga entregado desde el dominio correcto, con DKIM se trata de indicar que, si el correo ha llegado desde la IP correcta, el usuario lo sepa con un icono especial, tal y como podéis ver en esta captura con correos de Ebay tiempo atrás. Pero como la mayoría no lo usa, pues otro intento fallido para diferenciar los correos legítimos de los no legítimos.

Como veis, el uso de Reverse MX Lookup, SPF, SenderID y DKIM hace que haya mucha información en el cuerpo de un mensaje para analizar un correo electrónico. Esta información no es concluyente ninguna por sí misma, ya que los casos son muchísimos, y es lo que hizo que los clientes de correo electrónico no se atrevieran a marcar definitivamente un mensaje como malo o como bueno.

El Proyecto "Apolo"

Para poder dar más información al usuario, nosotros creamos en Informática 64, un plugin para el navegador que se leía el cuerpo de los mensajes en el cliente web de Gmail y Hotmail, buscaba la información SPF, DKIM, SenderID, las direcciones IP en los registros MX y hacía las comprobaciones desde el propio navegador, y luego mostraba información de ayuda al usuario sobre los mensajes de correo electrónico que estaban en su bandeja de entrada. Fue un proyecto de investigación más que una verdadera herramienta, pero lo llamamos el Proyecto Apolo.

Figura 8: Información del proyecto Apolo

Si el registro SPF era correcto en el mensaje, mostramos un icono verde. Si no cumple DKIM, ni Sender ID, ni SPF, ni MX Reverse Lookup, lo poníamos en alerta roja. Una prueba para dar más información a los usuarios avanzados.

DMARC (Domain-based, Message Authentication, Reporting & Conformance)

Al final, lo que nosotros hicimos en el Proyecto Apolo tenía todo el sentido. Había que hacer algo que mezclara todo, y así, tiempo después, nació DMARC. El funcionamiento de este protocolo es el que se ve en la figura siguiente. En él se puede ver en la fila del medio del gráfico que, cuando llega el mensaje al destinatario, el servidor valida la información DKIM, valida la información SPF y después, con estas dos comprobaciones previas, valida la información DMARC para aplicar una de las políticas que se pueden ver en la fila inferior.

Figura 9: Flujo de funcionamiento de DMARC

Por último, si un mensaje de correo electrónico cumple todas las validaciones correctamente, es decir, viene firmado por DKIM correctamente con una clave de firma que está en el DNS de la organización y pasa la comprobación SPF al ser enviado desde una de las direcciones IP marcadas en el registro SPF como una de las autorizadas, entonces el proveedor podrá tener las máximas garantías de legitimidad del mensaje posibles - que aún así siempre inferiores a que el mensaje venga firmado digitalmente con una clave de remitente -, para lo que vamos a necesitar alguna tecnología extra.

PCL (Phishing Confidence Level)

Al final, ni con DMARC se garantiza que un mensaje no sea malicioso. Existen casos concretos en los que es posible pasar DMARC o no hay información suficiente para tomar una decisión firme. En algunos mensajes habrá información de Return-Path o X-Return-Path útil. En otros habrá información de direcciones IP que podremos consultar en bases de datos de salud que nos dirán si son de hosters que nunca hacen ataques o de otros con "mala reputación". Además, si miramos el cuerpo del mensaje podremos ver si tienen textos utilizados normalmente en ataques de phishing o no, etcétera.

Figura 10: Configuración de umbrales PCL en Microsoft Outlook

Es decir, que si independientemente de los estándares que intentan garantizar que un mensaje viene o no viene de un determinado dominio, podemos aplicar técnicas avanzada de Machine Learning a los mensajes que utilicen toda la información en el mensaje disposnible, y todo el conocimiento histórico que tengamos de nuestro correo electrónico para generar un índice, que llamamos PCL (Phishing Confidence Level) y que generar mi servidor de correo para clasificar el mensaje en función del número que salga.

Así, creamos unos umbrales para decidir qué mensajes entran en la carpeta de entrada, cuáles entran en ella pero con funcionalidad limitada - carga de imágenes, alertas mostradas y deshabilitación de funciones -, cuáles van a la carpeta de Spam y cuáles no se entregan al buzón.

Es un trabajo avanzado e ímprobo, y muchas veces tiene errores, pero es la solución que aglutina todos los intentos anteriores existentes para sacar el máximo de la información disponible. Además, para poder tener la información actualizada y el PCL vaya ajustándose, es necesario contar con la colaboración de los usuarios, que deberán ir reportando aquellos mensajes sospechosos. Pero esto es solo para los ataques de Phishing.

Y aún así no son suficientes y se intentan cosas nuevas.

Aún nos queda el SPAM por donde vienen la mayoría de los problemas de malware, robo de tiempo de las personas para convertir el e-mail en improductivo y molesto para las personas. Y mucho peor, los problemas de identidad asociados a las direcciones de correo electrónico, así que nos queda mucho por hablar todavía de la muerte y resurrección del e-mail.

Como os podéis imaginar, a pesar de todas estas tecnologías, el correo electrónico sigue siendo un caos. Al final un mensaje puede entrar en el buzón de entrada de un destinatario o no dependiendo de la configuración de estas tecnologías en su servidor de correo, lo que permite que un mensaje de Spam o un Phishing puedan entrar o no dependiendo de la configuración que tengas.

Nos quedan muchas cosas, y lo iremos viendo en las partes siguientes de este artículo. Espero que estéis disfrutando la lectura tanto como yo la escritura.

Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)

********************************************************************************************************
- El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 1 de 4)
- El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 2 de 4)
- El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 3 de 4)
- El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 4 de 4)
********************************************************************************************************

domingo, septiembre 22, 2019

El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 1 de 4)

El correo electrónico, o e-mail, es un caos maravilloso. Esa es una de las frases que solía utilizar yo cuando hablaba de cómo funcionaba y cómo había evolucionado, durante las charlas que di en el año 2009 con mi querida Informática 64 en la charla "Hay una carta para ti". Un caos maravilloso que usamos a diario, pero que tiene muchas lagunas de funcionamiento y apaños, de los que os voy a comenzar a hablar por aquí.

Figura 1: El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 1 de 4)

En este artículo, que he dividido en cuatro partes, voy a intentar hacer un recorrido didáctico y somero, sobre todas las vicisitudes que ha ido pasando, y las cosas que hemos ido construyendo sobre él y alrededor de él para terminar con alguna idea nueva. Espero que os guste, y sobre todo que os entretenga la lectura.

La necesidad de comunicación

Comunicarse es una necesidad humana. Lo utilizamos para todo. Para planificar la caza de un animal  que diera sustento a toda la banda de Homo Sapiens en tiempos de nuestra etapa de cazadores-recolectores, o para establecer una cita amorosa con una pareja que nos ha estimulado el sistema químico a través de una app de contactos en la que nos hemos dado de alta. Necesitamos comunicarnos para trabajar, para demostrar afecto, cariño, y hasta para estar enfadados con el mundo en Twitter.

El ser humano se comunica, y necesitamos hacerlo por cualquier nuevo medio en el que haya otros como nosotros, nos conozcamos o no. Es por eso que, en cada medio en el que nos hemos ido desenvolviendo a lo largo de nuestras vidas hemos desarrollado sistemas de comunicación en él. Desde mensajes en los árboles, señales de humo, o cartas escritas enviadas por mensajeros a caballo.

En la era moderna, ya con la tecnología de los computadores aquí, también lo hemos hecho. Cuando aparecieron los primeros sistemas de tiempo compartido, en los que muchos usuarios podían utilizar un mismo servidor para ejecutar sus algoritmos, apareció la necesidad de comunicarse entre los usuarios de ese ordenador central. El administrador del servidor debía enviar comunicaciones a los usuarios, tales como normas de comportamiento, periodos de indisponibilidad por mantenimiento, o actualizaciones de información sobre nuevas características en el servicio.

Por supuesto, entre los propios usuarios también aparecieron estas necesidades de comunicación. Estos podrían trabajar en grupos, dentro de proyectos que realizaban conjuntamente, para los que necesitaban compartir ideas, resultados o propuestas. Había que comunicarse a través del medio común, es decir, el servidor que daba vida a ese ecosistema creado alrededor de él.

Del e-mail al Webmail, pasando por SMTP, POP3, IMAP

Los primeros servicios de correo eran muy sencillos. Los requisitos eran bastante sencillos, ya que todos los usuarios estaban en el mismo servidor, así que no intervenían para nada las redes de comunicación en ese momento. Un usuario se conectaba al servidor por medio de un terminal para tener un shell, por lo que todo lo que hacía se producía directamente en el propio servidor. Al final, su terminal no era más que el equivalente a tener una pantalla y un teclado conectado al servidor desde una ubicación remota. Pero para el software del servidor, una vez el usuario iniciaba sesión, era como si el usuario estuviera sentado físicamente al lado de él.

Para crear un sistema de comunicaciones entre usuarios no había que hacer nada especial que incluyera ubicaciones remotas, múltiples servidores, o redes complejas de interconexión con federación de identidad. La autenticación y el enrutamiento de las comunicaciones se simplificaba al estar todos los usuarios en el mismo servidor. Para resolver el problema de comunicación bastaba con crear un pequeño programa que corriera en el servidor y al que decías a qué usuario querías enviarle el mensaje, por ejemplo a a p0344, cuál era el asunto por el que abrías esa comunicación, y cuál el cuerpo del mensaje.

En ese momento se generaba un fichero y el servicio de e-mail que corría en el servidor creaba un fichero con esta información en la carpeta de ese usuario p0344 - dentro del árbol de ficheros de ese usuario - destinada a recibir el correo. Es decir, el buzón de cada usuario era una carpeta con permisos de escritura para el servicio de “e-mail” donde se le depositaban ficheros de texto con los datos de qué usuario le escribía, cuándo lo hizo, cuál era el asunto y el cuerpo del mensaje. Metadatos que enriquecieran la comunicación electrónica.

Para enviar mensajes el proceso requería hacer algo similar. Había una carpeta de mensajes de salida que el programa, por medio de un “daemon” en el servidor leía periódicamente para ver si había algo nuevo. Cuando aparecía un nuevo mensaje, el servicio de “e-mail” lo borraba de esa carpeta, lo ponía en la carpeta de mensajes enviados para que quedara un copia, y el mensaje era copiado también a la carpeta de entrada del usuario destinatario en su estructura de ficheros particular. Sencillo y funcional.

La cosa se complicó cuando aparecieron más computadores. Ya no teníamos solo un mundo sino un ecosistema de servidores en red y teníamos la necesidad de comunicar usuarios de un servidor, por ejemplo llamado “Albeniz” con otro, por ejemplo llamado “Zipi”. En ese caso había que hacer un protocolo para que el servicio de e-mail de del servidor Albeniz, fuera el que fuera, supiera dónde tenía que enviar el mensaje cuando el usuario no existiera en su mundo y fuera de otro ecosistema, como por ejemplo del servidor "Zipi".

Para poder identificar a qué ecosistema pertenecía cada destinatario de las comunicaciones, inventamos las direcciones con la @servidor y creamos un protocolo que comunicaba el enrutamiento de mensajes entre servidores. El famoso y popular SMTP (Simple Mail Transfer Protocol) que habilitaba cada servicio de e-mail utilizando un puerto, ahora sí, en la red, en este caso el puerto 25. Así, un usuario “chema@albeniz.eui.upm.edu” podía enviar un mensaje a “chema@zipi.fi.upm.edu”. Los servicios de correo electrónico se enviaban los mensajes uno a otro a través de mensajes de red encapsulados en SMTP.

Pero un día los usuarios dejaron de utilizar plataformas de tiempo compartido como si estuvieran sentados en ellas, es decir, dejaron de conectarse a través de sesiones de terminal, y empezaron a usar sus propias estaciones de trabajo. Eso quería decir que el usuario chema@albeniz.eui.upm.es tenía en su despacho otro mundo, en el que había otro usuario, otro sistema operativo, y otras funcionalidades. Había una estación de trabajo y no un terminal, donde se ejecutaba un mundo tipo Solaris, o un MSDos, o un DRDOS, un OS2/Warp o lo que fuera.

Es decir, era otro sistema informático distinto, por lo que si quería enviar correo electrónico utilizando su identidad de chema@albeniz.eui.upm.edu debía actuar como un servidor remoto más y utilizar el protocolo SMTP para conectarse con el servicio de enrutamiento de correos electrónicos en su servidor, pero eso no valía para poder leer sus mensajes recibidos. Había que crear un nuevo protocolo para que pudiera conectarse a ver los mensajes que le habían entrado en su buzón. Y así nació POP3 (Post-Office Protocol v.3), corriendo en la red por el puerto 110.

Al final un puerto no es más que una zona de memoria que comunica a un programa que corre en un servidor con los mensajes que llegan por la red. Cuando arrancamos un programa que enruta mensajes con SMTP en un servidor, lo que hace este programa es hablar con servicio que recibe el tráfico de red en host y decirle:
"Oye, estoy corriendo en el servidor y esperando mensajes. Si te llega algún paquete que venga con el número 25 como destinatario me lo pones en esta zona de memoria". 
Esto mismo hace el protocolo POP3, pero diciendo algo como:
"Oye, estoy corriendo en el servidor y esperando mensajes. Si te llega algún paquete que venga con el número 100 como destinatario me lo pones en esta zona de memoria". 
Cuando los mensajes le llegan al servicio que gestiona las comunicaciones de red en el servidor, este va colocando los mensajes en diferentes direcciones de memoria para enviárselo a los servicios adecuados en función del número de puerto que venga en el destinatario. Es decir, es como el portero de un edificio en el que viven muchos vecinos y reparte los paquetes de Amazon en los distintos casilleros de los vecinos en función del puerto, que en ese caso serán 2º A, 3º C o Bajo C. Como podéis ver por los números de los puertos de los protocolos, la necesidad de conectar servidores nació tiempo antes de la necesidad de descargar el correo del buzón a la estación de trabajo.

Y funcionó. Y se masificaron los usuarios de estos servicios. Cada vez más personas utilizaban el e-mail para todo. Ya no solo trabajo, sino también para socializar entre ellos, lo que hizo que se vieran las limitaciones de estos protocolos creados hasta el momento. SMTP y POP3 tenían que ser extendidos y su arquitectura y concepto inicial ya no eran los requisitos de hoy en día. Estos protocolos eran una evolución de la idea inicial de transferir mensajes en texto plano entre carpetas, y por eso no tenían gran funcionalidad.

Pero con la masificación de su uso se requería enviar comandos para hacer cosas en el buzón remotamente sin necesidad de descargar y enviar ficheros de texto. Si necesito crear una carpeta para organizar el correo y mover un mensaje de una carpeta a otra, descargarse mensajes de textos y volver a subirlos no tenía sentido. Por ello se creó una evolución completa para gestionar los buzones de correos, y entre las muchas propuestas, comenzó a emerger el protocolo IMAP (Internet Message Access Protocol), con una cantidad de evoluciones.

Por supuesto, desde la primera concepción del servicio e-mail en los servidores de tiempo compartido, los clientes de correo electrónico fueron evolucionando. Desde un interfaz basado en comandos, a un interfaz modo texto corriendo en sesiones de terminales, para llegar a los clientes de hoy en día. Con la creación de SMTP y POP3 aparecieron las herramientas de gestión de e-mail en estaciones de trabajo como (Microsoft Outlook – que no es de las primeras ni mucho menos) para tener clientes de correo electrónico con interfaces gráficos, y con la llegada de HTTP y las páginas web aparecieron los primeros servicios como Hotmail o Gmail. Estos, pasaron rápidamente a utilizar IMAP y hoy en día es posible gestionar tu buzón de Gmail con comandos IMAP, como hice yo hace ya muchos artículos.

Los problemas de seguridad

Como os podéis imaginar, con el aumento de la popularidad del correo electrónico, la evolución de la potencia de cómputo de los equipos en clientes y en servidores en Internet, además de la masificación del número de usuarios conectados y la velocidad de las redes de comunicación, los problemas de seguridad con el correo electrónico fueron infinitos.

SMTP y POP3 nacieron como protocolos para mover ficheros de texto plano que estaban en carpetas de un servidor. El esquema de amenazas que había cuando todos los usuarios estaban dentro del mismo servidor era mucho más pequeño que cuando tenemos dos o más servidores. Ya hay un medio por el que los mensajes deben pasar. Y deberían estar cifrados. Así que primero intentamos cifrar las conexiones entre los servidores usando un protocolo como SSL (Secure Socket Layer) para crear un túnel de cifrado servidor a servidor que impidiera que alguien pudiera interpretar el tráfico si interceptaba la señal en el medio. Así, creamos SMTP-S y POP3-S por puertos de rede distintos que la gente ya no se conoce tan de memoria.

Pero también sucedía que el esquema de identificación de remitente y de identificación del host cuando todos los servidores eran confiables y no era fácil conectarse a la red, tampoco valía. Se empezaron a suceder los ataques de suplantación de direcciones IP en los que una estación de trabajo se hacía pasar por un servidor de correo electrónico, usando técnicas de Spoofing o atacando al servidor DNS para cambiar los servidores autorizados para recibir los mensajes de correo de una organización. El esquema de cifrado era inútil frente a ellos, ya que se estaban cifrando las comunicaciones contra el propio atacante, que estaba haciendo un “man-in-the-middle”, así que pasamos a utilizar sistemas como Mutual-TLS donde tenemos no solo que cifrar las comunicaciones, sino también firmarlas por los servidores que están allí.

Figura 2: Libro de Cifrado de las Comunicaciones Digitales:
"De la cifra clásica a RSA (2ª Edición)"

Pero este proceso de enrutamiento de comunicaciones por la red solo por tramos cifrados no es obligatorio para que el e-mail funcione, y una vez que el usuario ha recibido un mensaje de correo electrónico no sabe realmente si el mensaje va a acabar cifrado en el buzón del destinatario o no, y si la comunicación por la que ha venido era un canal cifrado o no. Y por supuesto, ya que se puede suplantar a un servidor de correo electrónico con una estación de trabajo, se puede suplantar a cualquier dirección de remitente que estuviera en ese servidor. Es decir, podrían aparecer mensajes como chema@albeniz.eui.upm.edu que no hubieran sido enviados ni desde albeniz.eui.ump.edu, ni desde luego por chema.

Para ello, sería necesario que el cifrado y la firma de los correos electrónicos fuera extremo a extremos y robusta. Necesitamos no solo garantizar la comunicación de los servidores, sin la comunicación entre remitente y destinatario, para lo que utilizamos sistemas de firma digital como PGP o los certificados digitales de e-mail S/MIME.

Por desgracia, estos sistemas de certificados digitales son bastante poco usados, ya que tienes que  generar certificados en entidades confiables, configurarlos en los diferentes clientes de e-mail que uses (computadoras, ordenadores portátiles, tabletas, diferentes navegadores de Internet) , hay que renovarlos, hay que intercambiarlos antes de establecer una comunicación segura, etc... Demasiadas barreras de usabilidad para la gran mayoría de las personas que utilizan mensajería e-mail por Internet,  por lo que la mayoría de la comunicación por medio de correos electrónicos ni se cifra ni se firma.

Google intentó avisar a los usuarios cuando los correos venían cifrados en tránsito o no, con un candadito rojo como respuesta a las filtraciones de Edward Snowden en las que descubrió que la NSA estaba capturando el tráfico sin cifrar. Y, además, todos los clientes de correo electrónico marcan con un icono especial si el mensaje viene cifrado y/o firmado desde el emisor.

Figura 3: El intento del candado rojo de Gmail. Mucho candado rojo, mejor quitarlo.

Al final, como la realidad es que casi ningún mensaje llega firmado y cifrado extremo a extremo, los usuarios ven normal que un banco o su jefe les envíen un mensaje sin cifrar o firmar. Con lo que se abre el campo para los ataques de suplantación del remitente y de Phishing o los más peligrosos Spear-Phishing que se utilizan en los ataques dirigidos a personas concretas.

A todo esto hay que sumar problemas inherentes al sistema de correo electrónico más, y es que, al ser un sistema de comunicación de coste cero, se ha aprovechado para hacer captura masiva de clientes por medio de mensajes publicitarios, para hacer campañas de estafas masivas engañando a víctimas (Scam), para dar de alta sin autorización en listas de correos, o para simplemente molestar.

Necesitamos más seguridad pero... ¿Será suficiente?

Tras la creación del servicio de e-mail, vimos que la necesidad de usabilidad nos llevó a crear SMTP, POP3 e IMAP, y que las primeras amenazas nos llevaron a aplicar capas de seguridad como SSL, y mecanismos de firma digital y cifrado extremo a extremo sobre sobre el servicio de e-mail, como PGP o S/MIME, pero aún estamos lejos de que poder proteger al servicio de correo electrónico de todos los problemas que se fueron creando, así que hay que hacer más.

En la siguiente parte de este artículo veremos cómo se empezaron a intentar soluciones como Sender Policy Framework, Sender ID, DKIM, o los Filtros Anti-Spam basados en todo tipo de algoritmos, desde listas blancas y listas negras, hasta Inteligencia Artificial pasando por los Filtros Bayesianos o la colaboración de usuarios para detectar Scams, Spam, Spear Phishing, y otros ataques a las personas. Pero aún así... no será bastante, así que habrá que ver qué alternativas han aplicado personas y empresas para lidiar con el e-mail.

Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)

********************************************************************************************************
- El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 1 de 4)
- El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 2 de 4)
- El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 3 de 4)
- El e-mail ha muerto. ¡Larga vida al e-mail! (Parte 4 de 4)
********************************************************************************************************

martes, mayo 15, 2018

Efail: O cómo descifrar e-mails cifrados con S/MIME y OpenPGP usando técnicas de exfiltración

La verdad es que hoy, día de San Isidro, tenía cualquier plan menos ponerme a leer un paper técnico, pero encontrarme esta mañana información del trabajo de Efail merece la pena el cambio de planificación. Se trata de un trabajo que explica cómo se pueden descifrar correos electrónicos que hayan sido cifrados mediante S/MIME u OpenPGP, incluso si los correos tienen mucha antigüedad.

Figura 1: Efail: O cómo descifrar e-mails cifrados
con S/MIME y OpenPGP usando técnicas de exfiltración

Dicho esto, dejadme que os explique un poco el escenario para que sea más fácil de entender por todos, pues si no puede llevar a confusión. Supongamos que Eduardo (Emisor) envía un mensaje cifrado con OpenPGP o S/MIME a Ricardo (Receptor). Para eso, quiere decir que Ricardo tiene la clave privada de descifrado del Mensaje, ya que hemos cifrado el contenido del Mensaje con la Clave Pública de Ricardo.

Figura 2: Efail: Breaking S/MIME and OpenPGP Email Encryption

Supongamos ahora que Ricardo, años después sigue teniendo disponible esa Clave Privada (no ha caducado, y la sigue teniendo en uso). Bien, en ese escenario, un atacante, podría enviar un e-mail, al que llamaremos Mensaje Malicioso que iría cifrado con la Clave Pública de Ricardo, y que podría ser utilizado por el Atacante para descifrar los Mensajes enviados años atrás por Eduardo. ¿Cómo?

Figura 3: Si la Víctima abre un e-mail Mailicioso puede descifrar mensajes antiguos

Pues tan sencillo como metiendo en el Mensaje Malicioso "trozos" del Mensaje de Eduardo a Ricardo que van cifrados para que los descifre y Exfiltrando el contenido descifrado utilizando diferentes técnicas que dependen de:
A) El tipo de cifrado que se utiliza 
B) El cliente de correo electrónico que usa Ricardo.
Si queréis los detalles completos, podéis leeros el paper, pero básicamente utiliza tres tipos de exfiltración basados en el uso de la interpretación del HTML y las Primitivas de los sistemas de cifrado:
- BackChanels: Si el cliente interpreta el código HTML de un e-mail se puede crear un mensaje HTML con una etiqueta IMG que se cargue de un servidor controlado. Este canal que siempre ha sido visto como un riesgo de privacidad - ya os conté alguna aventura mía con esto por culpa de Gmail - también se puede usar para exfiltrar datos usando parámetros en las URLs o dejando las etiquetas sin cerrar. 
- Direct Exfiltration: Se dejan las etiquetas IMG sin cerrar y algunos clientes envían parte del mensaje descifrado al servidor. Esto permite que el Atacante acceda a datos descifrados que le permiten tener duplas de datos cifrados y descifrados. 
- Malleability Gadget: Aquí el paper se centra en cómo utilizar los datos exiltrados para, utilizando las primitivas de OpenPGP y S/MIME que permiten reordenar o inyectar pedazos de mensajes cifrados en el sistema para obtener su descifrado. Es decir, dinámicamente se puede solicitar el motor que descifre cadenas de texto cifrado.
Con estás técnicas, dependiendo de la configuración del cliente de correo electrónico y las versiones de OpenPGP o S/MIME una víctima podría estar descifrando correos electrónicos antiguos con solo abrir un mensaje malicioso hoy en día.  Las versiones afectadas por esta técnica las tenéis en la tabla de la figura siguiente.

Figura 4: Tabla de sistemas afectados

¿Cómo evitar esto?

La forma más sencilla es actualizar el software de S/MIME y de OpenPGP para evitar el uso de las primitivas para modificación y quitar el uso de HTML en la interpretación de mensajes de e-mail. HTML en el e-mail ha sido siempre un leak de privacidad debido a la existencia de Side-Channels para saber si un mensaje ha sido leído o no y desde qué equipo, así que si lo tienes deshabilitado, mejor que mejor.

Si quieres saber más sobre este tema, te recomiendo el libro de Cifrado de las Comunicaciones Digitales que explica todos estos conceptos con extrema facilidad y te permitirá entender mejor este tipo de situaciones.

Saludos Malignos!

miércoles, junio 08, 2016

¿Tienes un oído fino? Cifrado y esteganografía de datos en ficheros de audio y un test de estegonanálisis con tu oreja

Tras ver la invitación de Chema Alonso para escribir algún artículo en El lado del mal me decidí a enviar un resumen de lo que fue mi proyecto final de carrera de ingeniería informática, en el que tocaba el tema de esteganografía y cifrado de datos en ficheros de audio. Hace poco se habló de una técnica parecida en el artículo "Esteganografía con ficheros de audio: enviar tus documentos ocultos en canciones", pero en este trabajo se añade la capa de cifrado y el trabajo se hace con MatLab, así que espero que os sea de utilidad y complemente un poco más el conocimiento de las técnicas de esteganografía y estegoanálisis.

Figura 1: ¿Tienes un oído fino? Cifrado y esteganografía de datos en
ficheros de audio y un test de estgonanálisis con tu oreja

Considero que todo documento científico debe contar con una breve introducción de los conceptos que se tratarán, así que, para empezar a tener claras las ideas, me gusta empezar siempre con definiciones y, si es posible, dar algunas pinceladas de etimología a los términos sobre los que escribo. Y aquí van:
Definición 1: esteganografía es la ciencia que trata el estudio y la aplicación de un conjunto de técnicas que permiten ocultar o esconder información, de modo que no se perciba su existencia. 
Etimología 1: Estegano-, del griego tégos-/steganos, que significa disimular, disfrazar o cubrir. 
Definición 2: criptografía es el arte de escribir con clave secreta o de un modo enigmático. 
Etimología 2: Cripto-, del griego kryptós, que significa recubierto.
Etimología 3: -grafía, de la raíz del griego grafein, que significa escritura o representación gráfica.
Con todo esto presente, mi objetivo fue construir un criptosistema que fuera capaz de cifrar información y para posteriormente esconderla dentro de un fichero de audio en formato WAV, maximizando la cantidad de mensaje a ocultar y minimizando todo lo posible el ruido introducido. Para la parte del cifrado me decanté por usar cifrado asimétrico RSA y para la de esteganografía, utilicé 2 métodos, uno bastante empleado, como es el LSB y otro no tanto, conocido como Phase Coding.

Explicación del funcionamiento del criptosistema

El sistema consta de dos capas de seguridad, la primera será criptográfica, ya que a toda la información que se pretenda transmitir, le aplicaremos un cifrado asimétrico. Una vez tenemos la información cifrada, realizaremos el proceso de esteganografía, escogiendo para ello un fichero de audio WAV como portador y ocultando en él los datos cifrados en el paso anterior.

Figura 2: Diagrama global del criptosistema

En la Figura 2 vemos cómo encajan todos los subsistemas entre sí, donde las cajas rojas conforman el subsistema criptográfico, que se corresponden con los procesos de cifrado y descifrado. Aquí es importante destacar que el emisor cifra la clave secreta (o clave de sesión) con la clave pública del receptor y que el mensaje se cifra usando la clave secreta, generada automática y aleatoriamente por GPG4WIN.

Las cajas azules conforman el subsistema esteganográfico, que se corresponden con los procesos de ocultación y extracción. El resto de elemento son las entradas y salidas del sistema, y un medio de transmisión.

Explicación general de cada subsistema

Teniendo una visión global del sistema, veamos el comportamiento de cada uno de sus elementos de procesamiento de la información.

Subsistema criptográfico: es el componente que aplica un algoritmo de cifrado o descifrado, en función de la etapa en la que se encuentre la información que procesemos dentro del sistema global. Recurrimos a RSA 2048 bits, mediante la herramienta GPG4WIN. En la Figura 1 se ve el flujo de la información y cuándo entra en juego cada componente. Para gestionar nuestro criptosistema de la forma que queremos, debemos configurar adecuadamente GPG4WIN. Los pasos a seguir son:
1. Crear un certificado de tipo ‘OpenPGP key pair’
2. Introducir algunos datos personales: Dentro de las opciones avanzadas, elegimos el uso que le vamos a dar. En nuestro caso solo queremos cifrar, así que elegimos el método RSA con 2048 bits y marcamos la casilla de ‘Encryption’.
3. Crear una ‘passphrase’ para cifrar la clave privada (este cifrado es tipo simétrico)
Si todo el proceso se ha llevado a cabo correctamente, obtendremos una ventana de confirmación que nos mostrará el ‘fingerprint’ de nuestro certificado. Con este certificado será con el que podamos cifrar/descifrar ficheros. Para cifrar en GPG4WIN lo podemos hacer con el propio gestor de certificados que incluye, llamado Kleopatra. Simplemente lo abrimos y seguimos estos pasos:
1. Elegimos ‘Sign/Encrypt Files’, y marcamos la opción de Encrypt. Seleccionamos el fichero a cifrar.
2. Seleccionamos el certificado que queramos usar para cifrar. En este caso, como ya lo tenemos creado, seleccionamos y añadimos el que hemos hecho anteriormente.
3. Pulsamos en ‘Encrypt’ y esperamos a que el proceso finalice. El programa nos avisará.
Para descifrar en GPG4WIN lo haremos también con Kleopatra:
1. Elegimos ‘Decrypt/Verify Files’, y seleccionamos el fichero a descifrar. También podemos elegir dónde se guardará la información descifrada.2. Introducimos la ‘passphrase’ para nuestro certificado, que se nos indica en pantalla. Cada certificado que creemos tiene su propia ‘passphrase’, de modo que hay que recordarla para poder realizar el proceso de descifrado.3. Pulsamos en ‘OK’ y esperamos a que el proceso finalice.
Subsistema esteganográfico: es el componente que aplica un algoritmo de ocultación o extracción. Depende también de la etapa, y en la misma Figura 2 vemos las interacciones de este componente con el sistema.

1. LSB (Least Significant Bit): es un método de ocultación que se basa en esconder la información en los bits menos significativos del fichero de audio original. El proceso consiste en realizar una sustitución de los bits menos significativos de las muestras del audio original por todos los bits del mensaje. En la Figura 2 vemos un ejemplo de ocultación, donde:
• Audio: muestras de sonido del fichero WAV original. El subíndice indica el número de muestra y el superíndice indica el peso del bit de la muestra.
• Datos: cadena de bits del mensaje original.
• Portador: muestras de sonido del fichero WAV con el mensaje ‘Datos’ incluido.
Figura 3: Ejemplo de ocultación LSB. Sustitución de los bits menos significativos
de las muestras de audio original por los bits del mensaje

2. Phase Coding: Es un método de ocultación que se basa en esconder la información en la fase de las componentes espectrales de la onda de sonido que se obtiene a partir del audio original. El proceso de ocultación es como sigue:
a. Dividimos la señal acústica en varias ventanas de tamaño fijo.
b. Calculamos la DFT (transformada discreta de Fourier) de cada ventana, obteniendo la fase y la magnitud.
c. Elección de puntos de cada ventana candidatos para esconder la información.

i. Todos los puntos que cumplan Thmin < magnitud < Th albergarán el mensaje a ocultar.
• Umbral, Th, es un porcentaje del valor máximo de la señal.
• Umbral mínimo, Thmin, es un valor fijo obtenido de forma empírica, 10^-4 genera 0 errores.
ii. Para cada punto, dejaremos el valor de la fase original, con el siguiente criterio:
• Si bit a ocultar 0, entonces: (-1) x fase
• Si bit a ocultar 1, entonces: (1) x fase
Figura 4: Pasos para aplicar el método de esteganografía de Phase Coding

Implementación de esteganografía con Matlab

Entrando un poco más en materia, paso a explicar cómo implementé ambos algoritmos esteganográficos en Matlab.

• LSB, ocultación:
1. Leer fichero con los datos a esconder
[Datos, count] = fread(fopen('C:\ruta\mensaje.txt'));
Datos = matriz de ‘count’ filas (cada caracter) y 1 columna.
count = cantidad de caracteres leídos.
2. Leer fichero de audio, que hará de portador
[x,fs] = audioread(ruta);
x = muestras de audio
fs = frecuencia de muestreo
3. Sustituir los bits menos significativos de ‘x’ por todos los bits que haya en ‘Datos’
% La parte del mensaje que cabe justa
coded(1:F_smr,(end-LSB+1):end) = stego_mensaje;
% La parte del mensaje que sobra
coded(F_smr+1,end-sobran+1:end)=Datos(L_esconder-sobran+1:end);
Básicamente estos son los pasos, pero se ve mucho mejor en la Figura 3. Hay que tener en cuenta que hay que moldear bastante las matrices y jugar con los tipos de datos en Matlab, para poder ajustar todos los cálculos, ya que el algoritmo lo hice para poder escoger una cantidad variable de bits menos significativos.
4. Crear un nuevo vector de muestras, que contenga el mensaje sustituido y el resto de muestras originales, es decir, las muestras del fichero portador, incluyendo el mensaje a esconder.
y = coded;
audiowrite(‘C:\ruta\LSB-codedAudio.wav’, y, fs);
• LSB, extracción:
1. Leer fichero de audio, que es el portador del mensaje oculto
[x_ext,fs_ext] = audioread(‘C:\ruta\LSB-codedAudio.wav’);
2. Extraer los bits menos significativos de ‘x_ext’
% Recupero el mensaje, por partes: la divisible, y el resto
% 1º Recupero la parte divisible del mensaje
recup1 = x_ext(1:F_smr,end-LSB+1:end);
% 2º Recupero la parte que falta del mensaje
recup2 = x_ext(F_smr+1,end-sobran+1:end);
% Juntamos todo
recup = vertcat(recup1,recup2);
3. Crear un nuevo fichero que será el mensaje extraído.
fwrite(fopen('C:\ruta\mensaje_extraido.txt','w'), recup);  
%Recordad que este mensaje extraído está cifrado.
• Phase Coding, ocultación:
1. Leer fichero de audio y dividir la señal en ventanas
[x,fs] = audioread(ruta);
% Longitud archivo portador en muestras
T = length(x);
% Longitud de cada segmento
L = 1024;% Numero de segmentos
N = floor(T/L);
% División en segmentos de la señal (cada columna un segmento)
for n=1:N
xf(:,n) = x((n-1)*L + 1:n*L);
end
2. Calcular DFT y obtener fase y magnitud
% DFT de cada segmento (fft lo hace de golpe)
Xf = fft(xf);
% Matriz de magnitud original
M_ori = abs(Xf);
% Matriz de fases original
P_ori = angle(Xf);
3. Calcular umbrales y obtener los puntos candidatos
Th = porcentaje*max(M_ori(:)); Th_min = 0.0001; indhide = find(M_ori<Th & M_ori>Th_min);
4. Calcular umbrales y obtener los puntos candidatos
for k=1:L_esconder % desde 1 hasta el tamaño del mensaje que quiero esconder
if Datos(k)==0
P_hide(indhide(k)) = abs(P_ori(indhide(k)))*(-1);
else
P_hide(indhide(k)) = abs(P_ori(indhide(k)))*(+1);
end
end
5. Crear el audio portador con el mensaje a esconder.
% Mensaje portador con datos ocultos
Xhide = M_ori.*exp(1i*P_ori);
xm = real(ifft(Xhide));
audiowrite(‘C:\ruta\PC-codedAudio.wav’,xm,fs);
• Phase Coding, extracción:
1. Los pasos para extraer son los mismos que para ocultar, desde el 1 al 3 
2. Extraemos la información del vector con los puntos candidatos
% Extraer índices de los puntos con bits ocultos
indhide = find(M_decod<Th & M_decod>Th_min);
indhide = indhide(1:L_esconder);
Decp = P_ decod(indhide);
Recordad que ‘L_esconder’ es el tamaño del mensaje que voy a extraer. En principio lo sabemos de antemano, pero se podría crear un espacio dentro del mensaje a ocultar para indicar cuál es su tamaño, y transmitirlo también una vez cifrado y ocultado. 
3. Extraemos el mensaje oculto
% Mensaje extraído en Datadec
Datadec = (Decp<=0)*0 + (Decp>0)*1;
Guión final y resultados

Bien, ahora que hemos visto cómo funciona cada parte por separado, vamos a hacer un pequeño guión de cómo hacer funcionar todo el sistema.

CIFRADO Y OCULTACIÓN
1. Elegimos un fichero cualquiera que será nuestro mensaje a ocultar.
2. Elegimos un fichero de audio, en formato WAV, que será nuestro portador.
3. Ciframos el fichero con GPG4WIN.
4. Ocultamos el mensaje obtenido en el paso 3 mediante una técnica esteganográfica: LSB o Phase Coding.
5. Obtenemos un fichero WAV con el mensaje incluido. Este fichero lo podemos transmitir o almacenar teniendo 2 ventajas principalmente:
a. Tenemos la información escondida, luego será más difícil encontrarla para cualquiera que no sepa dónde/cómo buscar.
b. Tenemos la información cifrada, de modo que, incluso aunque se llegue a descubrir que tenemos información oculta, sería casi imposible descifrar sin tener la llave.
EXTRACCIÓN Y DESCIFRADO
1. Elegimos un fichero de audio que sea portador.
2. Extraemos el mensaje mediante una técnica esteganográfica: LSB o Phase Coding.
3. Desciframos el fichero obtenido en el paso 2 con GPG4WIN.
Para comprobar que todo este proceso de cifrado y ocultación funciona bien, quise realizar una serie de pruebas a personas de mi entorno. Recurrí para ello al test ABX, que es un tipo de prueba auditiva que se realiza a ciegas, lo que se conoce también como ‘blind test’, es decir, que el sujeto desconoce el origen del audio que escucha. Para hacer las pruebas más sencillas, recurrí a la herramienta llamada Lacinato ABX/Shootouter, que permite cargar ficheros de audio, y realizar la prueba de forma automática, mostrando los resultados obtenidos por cada sujeto. Sin entrar en mucho detalle matemático, necesariamente derivado de este tipo de pruebas, os explico en qué consiste el test ABX.

Figura 5: Herramienta Lacinato ABS/SHootouter

Durante la prueba, una de las muestras recibe el nombre de A y la otra muestra recibe el nombre de B. El programa elige una muestra X, que puede ser cualquiera de las muestras A o B, que el usuario ha indicado como banco de muestras, pero el sujeto no sabe cuál es. La tarea del sujeto es escuchar atentamente todas las muestras, tanto A y B como X, y entonces decidir si X se corresponde con la muestra A o con la muestra B. Por cada vez que el sujeto se vea sometido a esta elección, lo llamaremos intento. Al final de la prueba, se analizan el número de pruebas realizadas, el número de aciertos y fallos.

Las señales acústicas que hemos elegido para el test se pueden agrupar en cuatro tipos diferentes de audio:
• Música clásica: Sinfonía nº 6 en Fa mayor, op. 68, “Pastoral”, Ludwig Van Beethoven.
• Música comercial: Diamonds, Season One, Emancipator.
• Música pop-rock: Cuando los ´árboles se sequen, Casa Grande, Marco Boz y Pablo Páez.
• Voz hablada: Blue Sky Bridge, narración en inglés, Fergus Sound Enterprises.
Estos cuatro tipos de audio son muy comunes a día de hoy, por lo tanto, son un adecuado objeto de estudio para nuestro proyecto. Cabe destacar que los formatos de los audio obtenidos son del tipo sin pérdida, concretamente en formato WAV. Esto es así para poder trabajar a partir de un material que ofrezca el menor error posible. Destacar que, para homogeneizar las muestras, todos los audio han sido normalizados y convertidos a monocanal con 16 bits de profundidad. Los resultados que obtuve para cada algoritmo esteganográfico fueron los siguientes:
Resultados para LSB: Para evitar detección auditiva, recomiendo utilizar como máximo los 4 bits menos significativos. Capacidad de ocultación del LSB es el producto del número de muestras del audio original y el valor de LSB elegido en cada caso: numero_muestras x N lsb 
Resultados para Phase Coding: Para evitar detección auditiva, recomiendo utilizar un valor Th ≤ 10-4.
Es importante tener en cuenta que lo que más pesa a la hora de realizar un buen proceso de ocultación es el fichero portador. En nuestro caso, cuanto más intenso sea el nivel de sonido de nuestra onda portadora, más disimulará el contenido oculto. Por eso he especificado qué tipo de fragmentos musicales he utilizado, y también porque necesitaba una base sobre la que partir. Es por ello que se hace complicado dar un valor preciso que indique cuánta cantidad de información puedo introducir por muestra mediante esta técnica.

Para terminar, ahora que os he soltado toda esta marea de ideas y conceptos, aquí podéis escuchar los ficheros de audio y realizar vosotros mismos vuestras comparativas. Os los dejos organizados por carpetas y por estilos musicales [Audios Codificados, Audios Originales] ¿Hasta dónde sois capaces de detectar el ruido en cada técnica? Empieza el reto ;)

Autor: Jorge Peris (Universidad de Valencia)

Entrada destacada

Hacking IA: Jailbreak, Prompt Injection, Hallucinations & Unalignment. Nuestro nuevo libro en 0xWord

Pocas veces me ha hecho tanta ilusión que saliera un nuevo libro en 0xWord como con este libro de " Hacking IA: Jailbreak, Prompt Inje...

Entradas populares