título: Introducción a ChainLock, una herramienta para bloquear archivos importantes en Linux.

¿Cuál es el problema?

Digamos que tienes un archivo valioso en tu ordenador, algo como un archivo bitcoin wallet.dat. Seguramente quieres mantener tu billetera segura, entonces le pones una contraseña. Para mayor comodidad, eliges una contraseña corta y fácil, o una contraseña reutilizada, así puedes recordarla fácilmente. O incluso no te molestas en ponerle una contraseña, ya que no tienes mucho dinero allí.

Tal vez, has tomado las medidas para protegerte de clipboard hijacking malware, y ahora te preguntas cual es el siguiente paso. O tal vez no. De cualquier manera, todavía tienes un problema que resolver. Comúnmente, cierto malware tiene como objetivo robar tu archivo wallet.dat. Una vez que el atacante obtiene el archivo simplemente puede crackear la contraseña offline y transferir tus fondos a sus cuentas.

Además, en julio descubrimos un malware de clipboard hijacking que específicamente intenta evadir nuestra herramienta de cryptoclipwatcher. Claramente, debemos dar un paso delante y tomar la ventaja sobre los atacantes.

Dado que la herramienta original de CCW era para Windows, creamos algo para los usuarios de Linux. Queríamos que la herramienta sea accesible para todos, Y que pueda utilizarse para proteger archivos sensibles sin tener que hacer cosas como recompilar el kernel o configurando un SELinux. De esta forma nace una nueva herramienta, ChainLock. Que puede bloquear cualquier archivo de tu sistema Linux de tal forma que pueda ser accedido únicamente por una aplicación especifica. Por ejemplo, puedes bloquear tu archivo wallet.dat y garantizar que solo pueda ser accedido por tu aplicación de bitcoin de preferencia y no pueda ser copiado o abierto por malware.

¿Cómo lo instalo?

Puedes encontrar el .deb para sistemas de 64 bits aquí y el .apk para Android aquí. Adicionalmente, necesitarás tener instalado en tu sistema Linux tor y python3, y en tu Android necesitarás Orbit. También necesitaras un kernel con soporte fanotify, busca en /boot/config si tienes CONFIG_FANOTIFY=y y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y.

$ wget https://chainlock.e-paths.com/static/chainlock-1.0.0_amd64.deb
$ sudo dpkg -i chainlock-1.0.0_amd64.deb

Puedes verificar los archivos de descarga con los siguientes hashes:

$ sha256sum chainlock-1.0.0_amd64.deb
72be011da373273f87675ba18389be269122205833b496c4e827ea302c1db582  chainlock-1.0.0_amd64.deb
$ sha256sum ChainlockCompanion.apk
2fa1ee1e1ac9873098d2a1f55204c098dae1970d9f7753f8b86a8713b60b675d  ChainlockCompanion.apk

¿Cómo funciona?

Aquí tienes un ejemplo con comandos que puedes usar de guía. Utilizaremos un archivo vacío wallet.dat en una carpeta del usuario ~/.bitcoin.

$ chainlock --help
usage: chainlock [-h] [-l | -u | -i INITIALIZE INITIALIZE] [-t]

optional arguments:
  -h, --help            show this help message and exit
  -l, --lock            Lock all unlocked files.
  -u, --unlock          unlock the protected file
  -i INITIALIZE INITIALIZE, --initialize INITIALIZE INITIALIZE
                        Start protecting the target file (first argument),
                        allowing access with the specified binary (second
                        argument). Use the full path.
  -p UPGRADE, --upgrade UPGRADE
                        Change the authorized binary for a file.
  -t, --testing

Primero, incorporamos el archivo con el CLI. Este va a cifrar el archivo de destino con una contraseña segura (internamente utiliza gocryptfs), mueve el archivo cifrado a una carpeta especial y reemplaza el original con un enlace simbólico al archivo cifrado. Luego aparece un código QR en la pantalla que podemos escanear con la aplicación complementaria. Este código QR contiene la clave para descifrar el archivo, un código para identificar el archivo que se está protegiendo y el hash del binario al que se le permite acceder al archivo protegido.

