Hackeamos una escape room (sin querer)

11 minutos de lectura

Publicado:

El cofre del tesoro estaba herméticamente cerrado y protegido mediante un candado con una combinación de \(6\) letras. Nos quedaban todavía media docena de pistas encadenadas por resolver, cada una llevando a la siguiente, hasta la última, que habría de desvelarnos la clave del candado. Pero nosotros eso no lo sabíamos, así que conseguimos abrir directamente el cofre y terminar la escape room en un tiempo récord.

¿Cómo lo hicimos? Con un key recovery attack from partial information, es decir, un ataque de recuperación de clave a partir de información parcial, vamos, que aunque no sabíamos todavía la clave del candado sí teníamos parte de la información, y pudimos deducirla sin resolver las pistas intermedias, hackeando la prueba.

Llegaré al detalle de cómo lo hicimos más adelante, sin spoilers sobre la escape room, pero quiero detenerme un momento a explicar por qué he utilizado unos palabros en inglés del lenguaje del criptoanálisis, la parte de la criptografía dedicada a buscar vulnerabilidades en los sistemas criptográficos.

Y es que un cofre con un candado es una analogía perfecta de un esquema de cifrado de clave pública. Cualquiera con un candado puede meter algo en el cofre y cerrarlo, pero solo aquel que sepa la combinación que abre el candado será capaz de abrirlo y ver su contenido. Exactamente igual que cualquiera puede cifrar un mensaje con una clave pública pero solo aquel que tenga la clave secreta podrá descifrarlo y leer el mensaje.

Para que sea seguro tenemos que estar convencidos de que, sin la clave, no va a ser posible abrirlo. Para ello lo primero que se nos puede ocurrir es garantizar que la clave no va a ser fácil de adivinar. Es lo que se llama un ataque de recuperación de clave, o key recovery attack, intentar averiguar cuál es la clave y usarla para abrir el candado.

En nuestra analogía un ataque así se podría hacer por fuerza bruta, probando todas las posibles combinaciones del candado. Si tiene \(3\) dígitos con un poco de paciencia se pueden probar las \(1000\) combinaciones1, y tendremos que decidir si eso nos parece suficiente o queremos un candado con más seguridad. Si habláramos de un esquema de cifrado que puede ser atacado con un ordenador se suele buscar que como mínimo requiera \(2^{100}\) intentos2.

También hemos de asegurarnos de que la clave no se filtre, de nada sirve tener un candado con 6 dígitos si la clave está escrita en un post-it al lado del candado.

Password 123456 written on a paper
Contraseña apuntada en un post-it.

Este último no es un ejemplo tan chorra como parece, pueden encontrarse vulnerabilidades porque, a pesar de que el esquema de cifrado era seguro, los desarrolladores habían subido sin querer la contraseña a GitHub3, o porque directamente se había utilizado la contraseña por defecto y nadie la había cambiado4.

Aun así, que no se pueda adivinar la clave no es suficiente. Sabemos que usar la clave es una forma de descifrar el mensaje/abrir el cofre, pero lo que queremos es que sea la única forma. Por eso los esquemas de cifrados requieren modelos de seguridad más complejos que considerar únicamente un ataque de recuperación de claves, y por eso en una maleta con cremallera un candado puede evitar que se abra sola, pero no va a detener mucho a quien tenga un boli.

Videotutorial: abrir una maleta con candado usando un boli.

Aun así, a pesar de que hemos visto que no es lo único que tenemos que considerar, sí que es una condición de seguridad necesaria, porque si la clave es fácil de adivinar los malos ni siquiera tendrían que esforzarse, así que comprobar que no sea vulnerable a ataques de recuperación de clave es lo mínimo por lo que tenemos que empezar.

A partir de aquí la cosa se pone interesante cuando en vez de adivinar la clave de la nada pensamos cómo de difícil sería adivinarla a partir de alguna pista. Dependiendo de cuál sea la pista el problema puede pasar a ser algo menos complicado o completamente trivial.

Por ejemplo, imaginad que tengo un candado numérico de \(6\) dígitos cuya clave tengo apuntada en un papel, que muestro pixelado en la siguiente imagen. ¿Qué ventaja tendría un atacante que consiguiera robarme la mitad del papel?

clave pixelada
Clave de 6 dígitos pixelada.

Como la clave son \(6\) dígitos, y para cada uno de ellos tenemos \(10\) posibilidades, podría haber \(10 \times 10 \times 10 \times 10 \times 10 \times 10 = 10^6 \) combinaciones, un millón.

clave pixelada
Mitad izquierda de la clave de 6 dígitos.

Pero si nos roban la mitad del papel con los \(3\) primeros dígitos, como en la imagen anterior, ya solo tendrán que probar, como mucho, \(10 \times 10 \times 10 = 10^3\) combinaciones, mil. Aquí ya es interesante ver que la mitad de la imagen no hace que tenga que probar la mitad de las combinaciones, sino muchas menos. Cada dígito adicional son \(10\) veces más intentos, cada dígito de menos son \(10\) veces menos intentos, lo que se vuelve la mitad es el exponente, y por eso el número de intentos es la raíz cuadrada del anterior (\(1000 = \sqrt{1000000} \)).

Pero podría ser peor.

clave pixelada
Mitad superior de la clave de 6 dígitos.

Y es que, aunque en esta última imagen tenemos de nuevo la mitad del papel ya es suficiente para adivinar por completo que la clave es \(627652\) y solo haría falta un intento. Teniendo información incompleta, solo con la mitad del papel, abrir el candado puede volverse bastante más fácil o directamente sencillísimo. Y claro, esto es algo que queremos tener en cuenta desde el principio, porque siempre es posible que se filtre algo de información, y será mejor si provoca el primer caso (el problema se vuelve más sencillo pero sigue requiriendo bastante esfuerzo) y no el segundo (recuperar la clave se vuelve inmediato).

