Bad Daemons

Conociendo luks mediante cryptsetup

Antes de nada, empecemos por lo básico. LUKS es el estándar de cifrado de disco en GNU/Linux. Funciona sin importar la distribución que se use. No sólo cifra el disco, maneja de multiples claves del cifrado (tanto contraseñas cómo archivos de claves), permite revocar estas, es seguro ante ataques de entropia baja, entre otros. LUKS se hizo con dos cosas en mente: crear un estándar, cómo ya hemos dicho, y permitir el borrado o inaccesibilidad de los datos de manera rápida e incluso su camuflaje.

Esto último se hace manejando lo que se llaman las cabeceras de luks (luks headers in íngli). Un ejemplo de estas es lo siguiente:

# cryptsetup luksDump /dev/sdx2
LUKS header information for /dev/sdx2

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      e5 88 07 f2 4b ce 79 21 85 34 f7 a6 e3 0b 6b b2 a7 b8 d5 a1
MK salt:        0c dd 95 3d 1e 30 1f 66 d4 5e 31 03 12 a0 61 29
                e5 ef 34 8e 13 5d 80 76 8b 4a 0a c3 55 02 22 d3
MK iterations:  5750
UUID:           e4971160-047b-49ce-8246-b63f1fb67db9

Key Slot 0: ENABLED
        Iterations:             23233
        Salt:                   ff bc fc 78 98 5d 35 50 97 76 37 b4 70 99 38 44
                                9f bd a1 b9 02 2d 4d 1d 18 b5 dc f6 4c a0 37 fc
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Ahí se ven distintos datos que más o menos se podrán entender. Se ve que usa el cifrado aes con cifrado de bloques (cbc) salteado con sha1. También se puede ver que tiene una sola clave activada en el Key Slot 0, son su iteraciones, salt y esas cosas que parecen Matrix.

La cosa es que sta cabecera es lo que identifica un disco cifrado con luks cómo tal. Sin esta, no se puede saber que este es un disco cifrado. Pongamos el caso de un aeropuerto de uno de esos absurdos paises en los que si te ven con un disco cifrado, te pueden pedir que los abras para echarle un vistazo. Entonces, una solución para evitar eso sería cargarse la cabecera de luks y cuando pidan que se encienda poner la mejor cara de cuñao que tengamos y soltar algo del tipo "uff, no veas con el críptico mensaje este de 'Missing operating system', con lo que me costó estabilizar el condensador de fluzo". Y a volar, literalmente, esperemos. La gracia de todo esto es que, aún rompiendo la cabecera, si la restauramos podremos acceder a los datos cifrados cómo si nada.

Y eso es lo que veremos a continuación. Hacer un backup de las cabeceras de luks, que es algo recomendable porqué en el FAQ de cryptsetup vemos que la gente se las apaña para romperla sin hacer nada, cargarnoslas y restaurarlas.

Antes de nada, que quede claro que nadie deberia tocar si no está segura de lo que hace y, sobretodo, si no ha hecho un backup. Repetid conmigo: TENGO QUE HACER UN BACKUP ANTES DE TOCAR.

Al lío, el proceso es más sencillo de lo que puede parecer a primera vista:

# cryptsetup luksHeaderBackup /dev/sdx1 --header-backup-file portatil-header.bak

Dónde sdx es el nombre del dispositivo cifrado y portatil-header.bak es el backup del header. Sencillo, cómo prometí. Ahora nos cargaremos el header. Este se puede hacer a pelo, volcando archivos de /dev/zero en el inicio de la partición o dispositivo cifrado. Para no pasarnos de borrado, tenemos que hacer un pequeño cálculo. Cada keyslot o espacio de llave ocupa, apróximadamente unos 1052672 bytes. Así que deberiamos multiplicar este número por el número de claves que se tengan, da run margen de dos claves más y entonces hacer:

# cryptsetup -v isLuks /dev/sdx1
# head -c 3145728 /dev/zero > /dev/sdx1
# cryptsetup -v isLuks /dev/sdx1

Este seria el ejemplo para cargarse un keyslot. isLuks nos dice si el dispositivo en cuestión es un dispositivo luks. El primero debería devolver las siguientes líneas, respectivamente:

Command successful.
Command failed with code 22: Device /dev/sdb1 is not a valid LUKS device.

Otra forma de verlo es con gparted. gparted

Y para restaurar la cabecera, simplemente haremos:

# cryptsetup luksHeaderRestore /dev/sdx1 --header-backup-file portatil-header.bak
# cryptsetup -v isLuks /dev/sdx1

Y veremos que todo se ha restaurado correctamente. Precaución: Hay que ir con mucho cuidado, una de las cuatro veces que he probado se ha corrompido el sistema de ficheros y he tenido que formatear. No tengo muy claro porqué, pero creo que ha sido debido a que he volcado demasiados ceros. PD: para evitar poner cara de gilipollas al cargaros una clave:

# chattr +i clave.luks

Y así no la podréis borrar sin querer.

PD2: Puede que a más de una piense que lo suyo seria tener la opción de borrar la cabecera ante la inserción de una contraseña concreta o al meter tres veces una contraseña incorrecta. Aquí (el punto 5.21) explica su desarrollador que no lo ve útil ya que actualmente, quien accede a un disco duro lo primero que hace es clonarlo. En cualquier caso a raiz de la opción de nukear el disco en kali linux, surgió un debate en el que no queda claro que se puede hacer y que si al final se deciden a hacerlo, lo harán cómo una opción al compilar o alguna cosa similar, para alejar su uso al usuario medio.

Fuente: cryptsetup