¡Actualiza tu encriptación de LUKS!

En abril de 2023 en este artículo un anarquista francés relata como su portátil encriptado con LUKS fue confiscado después de ser arrestado, y el material de la partición encriptada fue descrifrada y utilizada como prueba en contra suya. Su contraseña encriptada tenía supuestamente más de 20 caracteres e incluía una mezcla de mayúsculas, minúsculas, números y signos de puntuación. Esto apunta a que, incluso con una contraseña relativamente fuerte, las particiones de los discos pueden ser forzadas y exponer la información que hay en ellas. Entonces ¿cómo podemos hacer para proteger nuestra información?

¿Cómo funciona el cifrado de LUKS2?

Lo primero es entender cómo funciona el cifrado que nos ofrece Linux por defecto. El cifrado LUKS ( Linux Unified Key Setup ) es un cifrado de disco completo que encripta todo y es independiente del sistema de archivos. El algoritmo de cifrado que utiliza LUKS es AES. Un algoritmo de cifrado extremadamente popular y bien probado.  Lo importante es saber que, esencialmente, el cifrado de disco completo protege la información sólo cuando el sistema está apagado. 

Este cifrado de disco está formado por dos componentes:  cryptsetup  (espacio de usuario) y  dm-crypt  (kernelspace, Linux Kernel module).  La gestión de dm-crypt se realiza a través del comando cryptsetup : LUKS es una interfaz adicional para dm-crypt con el objetivo de simplificar todos los procedimientos criptográficos. 

En particular LUKS, proporciona un almacén de claves genérico en el área dedicada de un disco, con la capacidad de usar múltiples frases de contraseña para desbloquear una clave almacenada. Para ello se utiliza una «función de derivación de clave» o KDF. Una KDF es una función que toma una entrada (en este caso, la contraseña del usuario) y genera una clave. Esto hace que puedas cambiar tu contraseña sin tener que volver a cifrar toda la unidad; en su lugar, sólo tienes que volver a cifrar la clave de cifrado con la nueva clave derivada de la contraseña. Esto también permite tener varias contraseñas o mecanismos de desbloqueo por unidad. 

Los buenos KDF en lugar de realizar un simple cálculo para convertir una contraseña en una clave, realizan muchos cálculos volviendo más costoso el ataque de fuerza bruta a la clave. El número de cálculos realizados es generalmente configurable, con el fin de permitir compensar entre la seguridad (el número de cálculos que obligará a un atacante a realizar al intentar forzar la contraseña) y el rendimiento (la cantidad de tiempo que está unx mismx dispuestx a esperar a que su dispositivo genere la clave después de escribir su contraseña para que realmente pueda arrancar).

¿Entonces cuál es la vulnerabilidad de LUKS2 en un ataque de fuerza bruta a la clave?

El problema aquí a analizar es ¿quién es nuestro actor de riesgo? Hacer las cosas computacionalmente caras no ayuda mucho si tu adversario tiene la capacidad de probar un gran número de contraseñas en paralelo. Las GPUs(Unidad de Procesamiento Gráfico) son extremadamente buenas realizando el tipo de cálculos que los KDFs suelen utilizar, por lo que un atacante puede «simplemente» conseguir un montón de GPUs y lanzarlas al problema.

Los KDF que son costosos desde el punto de vista computacional no ayudan mucho a protegerse contra este tipo de ataques con GPUs. Sin embargo, hay otro eje de gasto que puede tenerse en cuenta: la memoria. Si el algoritmo KDF requiere una cantidad significativa de RAM, el grado en que puede ejecutarse en paralelo en una GPU se reduce enormemente.

El anarquista francés al que vulneraron sus datos utilizaba una versión LUKS1 con un formato de KDF conocido como PBKDF2. Este tipo de KDF no consume mucha memoria lo que le hace vulnerable a ataques con GPUs. En las distribuciones más modernas de Linux como Ubuntu 20.04 o Debian 10 se utiliza la versión de LUKS2 con un tipo de KDF conocido como argon2i, que tampoco es un KDF que consuma mucha memoria. Este error se ha corregido en las últimas actualizaciones de Debian y Ubuntu, generando por defecto un KDF conocido como argon2id que consume más memoria. Pero aún así es muy probable, que si hace mucho tiempo que no reeinstalas tu sistema operativo, el KDF que estés utilizando sea un argon2i.

