¿El cifrado en linux ha sido vulnerado? – A propósito de la última carta de Ivan Alocco

Ivan, anarquista en prisión preventiva durante algún tiempo informaba en una carta de que la policía francesa ha podido acceder al contenido de sus ordenadores cifrados [1]. El portátil en cuestión tenía instalado Ubuntu y estaba cifrado. No se pudo acceder a otro dispositivo con Windows instalado y cifrado con Bitlocker [no es así: (según la propia policía) en una detención anterior intentaron acceder al disco duro cifrado con Bitlocker sin éxito, pero esta vez la Brigade d’appui en téléphonie, cyber-investigation et analyse criminelle entregó a la antiterrorista copias de ambos discos duros descifrados]. Iván explicó en su carta que la contraseña era de más 20 dígitos compuesta por letras, números y caracteres especiales.

No, el cifrado de discos de Linux ni ha sido vulnerado ni es “inseguro». Las prestaciones de la tecnología, así como los algoritmos, han evolucionado, por lo que conviene comprobar la configuración del cifrado y actualizarla si es necesario.

Desde entonces, ha habido discusiones en la web y en nuestro entorno sobre cómo ha sido posible, si un algoritmo criptográfico desactualizado en la instalación Ubuntu de Ivan podría ser el culpable, y lo que esto significa para la seguridad de otros sistemas Linux. Incluso recibimos afirmaciones de que el cifrado del sistema operativo Tails –que también es un sistema Linux– no es seguro debido a algoritmos obsoletos. El tema del cifrado de dispositivos no es fácilmente accesible para muchos, así que nos gustaría entablar un poco el debate con este texto.

Todos los sistemas operativos basados en Linux usan Linux Unified Key Setup (LUKS) para el cifrado de dispositivos de almacenamiento como discos duros, memorias usb o tarjetas sd. El origen de la suposición de que un algoritmo obsoleto podría ser el culpable en el caso de Iván es que la versión 18.04 de Ubuntu (lanzada en abril de 2018, como sugiere la abreviatura) todavía utiliza el estándar “LUKS1”, relativamente obsoleto, para el cifrado de discos duros, mientras que las instalaciones de Linux más recientes utilizan el estándar “LUKS” para este fin.[2] Para entender la relevancia de esto, es necesario tener una visión general del cifrado LUKS y comprender qué papel desempeña en él la llamada función de derivación de claves. Desgraciadamente, esto va a ser un poco técnico, aunque intentaremos desglosarlo lo mejor que podamos.

Linux Unified Keys Setup (LUKS) en pocas palabras

Un disco duro cifrado con LUKS está formado por un bloque dividido en dos partes: una cabecera sin cifrar y un cuerpo cifrado. El cuerpo contiene los datos cifrados propiamente dichos, mientras que la cabecera debe entenderse como un manual de instrucciones: qué algoritmo de cifrado se utiliza para el cuerpo, qué tamaño debe tener el cuerpo, en qué parte del disco duro se encuentra el cuerpo, cuál es el ID de la partición, etc. – Es algo parecido a esto

LUKS header information
Version: 2
UUID: d077227a-eb02-4349-ab5b-fd9494ade3a6
Data segments:
  0: crypt
        offset: 16764544 [bytes]
        length: (whole device)
        cipher: aes-xts-plain64
        sector: 512 [bytes]
        …

La cabecera también contiene la información sobre qué función de derivación de clave se va a utilizar durante el proceso de cifrado o descifrado. La derivación de clave es una conversión criptográfica de la contraseña en la clave con la que se cifró el cuerpo y con la que se puede descifrar. Contrariamente a lo que podría pensarse, la contraseña en sí no es la clave con la que se cifró el cuerpo, sino que la clave real se deriva a partir de ella. Más adelante explicaremos por qué es necesario este paso intermedio. De momento sólo es importante saber que existen muchos algoritmos diferentes para la derivación y que la información almacenada en la cabecera es necesaria para la derivación de la clave.

Visualicemos un ejemplo con la clave «dPhdWnv1.3k4d4,szv!»:

Ahora surge la pregunta de por qué es necesario el paso intermedio en lugar de simplemente cifrar/descifrar el cuerpo del disco duro directamente con la contraseña. En primer lugar, hay que tener en cuenta el escenario de ataque contra el que se supone que protege el cifrado: Nadie intentaría descifrar el algoritmo real – en este caso: AES-XTS-PLAIN64, considerado seguro. Por lo general, se intenta adivinar la contraseña simplemente probando todas las combinaciones de caracteres posibles. Este método se conoce como fuerza-bruta. Cada intento requiere potencia de cálculo, memoria y tiempo, por lo que normalmente se utiliza un ordenador excepcionalmente potente o un clúster de muchos ordenadores. También existe software específico que trabaja con listas de contraseñas conocidas o incluso con datos personales del propietario (idiomas, intereses, contraseñas utilizadas para otros servicios) para obtener combinaciones más probables.

Aquí es donde entra en juego la función de derivación de claves: La idea es alargar el proceso de descifrado mediante el paso intermedio de la derivación de la contraseña unos milisegundos de modo que no se note en el uso cotidiano de un portátil, pero aumente enormemente el esfuerzo de adivinar contraseñas en masa. La función de derivación de claves protege principalmente las contraseñas cortas y las que están compuestas por un conjunto reducido de caracteres: Para una contraseña de sólo 6 cifras, por ejemplo, la plétora de todas las combinaciones posibles se calcula muchísimo más rápido que para una contraseña alfanumérica de 20 caracteres.