$ mkdir -p ~/.bitcoin
$ cd ~/.bitcoin/
$ echo "Test Wallet." > wallet.txt
$ chainlock -i /home/user/.bitcoin/wallet.txt /usr/bin/cat
Please scan the QR code that pops up in your companion app.

Ahora, la clave para desbloquear el archivo protegido está almacenada únicamente en tu smartphone. Para tener éxito, un atacante debería comprometer los dos dispositivos para desbloquear el archivo sin tu permiso.

$ ll wallet.txt 
lrwxrwxrwx 1 root root 93 Aug 31 15:47 wallet.txt -> /opt/chainlock/dfs/9c14786eb41fd5edd2f834dbb0f39b57a95081d6f64ad07052270e5f67b6b765/protected

Eso se encarga de proteger el archivo cuando no lo utilizamos, pero los archivos cifrados no son muy útiles cuando tenemos acceder a ellos. Por eso, necesitamos una forma de descifrar el archivo, pero manteniendo el acceso únicamente a la aplicación que definimos previamente. Aquí es donde entra en juego fanotify. Fanotify nos permite situarnos como intermediarios entre una aplicación y un archivo. Cuando una aplicación solicita la lectura de un archivo, nos permite decidir si permitir o no esa petición.

Podemos usar la aplicación móvil para desbloquear un archivo. Simplemente, le especificamos que vamos a desbloquear un archivo. Internamente, una instancia de tor y un servicio oculto son lanzados. Aparece el código QR que contiene la información de cómo llegar al servicio oculto, como su dirección onion y la clave publica para enviar información. Con la aplicación complementaria podemos seleccionar el archivo que queremos desbloquear, luego escanear el código QR y la aplicación va a enviar la información necesaria para desbloquear el archivo al servicio oculto.

$ chainlock -u
Please open the Chainlock Android app, select the file you wish 
to unlock, and scan the QR code. You may need to scan a few times.
You may now close the QR code popup.
Reading Password from stdin
Decrypting master key
$ The option "-allow_other" is set. Make sure the file permissions protect your data from unwanted access.
Filesystem mounted and ready.

ChainLock inicia un daemon para vigilar el archivo y permitir el acceso solo desde el binario autorizado, y luego descifra el archivo para que pueda ser utilizado. ¡Ahora la billetera puede ser accedida únicamente por la aplicación especificada!

$ cat wallet.txt 
Test Wallet.
$ tac wallet.txt 
tac: failed to open 'wallet.txt' for reading: Operation not permitted
$ sudo su
# cat wallet.txt 
Test Wallet.
# tac wallet.txt 
tac: failed to open 'wallet.txt' for reading: Operation not permitted
# exit
exit
$

Pero ¿que pasa si el binario autorizado a acceder al archivo cambia o es actualizado? Ningún problema. Simplemente selecciona el archivo en la aplicación complementaria, ejecuta en el CLI el comando de actualización con la ruta del binario actualizado o nuevo y escanea el código QR. Ahora, cuando quieras desbloquear el archivo que seleccionaste, tu dispositivo Android le dirá a ChainLock que autorice al nuevo binario.

$ chainlock -p /usr/bin/less
$ chainlock -u
Please open the Chainlock Android app, select the file you wish 
to unlock, and scan the QR code. You may need to scan a few times.
You may now close the QR code popup.
Reading Password from stdin
Decrypting master key
The option "-allow_other" is set. Make sure the file permissions protect your data from unwanted access.
Filesystem mounted and ready.
$ cat wallet.txt 
cat: wallet.txt: Operation not permitted
$ tac wallet.txt 
tac: failed to open 'wallet.txt' for reading: Operation not permitted
$ less wallet.txt 
Test Wallet.
wallet.txt (END)
$ 

¿Me lo puedes enseñar?

Un video vale más que mil palabras: