Clave de cifrado de hardware de $ 3: ¿es esto posible?


El resultado final es una clave del tamaño de una unidad flash USB.

El cifrado generalizado y, como resultado, una gran cantidad de claves te hace pensar en su almacenamiento confiable. Almacenar claves en dispositivos externos, desde donde no se pueden copiar, se ha considerado una buena práctica. Hablaré sobre cómo hacer un dispositivo de este tipo por $ 3 y 2 horas.

¿Qué significa la imagen?
. . : « — , … , ...». , , )

Brevemente sobre los principios del trabajo.


La criptografía nos da la oportunidad de ocultar lo que queremos enviar, para asegurarnos de comunicarnos con la persona con quien pensamos y muchas otras cosas interesantes. Por lo general, para que todo esto funcione bien, solo nos piden una cosa: mantener en secreto nuestras claves de cifrado . Suena fácil, ¿no? Bueno, veamos cómo podemos ocultar nuestras llaves:

  • Guardar en un archivo en su escritorio es una forma antigua y comprobada de grabar algo a lo largo de los años. El problema es que, además del usuario mismo, muchos otros programas tienen acceso a los archivos en su escritorio. Y si está absolutamente seguro de que todos hacen lo que están destinados, no recopile ningún dato sobre usted y simplemente no los combine en la red; este artículo no es para usted.
  • — - , . , , , - -
  • — , . , . , . , ( ssh-) .

Como puede ver, el problema principal es que las claves se almacenan directamente en su computadora o se ingresan allí usando un teclado, una unidad flash, etc. Pero, objeta, ¿cómo cifrará mi computadora los datos si no conoce la clave? La respuesta correcta es de ninguna manera. La solución ha sido inventada por mucho tiempo. La idea principal es conectar un dispositivo especial a la computadora, que encriptará los datos. Y la computadora solo enviará datos y recibirá el resultado. Entonces, por ejemplo, muchas tarjetas inteligentes funcionan.



Componentes requeridos


Entonces empecemos. Montaremos nuestro dispositivo en un microcontrolador económico y bastante popular de la serie STM32. Por supuesto, puede hacer usted mismo una placa de circuito impreso , pero ¿queremos gestionarla en 2 horas? Así que tomemos una solución lista: el programador ST-Link v2. Este dispositivo se ve así.



Por extraño que parezca, el programador para microcontroladores STM32 está montado en el microcontrolador STM32. Este dispositivo se parece mucho a una unidad flash, que es justo lo que podemos hacer. Además, su cuerpo está hecho de aluminio, por lo que no puede preocuparse de que se dañe. Cuesta un milagro para aliexpress 1.5-3 dólares. Necesitaremos dos de estas cosas. Rehaceremos uno de ellos llave en mano y usaremos el segundo para cargar el firmware al primero. Si ya tiene un programador STM32, puede hacer una cosa.

Total, necesitamos:

  • Programador ST-Link v2 - 2 piezas
  • Soldador
  • Pocos cables: por regla general, los cables adecuados ya se incluyen con ST-Link
  • Linux, para compilar y cargar firmware

Compila el firmware


Entonces, comencemos con la parte del software: ensamblar el firmware para nuestra clave. Los códigos fuente del firmware se pueden encontrar en este repositorio . Sugeriría descargar la última versión estable (puede encontrarla en la pestaña de etiquetas). Puede clonar el repositorio o descargarlo como un archivo zip. Amasar los dedos, inicie la terminal y vaya a la carpeta del proyecto. Ir a la carpeta src

$ cd src

Para compilar y descargar el firmware, necesitamos instalar varios paquetes:

  • arm-none-eabi-gcc
  • arm-none-eabi-newlib
  • openocd

Uso el administrador de paquetes pacman, en mi caso se ve así


$ sudo pacman -S arm-none-eabi-gcc
$ sudo pacman -S arm-none-eabi-newlib
$ sudo pacman -S openocd

Si está sentado en Ubuntu, use apt.

Permíteme recordarte que estamos en la carpeta src del proyecto.
Ejecute el script de configuración

$ ./configure --vidpid=234b:0000

Ejecutamos la utilidad make y observamos cómo se compila nuestro firmware.

$ make

Después de la compilación, aparece la carpeta de compilación, y en ella el archivo gnuk.elf, lo necesitamos.

Descargar firmware al dispositivo


Ahora que tenemos el archivo terminado con el firmware, solo necesitamos descargarlo al dispositivo. Para esto, tenemos que trabajar un poco con un soldador. No se preocupe, no necesita ninguna habilidad especial, solo suelde 4 cables.

Entonces, tomamos uno de los programadores y sacamos el caso de él. El programador seleccionado será nuestro donante. Esto es lo que encontramos adentro.