Esto tiene una solución sin que tengas que reeinstalar tu sistema operativo de nuevo. Antes de hacer el siguiente procedimiento asegúrante de hacer una copia de seguridad de todos tus datos, porque si algo falla, puedes perder el acceso por completo a todo tu sistema.

¿Cómo modificar la llave LUKS2 de un KDF argon2i a argon2id?

Lo primero es asegúrate de que estás ejecutando una versión lo más actualizada posible de tu distribución. Quizás tu distribución te permita actualizar el cifrado de disco de LUKS a LUKS2, pero eso no significa que  realmente pueda soportar el arranque desde ella. En el caso de que tengas una distribución muy antigua te recomendamos una instalación desde cero. Por otro lado, si estás usando una partición /boot encriptada, detente ahora – versiones muy recientes de grub2 soportan LUKS2, pero no soportan argon2id, y esto hará que tu sistema no pueda arrancar.

Una vez estamos seguras de que nuestra distribución soporta LUKS2 Y el KDF argon2id debemos averiguar a qué dispositivo /dev corresponde con la partición cifrada, ésta estará resalta con la palabra crypt. Para ello escribe en tu terminal:

$ lsblk

Ahora ejecuta el siguiente comando para copiar las cabeceras de tu encriptación de LUKS. Cópialas a una memoria USB y si algo va mal podrás arrancar desde una imagen en vivo y recuperar tus archivos.

$ sudo cryptsetup luksHeaderBackup /dev/loquesea --header-backup-file /tmp/luksheader

¡No olvides, una vez hayas terminado todo el proceso y compruebes que funciona bien, de hacer un borrado seguro de las cabeceras guardadas!

Ahora ejecuta el siguiente comando para ver las cabeceras de tu LUKS

$ sudo cryptsetup luksDump /dev/loquesea

Busca la versión del LUKS y si tienes un LUKS1 debes actualizarlo a LUKS2. Ejecuta el siguiente comando y sigue la instrucción por pantalla.

$ sudo cryptsetup convert /dev/loquesea --type luks2

Una vez finalizado asegúrate de que el sistema sigue arrancando. Si no es así vuelve a restaurar la copia de seguridad de la cabecera. Si todo ha ido bien puedes continuar ejecutando.

$ sudo cryptsetup luksDump /dev/loquesea

Busca la línea PBKDF en cada keyslot. Si el PBKDF es «pbkdf2» o «argon2i», debes convertirlo a argon2id. Para ello ejecute lo siguiente y siga las instrucciones por pantalla.

$ sudo cryptsetup luksConvertKey /dev/loquesea --pbkdf argon2id

Si tienes varias contraseñas asociadas a tu unidad, tendrás varias keyslots, y tendrás que repetir esto para cada contraseña.

A veces en algunas versiones de LUKS2 no existe la opción LuksConvertKey por lo que tendremos que crear una nueva llave con el formato argon2id y luego borrar las llaves antiguas de formato argon2i. Si este es tu caso ejecuta el siguiente comando y sigue las instrucciones.

$ sudo cryptsetup luksAddKey /dev/loquesea --pbkdf argon2id

Una vez hayas creado la nueva llave pruébala antes de borrar la antigua. Reinicia el ordenador y prueba a entrar con tu nueva contraseña. Una vez esto ha funcionado vamos a borrar la antigua llave. Para ello ejecuta el siguiente comando y escribe la contraseña de tu llave antigua.

$ sudo cryptsetup luksRemoveKey /dev/loquesea
¡Felicidades ahora tu llave de contraseña LUKS2 es menos vulnerable a los ataques de fuerza bruta con GPUs!

<3 Agradecemos enormemente al autor/a de este artículo que explicó la vulnerabilidad y cómo solventarla y en el cuál hemos basado este artículo que has leído. <3

2 comentarios en “¡Actualiza tu encriptación de LUKS!

Los comentarios están cerrados.