DIVULGAJARE: CORAZÓN SANGRANTE
Si estás un poco al loro de las noticias de Internet, esa nueva nación a la que todos pertenecemos te habrás enterado del revuelo que ha provocado el bug Heartbleed que amenaza con privarnos de nuestros ahorros, nuestra intimidad, y lo que es peor, nuestra librería de Steam.
¿Cómo es que esta vez el ataque es tan ubicuo? Pues porque esta vez la cagada no es de Sony, Microsoft, Google, Valve… sino de los desarrolladores de la librería Open SSL, la encargada de proporcionar seguridad en las comunicaciones en multitud de servicios que utilizamos cada día.
Dejemos de lado el interesante debate sobre si dichos desarrolladores tienen algún tipo de responsabilidad teniendo en cuenta que dicha librería es de código abierto, en la que en principio han participado de manera altruista, y cuyo uso ha sido libremente escogido por todos esos servicios afectados y en cuya mano siempre estuvo el revisar el código fuente y detectar el error.
Este capítulo de divulgajare está dedicado a explicar de forma bastante superficial cómo es posible confiar en unas comunicaciones que por lo que oímos en las noticias están más intervenidas que Bibi Andersen. La respuesta es que esto es posible gracias a la criptografía. Es decir, gracias a la rama de las matemáticas dedicada a cifrar mensajes de tal forma que sólo los legítimos participantes puedan entenderlos.
Lo primero que hay que saber es que los mensajes se cifran / descifran. No se encriptan / desencriptan. Lo segundo significa literalmente meter / sacar de una cripta, y aunque es una forma muy respetable de que nadie pueda leer lo que escribimos, es trabajo de los enterradores con los que los informáticos tenemos firmado un pacto de no intrusismo laboral.
Lo segundo que hay que entender es qué es un algoritmo criptográfico. Pues simplemente son una serie de operaciones sobre los bits del mensaje en base a una clave que lo dejan que no hay dios que lo entienda. Pero eso es la parte fácil, si sólo fuera eso mi boca sería un estupendo instrumento criptográfico de lo que mi cerebro piensa. Además ha de permitir recuperar el mensaje original y también ha de impedir que mediante un ataque de fuerza bruta (alias probar todas las posibilidades) o algo más sofisticado se pueda obtener dicho mensaje sin disponer de la clave necesaria.
Para que nos entendamos: El algoritmo criptográfico es la cerradura que impide que abran nuestro buzón y nos lean el correo. Hay cerraduras de diferentes tipos, unas mejores y otras peores, y aunque dos cerraduras sean del mismo tipo tendrán llaves diferentes, la clave para abrirlas, por lo que yo con mi clave no podré abrir el buzón del vecino ni él el mío.
Habrá quien piense que lo mejor para impedir que abran mi buzón es esconder los planos de la cerradura. Pero hoy en día no se pueden guardar secretos, de eso va esta movida, por lo que resulta más seguro publicar dichos planos, que los demás cerrajeros intenten descubrir los fallos de nuestra solución, y si no la encuentran es que probablemente sea buena.
Bastón cifrador por transposición Escítala (sin risas, que se llama así en serio) Se basa en enrollar una tira de cuero a su alrededor, escribir en el de forma normal y al desenrollar la tira de cuero queda un mensaje con las letras desordenadas. En éste caso la «clave» es la anchura del bastón. Pero como método de cifrado no vale un carajo. Una vez conocido el «algoritmo» basta con probar diferentes anchos hasta encontrar un mensaje con sentido. Los buenos algoritmos criptográficos son conocidos y aun así indescifrables sin la clave, y probar todas es computacionalmente inviable.
Habiéndonos asegurado de que la cerradura es buena la seguridad de lo que guarda dependerá de cómo cuidemos la llave o clave. Cuando queramos establecer una comunicación segura con otra persona lo que haremos es establecer un buzón común del que ambos tendremos una misma llave idéntica. Yo la utilizaré para abrir el buzón y dejar el mensaje dentro y él la usará para abrir el buzón y sacarlo. Es lo que se llama criptografía de clave simétrica y consiste en que el Procedimiento criptográfico P aplicado con clave K sobre el mensaje M da lugar al mensaje ininteligible M’. Y que Procedimiento criptográfico P aplicado con clave K sobre el mensaje M’ da lugar al mensaje en claro M.
Matemáticamente: Pk(M)=M’ y Pk(M’)=M . Por tanto Pk(Pk(M))=M
Vamos que para cifrar un mensaje se realizan una serie de operaciones y que si sobre lo resultante se repiten esas mismas operaciones se obtiene el mensaje original. Cojonudo, ¿no?
Pues no porque si para descifrar el mensaje únicamente hace falta conocer la clave K, eso implica que de alguna forma le he tenido que transmitir de forma segura dicha clave al receptor, y si esa forma segura ya existiera, mejor que le hubiera transmitido el mensaje que le quiero comunicar y aquí paz y después gloria.
Para evitar este clásico problema de ¿Qué fue antes, el huevo o la gallina? Es para lo que se inventó la criptografía asimétrica. Pero antes de que eso existiera lo que se hacía era enviar a los espías con un librito de claves de esas simétricas. Se utilizaba un libro porque utilizar solamente una clave no era seguro ya que cifrar muchos mensajes con la misma posibilita que los criptoanalistas enemigos (los que se dedican a intentar descifrar mensajes desconociendo su clave) logren deducirla. Es un terreno apasionante de ésta rama de las matemáticas y se basa fundamentalmente en buscar patrones por ejemplo si saben que todos los mensajes enviados comienzan con la fecha actual.
La criptografía asimétrica funciona igual que la simétrica excepto que en lugar de depender de una sola clave depende de una pareja de ellas: K y K’ de tal forma que lo que una cifra la otra lo descifra y viceversa. Lo que se hace es guardar una a buen recaudo convirtiéndose en nuestra clave privada, y hacer pública la otra. De esa manera quien quiera mandarnos un mensaje lo que hará será cifrarlo con NUESTRA clave pública y de esa manera solamente nosotros podremos descifrarlo con NUESTRA clave privada y será ilegible para todo el resto.
Un problema de la criptografía asimétrica es que es bastante más lenta que la simétrica. Así que lo habitual es utilizarla únicamente para intercambiar de manera segura una clave simétrica generada en el momento de un solo uso por sesión, por ejemplo mientras estemos logados en Steam. Y una vez intercambiada se pasa a usar un cifrado simétrico.
Como se ve de esta manera es posible mandar mensajes cifrados sin necesidad de revelar la clave para descifrarlo… la panacea no… PUES NO. Porque hay un ligero problema ¿Cómo sabemos que la clave pública con la que vamos a cifrar el mensaje pertenece realmente al destinatario que pretendemos? Es decir, un atacante podría hacerse pasar por el destinatario real, proporcionarnos su clave pública, leer nuestro mensaje y reenviarlo al destinatario final esta vez bien cifrado. Ha logrado leer el mensaje y no tenemos capacidad siquiera para saber que ha sido interceptado.
Esto es lo que nos puede pasar si confíamos en quien no debemos.
Para solventar este escollo es para lo que se crearon los certificados digitales y las autoridades certificadoras. Un certificado digital es un documento (digital, si quereis ver uno entrar a cualquier sitio seguro, por ejemplo gmail y pulsar sobre el candado de la barra de navegación) que contiene información sobre quienes somos (nombre, correo, web…) y sobre todo cual es nuestra clave pública. A su vez va firmado digitalmente (a continuación explico en que consiste esto) por una autoridad certificadora en la que confiamos y que debería haber verificado que la información es correcta.
Para entender qué es una firma digital antes debo explicar que es una función Hash (o resumen en castellano). Una función Hash es una operación matemática sobre un mensaje que devuelve un resultado que cumple estas 4 condiciones:
1) La función Hash aplicado sobre un mensaje M siempre devuelve el mismo resultado.
2) Del resultado de aplicar la función Hash es imposible deducir el mensaje M (lo que lo diferencia de las funciones criptográficas)
3) Una pequeña variación en el mensaje M provoca cambios impredecibles y sustanciales en el resultado de la función Hash.
4) Es imposible (o MUY difícil) encontrar a propósito un mensaje M’ cuyo resultado de aplicarle la función hash coincida con el de aplicarlo sobre M.
Como curiosidad: en las últimas elecciones presidenciales de EEUU no recuerdo quién aseguró que conocía de antemano el resultado y para demostrarlo lo escribió en un mensaje que firmó digitalmente haciendo público su Hash. Cuando se supo que Obama había ganado reveló el mensaje que lo predecía y por supuesto su Hash coincidía ¿Magia, Politología…? No, había sido capaz de escribir varios mensajes,uno para cada candidato, cuyas funciónes Hash coincidían, es decir, demostró que la función Hash utilizada era vulnerable por no cumplir el cuarto punto. Es lo que se llama un ataque por colisión de Hash.
Cuando se firma digitalmente un mensaje lo que se hace es calcular su resumen con una función Hash y cifrar dicho resumen con NUESTRA clave privada. El receptor al recibirlo calcula otra vez el resumen, descifra con NUESTRA clave pública el resumen que le hemos enviado y si coinciden se puede asegurar que:
1) El mensaje lo hemos enviado nosotros (porque si no el descifrado hubiera fallado)
2) El mensaje no ha sido modificado (o el resumen no habría coincidido)
3) No podemos rechazar nuestra firma (el cifrado del resumen sólo lo hemos podido hacer nosotros)
4) Confidencialidad: esto es un mecanismo aparte, pero digamos que si queremos que además de todo lo anterior sólo el receptor pueda leer nuestro mensaje, basta con cifrar con la clave pública DEL RECEPTOR tanto mensaje como resumen, y listo.
Esquema clarito clarito de la firma digital.La función Hash es lo que aparece como message digest algorithm
Así pues cuando un certificado digital nos informa de la clave pública de una persona, y dicho certificado digital está firmado por una autoridad certificadora en la que confiamos, digamos que nos fiamos y podremos mandar mensajes cifrados a dicha persona. De este modo la clave de todo este tinglado la tienen estas autoridades certificadoras, de las cuales por ciencia infusa debemos tener su clave pública para poder comprobar que los certificados que emiten están firmados correctamente. ¿Cómo ha llegado esa clave pública a nuestros navegadores? Muy sencillo: las más importantes suelen venir preinstaladas.
La autoridad certificadora más conocida es la empresa privada Verisign, aquí en España también es común tener instalada la clave pública de la Fábrica de Moneda y Timbre, que por cierto es la encargada de generar el par de claves Publica/Privada de nuestros DNIs electrónicos con los que podemos firmar digitalmente ¿Quién nos asegura que no se han hecho una copia de nuestra clave privada y podrían suplantar nuestra firma? Yo os lo digo: NADIE.
Como este trabajo de las autoridades certificadores es muy cansino (y lucrativo, que los certificados digitales no son gratis) hay bastantes empresas que se dedican a ello. No tenemos la clave pública de todas, pero en sus certificados suele venir un “Soy una autoridad certificadora confiable porque lo afirma Fulanito” firmado por el propio Fulanito. Al revisar el certificado de Fulanito viene lo mismo pero con Menganito… y así una larga cadena hasta llegar hasta la todopoderosa Verisign. Es lo que se conoce como la cadena de certificados.
Volviendo al tema inicial del Heartbleed, como indicaba el fallo estaba en la librería OpenSSL, que se utiliza para implementar el protocolo SSL/TSL. Este protocolo es la manera estándar que usan nuestros navegadores para asegurar que las comunicaciones son seguras, marca una pauta del estilo:
– Hola soy Mr Red, quiero establecer una conexión segura contigo Steam
– Hola Mr Red, soy Steam, este es mi certificado digital.
– Ok, compruebo que está firmado por Verisign correctamente. Genero una clave simétrica y te la mando cifrada con tu clave pública.
– Ok, ya la tengo,a partir de ahora nuestra comunicación estará firmada con dicha clave
– Sdfgdfgfhgyntymhjse5346bytwvrreh75b6b7n68e56b564635312d43crvgfhghftdv
– Sdtv564wvt678eg64548ik90,yb45647nvw42x3z4x54n67878y356w45n7
El problema que Heartbleed desveló es que mediante una serie de técnicas era posible extraer información de la memoria de los servidores que usaban la versión vulnerable de OpenSSL, y con suerte acceder a la clave privada de dicho servidor. De esa manera el atacante podría hacerse pasar por dicho servidor y leer cualquier cosa que le mandásemos, por ejemplo nuestro password de Steam.
Genial (como siempre) explicación del bug por parte de XKCD. Pulsar para ampliar
He sido un poco exagerado, porque si el programa está bien hecho las passwords nunca se envían por internet, ni cifradas ni sin cifrar, sino que se manda el resultado de aplicar una función hash a dicha password, después el servidor verifica que eso coincide con lo que tiene guardado en BD y da el login como correcto. De esta manera ni los propios informáticos de Steam deberían poder conocer nuestra password en texto claro, y si hackean su BD nuestras contraseñas (y tarjetas de crédito que siguen el mismo mecanismo, espero) estarán a salvo… durante un tiempo.
Ese tiempo es cada vez más corto por el aumento de la potencia de los ordenadores y por la existencia de una cosa llamada Tablas Rainbow que básicamente son tablas gigantescas de datos que tienen precalculadas las funciones hash más comunes. De esa manera si para pagar con tarjeta solo se necesitasen los 16 números que la identifican (se necesita por lo general además un nombre, fecha caducidad, ccv…)bastaría una tabla rainbow con 1016 entradas para conocer inmediatamente dado un hash el número de tarjeta que pertenece. Efectivamente esas tablas rainbow son de un tamaño considerable y costosísimas tanto computacionalmente como monetariamente (se venden en mercados azules oscuro casi negros), pero ínfimo en comparación al coste de un ataque por fuerza bruta sin ningún refinamiento.
De nuevo en referencia al Heartbleed: Si el atacante se hubiera hecho con la clave privada de Verisign se podría hacer pasar por CUALQUIERA, ya que podría firmar certificados falsos en los que confiaríamos automáticamente. El otro gran problemón de Heartbleed es que no se puede saber si el servicio ha sido atacado o no, tan solo si está entre los candidatos que son los que utilizaron desde la version 1.0.1 de Open SSL a la 1.0.1.f. Es por ello que ahora mismo se están revocando multitud de certificados digitales, es decir: marcar como inválidos el par de claves pública/privada, y creando unos nuevos. Si Verisign hubiera sido afectada no se me ocurre otra forma de solventarlo que mediante actualización del navegador/sistema operativo.
En fin, espero que ahora que os he explicado como funciona esto de la criptografía os quedeis más tranquilos sabiendo que vuestro dinero tan seguro en manos de los informáticos como en manos de vuestros representantes electos. Si no lo sentís así siempre podeis volver a la época en la que los hombres eran hombres y escribían sus propios drivers. Con un poco de suerte y el próximo divulgajare.