Presta atención a los 4 pines en el tablero. Tendremos que soldarlos. Recomiendo usar los cables que vienen con ST-Link para esto. Limpiamos los cables de un extremo y los soldamos a los contactos. Si tenemos suerte, en el tablero habrá signos de estos contactos.

"

Ahora, conectamos el segundo extremo de los cables al programador completo restante. Si tiene suerte, solo conecte los cables de acuerdo con las inscripciones:

GND a GND
3.3V a 3.3V
SWDIO a SWDIO
SWCLK a SWCLK

Si no hay etiquetas en el tablero, tendrá que tocar al azar para usar el probador. Al usarlo, puede encontrar fácilmente GND (está conectado a GND en los terminales del programador donante), similar a 3.3V. Los dos cables restantes deberán conectarse al azar. Afortunadamente, solo hay 2 opciones. Como resultado, obtenemos algo similar a esto.



En esta foto, el dispositivo azul es el programador, que usamos solo como programador. No se confunda por el hecho de que en la foto al comienzo del artículo, el dispositivo final tiene un color de cuerpo azul. No es el. El futuro dispositivo está a la derecha.

Descargar firmware


Estamos a un paso del éxito, solo queda descargar el firmware. Abra la terminal, vaya a la carpeta con nuestro firmware (gnuk.elf).

Ejecute el comando:

$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c 'program build/gnuk.elf verify reset exit'

Entonces, ahora hemos subido el firmware a nuestro dispositivo. Quedaba un paso: prohibir la lectura de la memoria del microcontrolador. ¡ATENCIÓN! Esta es una etapa muy importante, que no permitirá que la persona que robó su clave extraiga información secreta.

Para hacer esto, ejecute el comando:

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "stm32f1x lock 0" -c reset -c exit   

Ahora todo está listo.

Poniendo todo de vuelta


Ahora que todos los pasos están atrasados, queda por cuidar la apariencia de nuestro dispositivo. Soldamos los cables. Tampoco necesitamos la barra de contacto original, por lo que puede soldarla de forma segura.



Rompa el soporte y suelde los contactos uno por uno.



Ahora volvemos a colocar la caja y sellamos la pared posterior con una pieza de plástico adecuada.

Como puedo usar


Lo que hemos ensamblado es un emulador de tarjeta inteligente OpenPGP . Tal tarjeta puede almacenar GPG, claves SSH. El alcance es bastante grande, por ejemplo:

  • Firmando git commits: ya se ha planteado un problema de seguridad aquí
  • Almacenamiento de claves SSH
  • Cifrado y firma de correo electrónico S / MIME : no se verificó, pero escribieron que funciona
  • Ingreso al sistema operativo sin contraseña: una buena guía ya está en el concentrador

Como puede ver, puede hacer muchas cosas interesantes y útiles.

Ejemplo de uso para ssh


Y al final, veamos cómo puede usar esta clave para almacenar claves ssh y conectarse a un servidor remoto.

Hay dos formas: generar una nueva clave o importar una clave existente en un token.

Veamos ambas opciones. Inserte el token en USB. En dmesg puede ver información sobre el dispositivo conectado.


$ dmesg
[11073.599862] usb 1-3: USB disconnect, device number 11
[11311.647551] usb 1-3: new full-speed USB device number 12 using xhci_hcd
[11311.796881] usb 1-3: New USB device found, idVendor=234b, idProduct=0000, bcdDevice= 2.00
[11311.796884] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[11311.796885] usb 1-3: Product: Gnuk Token
[11311.796887] usb 1-3: Manufacturer: Free Software Initiative of Japan

Nueva generación de claves ssh


Es importante comprender que la clave se genera en el dispositivo en sí y no en su computadora. Por lo tanto, dicha clave nunca abandona el dispositivo.

Ir a gpg:


$ gpg --card-edit

Se abre el modo interactivo gpg, habilite el modo administrador con el comando admin:


gpg/card> admin

A continuación, ejecute el nuevo comando de generación de claves:


gpg/card> generate

El siguiente es el procedimiento estándar de generación de claves gpg. Durante el cual se le pedirá que guarde la clave de respaldo en el disco. Los desarrolladores recomiendan hacer copias de seguridad, pero tú decides.
Lo único es que se admite la generación de hardware de claves RSA de hasta 2048 bits. Si necesita 4096, tendrá que generar la clave en la computadora y luego importarla al dispositivo mismo.
A continuación, necesitará códigos PIN. De manera predeterminada, los siguientes códigos PIN están protegidos en el firmware:

PIN DE TARJETA - 123456
PIN DE ADMINISTRACIÓN - 12345678

