Saltar al contenido

Semilla-moneda y Seedsigner

En primer lugar, me gustaría explicar un poco las motivaciones, o las razones que me llevan a implementar esta funcionalidad añadida a Seedsigner.

Después de darle muchas vueltas, creo que la única forma segura de generar la entropía necesaria para nuestras semillas es mediante algún dispositivo que conozcamos y controlemos al 100%. Debemos tener control absoluto de todos los pasos del proceso, no podemos considerar ninguno de ellos como una caja negra que suponemos nos da la salida que esperamos.

Seedsigner se acerca mucho a esto. Posee ciertas características que lo hacen único en su clase, ya que cubre gran parte de los puntos de ataque más comunes. Es un dispositivo sin apenas conectividad, no tiene wifi, no tiene bluetooth, está construido con piezas de propósito general, etc… Pero, por desgracia, no tenemos el 100% del control de todo el proceso.

Por ejemplo, cuando utilizamos la funcionalidad de Seedsigner para generar la entropía de nuestra semilla mediante una fotografía, además de la fotografía en si, se están utilizando varias fuentes diferentes de aleatoriedad:

  • Fotogramas de antes de hacer la foto (mientras está apareciendo la imagen en la pantalla antes de que pulsemos el botón de hacer la foto, se está tomando info de ahi)
  • Los milisegundos que la raspberry pi ha estado encendida, etc…

A priori parece bastante seguro. Pero todo esto está ejecutándose apoyado en muchas capas de software que no conocemos a fondo, y que es difícil que alguien pueda auditar al 100%. Tenemos bibliotecas de terceros que calculan los hashes, que devuelven las palabras del bip39, hay módulos del kernel de linux que nos dan información, firmwares en los dispositivos…

A todo esto se suma, que el 99,9% de los usuarios de Seedsigner (si no más) han instalado directamente la imagen preconfigurada para grabar en la tarjeta SD y listo, y no se han bajado y verificado cada uno de los componentes uno a uno desde sus fuentes originales.

Yo creo, estoy casi seguro de hecho, que los chicos de Seedsigner son honrados. Pero, imaginad por un momento que alguien introdujese una modificación en alguna parte del código, en alguna biblioteca, algo que no sea muy obvio, y que bajo determinadas circunstancias, una de cada 100, o de cada 1000 veces, proporcionara una entropía que pudiese ser conocida por el atacante. Sería muy difícil que el usuario se diese cuenta de un ataque de este tipo, porque nadie genera 100 o 1000 semillas, pero si tienes miles de usuarios, alguien va a caer en la trampa sin darse cuenta.

Los ataques y los tipos de intentos de estafa en el mundo bitcoin se van a ir volviendo cada vez más rocambolescos y rebuscados, conforme las potenciales recompensas que puede obtener el atacante sean más y más jugosas. Vamos a ponernos a especular un poco (de una manera algo exagerada, eso si). Imaginad que el vendedor de aliexpress que vende las cámaras que usamos para montar un Seedsigner, se da cuenta que la mayoría de las cámaras que vende se utilizan para este fin. Esto puede llevar al vendedor a introducir un cambio malicioso en el firmware de la cámara para que, una de cada 1000 veces devuelva una foto en blanco, por ejemplo, pero la cual tiene un hash para el conocido. Si por mala fortuna alguien usa dicha imagen como entropía para generar una semilla, el atacante en principio tendría también acceso a esos fondos.

Por eso, el método de la semilla moneda, me parece el más interesante y el más seguro de todos, ya que, al ser un proceso analógico, podemos tener un mayor control sobre él. Solo necesitamos una moneda, papel y lápiz, no hay elementos intermedios que puedan ser atacados.

¿Cómo generar mi semilla con una moneda y la ayuda de Seedsigner?

Proceso completo de generación de semilla con una moneda y Seedsigner
  1. Descargamos la imagen modificada de Seedsigner y la grabamos en la tarjeta SD (también puedes encontrar el código modificado en este repositorio, por si quieres instalarlo a mano).
  2. Imprimimos la plantilla semilla-moneda para Seedsigner.
  3. Comenzamos a lanzar la moneda una vez por cada casilla de la plantilla. Si sale cara, marcamos con una X, y si sale cruz, la dejamos en blanco (también puede ser al revés, eso no importa). Para marcar la plantilla usaremos un rotulador negro de punta gorda.
  4. Cuando terminemos de rellenar la plantilla, en nuestro Seedsigner navegamos a Seed tools / Import coin-seed template
  5. Hacemos una foto de la plantilla, procurando que el recuadro de la plantilla ocupe el máximo de la pantalla. Es importante que los cuatro lados del recuadro queden visibles en la foto.
  6. Tomamos nota de las palabras obtenidas. En caso de que no se reconociera correctamente la plantilla, Seedsigner volverá a la pantalla de inicio y podemos volver a intentarlo.
  7. Las cuatro últimas casillas no es necesario rellenarlas, ya que son el checksum y seedsigner las va a calcular una vez lea la plantilla completa.

(Para más info del método semilla-moneda, consultar el articulo de Lunaticoin al respecto)

Esta modificación de Seedsigner lo único que pretende es hacer un poco más sencilla la importación de dicha semilla, el cálculo de las palabras correspondientes, y la posterior generación de las claves públicas y privadas. Debe usarse con cautela y siempre haciendo comprobaciones a mano de la semilla (don’t trust, verify!).

¿Ya es segura mi semilla?

Después de hacer todo esto… ¿tengo al fin una semilla a prueba de bombas?

Pues, de hecho, después de hacer todo esto, todavía nos queda un posible ataque del que debemos protegernos, y para el que debemos realizar unas comprobaciones para verificar que no se ha producido. Imagínate que has hecho todo el proceso de una manera completamente segura:

  • Has tirado una moneda las veces que hace falta.
  • Has rellenado la plantilla.
  • Has calculado algunas de las palabras a mano.
  • Has importado la plantilla con el seedsigner, para obtener las palabras en el dispositivo, y compruebas que coinciden con las que has obtenido a mano.
  • Has generado tu QR, y tu pubkey que importas felizmente en la wallet que vayas a usar (Specter, …).

Pero…. ¿Cómo sabes que ese pubkey corresponde realmente con la semilla? ¿y si ese pubkey apunta a otra semilla introducida por un atacante atacante?

Comprobar que un pubkey corresponde a una determinada semilla no es una operación trivial que se pueda calcular a mano. Por eso se hace imprescindible un segundo dispositivo, diferente del Seedsigner (puede ser un Ledger, un bitbox2, Trezor…) en el que podamos introducir las palabras y verificar que las direcciones que genera son las mismas que nos está dando el pubkey de Seedsigner. Solo así podemos estar 100% seguros de que el proceso no se ha visto comprometido en ninguno de los pasos.

Mi consejo: siempre es preferible pecar de exceso de cautela que quedarse corto. Si somos extremadamente cautos, lo más que podemos perder es algo de tiempo. Pero si nos quedamos cortos, podemos perder mucho más.

Sobre el autor de este artículo

Informático y apasionado por la tecnología.
Si te ha gustado el proyecto, puedes seguirme en Twitter @fgbernal o dejarme una propina a través de Lightning Network