Volviendo a la escape room, en la que las diferentes pistas llevan hasta la clave, lo que sucedía era que para abrir el candado de \(6\) letras había que utilizar las letras que aparecían escritas en un lugar de la sala, en el orden que indicaba la última pista. Pero antes de llegar a esa última pista ya teníamos parte de la información sobre la clave (las letras que había que utilizar), se podía intentar hacer un ataque de recuperación de clave con información parcial (y en ese momento no sabíamos que una pista posterior nos iba a dar el orden).

Esto pasa no solo en escape rooms y en criptografía. Me apostaría la mitad de mi hacienda a que el código de seguridad del trabajo de esta persona tiene un \(1\), un \(4\), un \(5\) y un \(9\).

The numbers of the code for the security keypad at my work are all worn off
Teclado numérico con cirtas marcas de uso en los botones.

¿Y cómo de difícil pasa a ser adivinar la clave si sabemos los dígitos pero no el orden? Originalmente un código de \(4\) dígitos tenía \(10000\) posibilidades. Pero si sabemos los números que se utilizan, y como hay \(4\) números desgastados para un código de \(4\) dígitos sabemos que solo se utiliza una vez cada uno, entonces solo tenemos que contar las formas de ordenar (permutar) cuatro elementos. Tenemos \(4\) posibilidades para el primer dígito, solo quedan \(3\) para el segundo (porque ya hemos gastado uno), \(2\) para el tercero y el restante al final. Un total de \(4! = 4 \times 3 \times 2 \times 1 = 24\). No está nada mal haber reducido \(10000\) opciones a \(24\).

El candado que teníamos en la escape room tenía \(6\) letras, que pueden ordenarse de \(6! = 6 \times 5 \times 4 \times 3 \times 2 \times 1 = 720\) formas.

Imagino que el diseñador de la escape room había tenido esto en cuenta, porque \(720\) son demasiadas como para que en una escape room merezca la pena probarlas todas (como las \(1000\) opciones que quedan a partir de la mitad izquierda del papel), y así habría sido si esa hubiera sido la única información que teníamos.

Pero es que el candado no era un criptex como el de la primera de las siguientes imágenes, con todas las letras, sino un candado como el de la segunda, en el que no todas las ruedas tienen todas las letras.

Davincicryptex01wiki1.jpg
Imagen de CrIms0n - Transferida desde en.wikipedia a Commons. Dominio Público.
5-digit Wordlock locked with combination Basin and hardened shackle.jpg
Imágen de Mysid - Trabajo propio, Dominio Público.
Dos candados con letras, un cryptex (izq.) y otro más sencillo (dcha.).

Y sabiendo las letras puedes mirar en el candado en qué ruedas aparece cada una para deducir las posiciones. La información parcial que teníamos era suficiente para abrirlo (no es como tener la mitad izquierda del papel con la clave, es como tener la mitad superior). Lo probamos y…

¡¡Escape room superada!!

Extra:

Hay muchos ejemplos de filtraciones de información parcial, uno de ellos en esta misma entrada del blog. Pixelar la imagen con los \(6\) dígitos para despixelar la mitad quedaba muy visual, pero en realidad pixelar una imagen no oculta completamente la clave, los píxeles grandes no son del todo aleatorios y todavía tienen información sobre los dígitos pixelados.

De hecho los textos pixelados se pueden llegar a recuperar bastante bien, como explicaban en microsiervos.

ejemplo Depix
Ejemplo de la capacidad de Depix para recuperar texto de imágenes pixeladas, publicado por beurtschipper con licencia CC BY 4.0.

Y para terminar el ejemplo que más me vuela la cabeza, porque se me ocurrió un día pensando que era una idea paranoica pero por supuesto que alguien ya lo había intentado5. Es posible robar una contraseña utilizando únicamente el micrófono del ordenador.

Cada letra del teclado está a una distancia distinta del micrófono y se pulsan con distinta intensidad dependiendo del dedo que utilicemos, por lo que se escuchará más o menos fuerte, y esas diferencias tan sutiles son suficientes para averiguar aproximadamente en qué zona del teclado hemos tecleado cada carácter. No es perfecto, no nos dice directamente la contraseña, solo la posición aproximada de sus caracteres, o quizás un grupo de teclas posibles para cada pulsación, pero llevamos un rato discutiendo cómo solo un poquito de información puede hacer que recuperar una clave sea tropecientas veces más fácil que hacerlo sin ninguna información, así que yo, por si acaso, me silenciaré si tengo que poner la contraseña del correo mientras estoy en una videollamada.

  1. Habría que tener muy mala suerte para para no adivinar la clave hasta el último intento. También podría ser que tuviéramos muchísima suerte y probando una clave al azar acertáramos a la primera. Si hay \(1000\) posibilidades de media necesitaríamos \(500\) intentos. Para no complicar más el texto seguiré utilizando como medida de dificultad el número máximo de intentos con el que seguro seguro que podremos abrirlo. Cuando se trata de un esquema de cifrado, en el que se puede hacer algo más que ir probando, medir la dificultad de forma rigurosa necesita algo más de matemáticas, con probabilidades y notación asintótica, pero ese es un tema para otro día. 

  2. \(2^{100} = 1267650600228229401496703205376\) 

  3. Proactively prevent secret leaks with GitHub Advanced Security secret scanning 

  4. Google Earth Hacking - EaaS (Espionage as a Service) 

  5. D. Asonov and R. Agrawal, “Keyboard acoustic emanations,” IEEE Symposium on Security and Privacy, 2004. Proceedings. 2004, 2004, pp. 3-11, doi: 10.1109/SECPRI.2004.1301311