En el futuro, deben cambiarse.

La clave se puede generar un poco más de tiempo que si se generara directamente en la computadora, por lo que tenemos un poco de paciencia.

Importar una clave existente


Ahora veamos qué hacer si ya tiene una clave ssh que le gustaría usar.
Para hacer esto, importe la clave en gpg:


$ pem2openpgp temporary_id < id_rsa  | gpg --import

Ahora necesitamos encontrar la identificación de la clave. Para hacer esto, enumere todos los disponibles en gpg:


$ gpg -K

Y encontramos la clave importada:


sec>  rsa2048 2020-02-05 [C]
      DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC
      Card serial no. = FFFE 87144751
uid           [ unknown] temporary_id


En mi caso, la identificación de la clave es DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC

Vaya al modo interactivo para editar la clave gpg:


$ gpg --edit-key DFEFF02E226560B7F5A5F2CAB19534F88F8FE4EC

Y le damos el comando de copiar la clave a la tarjeta inteligente:


gpg> keytocard

Todo, la clave está grabada.

Exportar clave pública en formato ssh


Obtenemos la clave pública deseada del token para ponerla en el servidor:

$ pkcs15-tool --list-keys

En mi caso, la salida se ve así:


Using reader with a card: Free Software Initiative of Japan Gnuk (FSIJ-1.2.15-87144751) 00 00
Private RSA Key [Signature key]
	Object Flags   : [0x03], private, modifiable
	Usage          : [0x20C], sign, signRecover, nonRepudiation
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 2048
	Key ref        : 0 (0x00)
	Native         : yes
	Auth ID        : 01
	ID             : 01
	MD:guid        : f3de5f55-d100-4973-d572-40d67e20f033

Aquí estamos interesados ​​en la clave de ID de la clave, en mi caso 01. Ahora exportamos la clave pública:


$ pkcs15-tool --read-public-key 01

Copie la clave pública en el archivo pub.key:


-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyzHQIWEApliWYaf0T8jb
Vh2nc5+LklKXeuJFTN3BW2VqdrTw1rpKXiANWpi+qbtZhZ2nP3CJX6qoGobXyCOd
/iAiygFlyW4BwTQpnAm81IE9lPzfasOK7SBuKJ+ZbB4WpuYJRozgtt/gpWzmnWnW
84/CU9Lqbhz95v/C/DImSf6LiwVdmiEj4CUNInl5pY4trguDsSfkw1u8gGqSPEsD
ZXtlVRx8iBGi0JR02g9KTL4dDGocUtcTK8W0eY+BDbQSXfTGCy93v8sEyhdQjHs8
oDiwkvFQ86gYqwL5DJ7U/rFSO3A5X6zmkFFV8nJZjxB2qfE5aommtXxow4iPml3x
YwIDAQAB
-----END PUBLIC KEY-----

Y conviértalo a formato ssh-rsa:


$ ssh-keygen -f pub.key -i -mPKCS8 

Resulta la clave pública en el formato deseado:


ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLMdAhYQCmWJZhp/RPyNtWHadzn4uSUpd64kVM3cFbZWp2tPDWukpeIA1amL6pu1mFnac/cIlfqqgahtfII53+ICLKAWXJbgHBNCmcCbzUgT2U/N9qw4rtIG4on5lsHham5glGjOC23+ClbOadadbzj8JT0upuHP3m/8L8MiZJ/ouLBV2aISPgJQ0ieXmlji2uC4OxJ+TDW7yAapI8SwNle2VVHHyIEaLQlHTaD0pMvh0MahxS1xMrxbR5j4ENtBJd9MYLL3e/ywTKF1CMezygOLCS8VDzqBirAvkMntT+sVI7cDlfrOaQUVXyclmPEHap8Tlqiaa1fGjDiI+aXfFj

El siguiente es el procedimiento estándar para configurar ssh para iniciar sesión con una clave determinada: debe agregar la clave al archivo ~ / .ssh / Authorised_keys en el servidor remoto.

Configuración ssh


Ahora, para ingresar al servidor utilizando nuestro token, debe llamar a ssh con el interruptor -I y pasar la ruta al controlador del token. Nuestro token es compatible con uno de los controladores estándar, por lo que lo utilizaremos

$ ssh -I /usr/lib/opensc-pkcs11.so martin@remotehost

Sin embargo, será más conveniente usar el archivo de configuración (~ / .ssh / config).
Agregue las siguientes líneas.

Host digitalOceanServer
        HostName 192.168.0.1
        User root
        PKCS11Provider /usr/lib/opensc-pkcs11.so

La llamada ssh ahora es aún más fácil:


$ ssh digitalOceanServer