La función de derivación de claves es muy exigente: Por un lado, deben ser capaces de soportar enormes clusters de ordenadores con una enorme potencia de cálculo y, al mismo tiempo, el cifrado y descifrado en ordenadores corrientes no debe llevar tanto tiempo como para que deje de ser práctico. La solución a este problema es, por simplificarlo al máximo, el desarrollo de algoritmos matemáticos diseñados de forma que, aunque se multiplique la potencia de cálculo, el tiempo necesario para obtener la clave siga siendo relativamente el mismo.

Vulnerabilidad en Ubuntu 18.04, Tails y otras

Una vez explicado el concepto de la función de derivación de claves, volvamos al portátil de Iván: Según su carta, tenía instalada la versión 18.04 de Ubuntu. Esta versión de Ubuntu todavía utiliza el estándar LUKS1, que a su vez utiliza una función de derivación de claves obsoleta (PBKDF2). Se sabe que esta función es poco útil contra hardware especializado [tarjetas gráficas] y, por tanto, ya no se considera segura. De ahí la suposición de que la anticuada función de derivación de claves permitió el acceso al portátil de Iván. Otras versiones también se ven afectadas por esta posible vulnerabilidad si su primera instalación fue hace mucho tiempo: De hecho, el algoritmo no suele actualizarse cuando se realiza una actualización completa de la versión [full-upgrade o dist-upgrade en Ubuntu] en una instalación existente (por ejemplo, de Ubuntu 18.04 a Ubuntu 22.04). [3] También se ha comentado que, hace varios años que la comunidad de desarrolladores que está detrás del sistema operativo Tails tiene en su lista de tareas pendientes el cambio al cifrado LUKS2, más seguro, pero aún no lo ha implementado. Esto parece haber llevado a otros a afirmar que el cifrado de las memorias usb de Tails es inseguro [4].

¿Qué se puede hacer? Básicamente, se trata de que muchas instalaciones antiguas de Linux utilizan un algoritmo obsoleto para cifrar el disco duro. Los usuarios con instalaciones antiguas tendrán que decidir si son tienen suficientes conocimientos en tecnología como para actualizar su cifrado ellos mismos – hay una guía para ello en nuestra wiki–, si reinstalar su sistema o bien aceptar el uso de un algoritmo obsoleto. No obstante, que esta vulnerabilidad halla tenido algún papel en el caso de Iván es sólo una suposición y no un hecho. La posibilidad de que fuera observado o filmado mientras introducía su contraseña, que reutilizara su contraseña en diferentes lugares, que la contraseña simplemente fuera insegura o incluso que el desgaste en el teclado pudiera haber dado pistas sobre ella, son todas explicaciones factibles para el acceso a sus datos. En vista de la vaguedad de la información, afirmaciones como «El cifrado de Tails ha sido vulnerado» parecen alarmistas y dudosas.

Es difícil estimar la gravedad real del algoritmo obsoleto: No hay duda de que una mejor función de derivación de claves que dificulte los ataques por fuerza-bruta contribuye en gran medida a la seguridad del cifrado de dispositivos. Sin embargo, esto no significa que todos los dispositivos que utilicen un algoritmo de derivación de claves obsoleto sean inseguros. Ante todo, la seguridad del cifrado LUKS depende de la seguridad de la contraseña, y aunque esta mejora con una buena contraseña, no empeora con un algoritmo de derivación de claves obsoleto. Una buena contraseña, por ejemplo una generada aleatoriamente, con la longitud suficiente y a partir de un conjunto suficientemente amplio de letras, dígitos y caracteres especiales, requiere una gran cantidad de tiempo, incluso con una función de derivación de claves obsoleta y con una cantidad extraordinaria de recursos. Sin embargo, no podemos estimar, ni estimamos, los recursos de los que dispone un posible atacante. Sin embargo, consideramos al menos improbable que tales contraseñas –incluso con una derivación de clave deficiente– se puedan romper por fuerza-bruta sin más.

Contraseñas seguras

Un breve apéndice sobre la seguridad de las contraseñas: Cuando se habla de una contraseña aleatoria, significa: generada por una máquina. Una contraseña inventada por usted mismo nunca será tan segura como una contraseña verdaderamente aleatoria: ¡Incluso la contraseña dPhdWnv1;3k4d4;szv! Parece segura a primera vista con sus letras minúsculas y mayúsculas, números y caracteres especiales. Sin embargo, es la forma abreviada de la frase alemana no tan secreta «Die Philosophen haben die Welt nur verschieden interpretiert; Es kommt aber darauf an, sie zu verändern.» con algunas vocales reemplazadas por números y algunos caracteres especiales añadidos. Estos y otros trucos similares son muy utilizados, pero se pueden adivinar fácilmente con un poco de investigación e intuición, por lo que no generan contraseñas seguras.

En su documentación, la comunidad Tails recomienda el uso de diceware passwords.

  1. https://lucharcontrael41bis.noblogs.org/2023/04/10/algunas-novedades-sobre-ivan/ y https://lucharcontrael41bis.noblogs.org/2023/01/20/algunas-notas-sobre-el-expediente-de-investigacion-contra-ivan-alocco/
  2. https://mjg59.dreamwidth.org/66429.html [ampliar con https://dys2p.com/en/2023-05-luks-security.html]
  3. Esto es comprensible en sí mismo: En el peor de los casos, jugar con la configuración de cifrado puede provocar la pérdida de datos y, naturalmente, querrás evitar esos riesgos al actualizar tu sistema.
  4. El equipo de Tails está trabajando en una solución, que se espera que esté disponible a finales de mayo con la versión Tails 5.13 : https://gitlab.tails.boum.org/tails/tails/-/merge_requests/1116

 

Fuente: systemli (onion) vía Act For Freedom Now