Cómo cambiar los códigos PIN estándar


Un paso igualmente importante será instalar sus propios códigos PIN. Primero debe comprender que se utilizan dos códigos PIN diferentes:

  • Código PIN: este código se utiliza para operaciones de rutina con una tarjeta inteligente, para cifrar algo, firmar, etc.
  • Código PIN de administrador: este código es necesario para cambiar / eliminar claves y hacer todo tipo de cosas de "administrador"
  • Restablecer código: un código que le permitirá desbloquear el token después de tres intentos incorrectos de ingresar el código PIN. Su uso es opcional, por lo que depende de usted

Solo tiene 3 intentos para cada uno de los códigos. Después de lo cual se bloquea el token.

Ahora comencemos. Para hacer esto, volvemos al modo GPG interactivo:


$ gpg --card-edit

E ingrese el comando passwd:


gpg/card> passwd

Se abrirá una ventana donde puede cambiar el código PIN del token.

Ahora necesita cambiar el PIN del administrador. Para hacer esto, vaya al modo administrador:


gpg/card> admin

Ingrese el comando passwd nuevamente:


gpg/card> passwd

Sin embargo, ahora funciona en modo avanzado y se nos ofrecerán varias opciones:


1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection?

Seleccionamos cambiar PIN de administrador y establecemos la contraseña de administrador de acuerdo con el esquema estándar. Permítame recordarle que el PIN de administrador predeterminado es 12345678.

Sobre la seguridad del dispositivo


Por supuesto, por $ 3 no puede lograr un nivel de seguridad clave por más de 200 dólares. Sin embargo, el dispositivo ensamblado se puede considerar como una clave de nivel de entrada. Hasta donde yo sé, las claves de fábrica de Nitrokey Start usan el mismo firmware. En cualquier caso, el uso de dicho dispositivo aumentará la seguridad en al menos un nivel más alto. Así que esta es una excelente manera de comenzar a usar llaves de hardware.

Ahora hablemos un poco sobre lo que sucederá si pierde esta clave. La clave en sí está protegida por un código pin. Después de varios intentos fallidos, la clave está bloqueada. La memoria del dispositivo en sí está protegida contra la lectura, por lo que no funcionará directamente para leer las claves escritas en él.
Hay algunos tipos de ataques en el chip en sí (por ejemplo, la preparación y conexión de microelectrodos, que le permitirán medir el voltaje en cualquier parte del chip, incluida la memoria), pero son bastante caros.

Entonces, repito nuevamente, esta es una excelente opción de nivel de entrada, e incluso con ella, la seguridad alcanzará un nivel completamente nuevo.

Enlaces a materiales útiles.


En el proceso de uso del dispositivo, sin duda habrá una necesidad de información adicional. Puse una lista de buenas fuentes.


El dispositivo que hemos ensamblado está siendo desarrollado por el proyecto GNUK de código abierto (en realidad, se llama un token), por lo que se puede encontrar más información en Google a pedido de "GNUK".

Upd. Los comentarios sugirieron que hay firmware que le permite usar el dispositivo para la autenticación de dos factores. El código del firmware se puede encontrar aquí
Upd. 2 15/02/2020 Los comentarios sugirieron que para este chip en particular existe una vulnerabilidad que podría drenar el contenido de la memoria. Según tengo entendido, aún no se ha publicado, pero se ha anunciado. Entonces, por ahora, no todo está claro. También sugirieron una buena solución: vierta epoxi en el cuerpo del dispositivomezclado con polvo de aluminio. Este método fue descrito en el libro de Kevin Mitnick, "El arte del engaño". Por lo tanto, para obtener acceso al chip, será necesario romper el pegamento que, si se maneja descuidadamente, puede dañar permanentemente el chip. Por supuesto, este método se puede eludir, esto aumenta el costo de piratear aún más. Por supuesto, si es necesario, el Mossad hará sus cosas en el Mossad y esto no lo detendrá, sino que solo lo retrasará.
Upd. 3Muchos mensajes llegaron al PM que la gente no puede obtener el firmware ST-Link. Después de descubrirlo, descubrimos que ahora los fabricantes chinos comenzaron a ahorrar activamente en componentes y usar chips con 64Kb de memoria a bordo. Y esto no es suficiente para el firmware, busque un chip de 128 Kb a bordo. Por lo tanto, recomiendo que al comprar compruebe qué chip está instalado (si es posible) o consulte con el vendedor / en las revisiones.
Upd. 4 Resulta que todavía puede usar programadores chinos con un chip de 64 KB (aunque tendrá que usar la última versión de firmware); un artículo interesante sobre esto apareció en el concentrador .

Source: https://habr.com/ru/post/undefined/


All Articles