Vulnerabilidad de número seudoaleatorio de Bitcoin

Las claves privadas de Bitcoin son un valor entero de 1 a 115792089237316195423570985008687907852837564279074904382605163141518161494337 o en HEX 1 a 0xfffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd6414140bbfd64. En la red principal de Bitcoin, hay direcciones que comienzan con 1: comprimido, sin comprimir; 3 direcciones: SigScript y versiones anteriores compatibles con SegWit, así como direcciones nativas de SegWit que comienzan con bc1. Además, ya hay alrededor de setenta tenedores con diferentes prefijos, pero las mismas raíces que el Bitcoin principal.

Las direcciones de Bitcoin se calculan mediante la función de firma criptográfica ECDSA () basada en una curva elíptica.

Entonces, considere la generación de una dirección de Bitcoin a partir de una clave privada.

Clave privada d - número
La clave pública Q es el punto de la curva elíptica igual a dG,
donde G es el punto base de la curva.

  • Para la firma, se selecciona un número aleatorio k en el rango [1, n-1].
  • Se calcula el punto de la curva (x1, y1) = k * G
  • Calcula r = x1 mod N, donde N es el orden de la curva.
  • Calcula s = k-1 (H (m) + rd) mod N, donde k-1 es el número inverso de N a k módulo N.
  • H (m) es el hash del mensaje que se firma.

imagen

La firma es un par (r, s).

La variable "k" es aleatoria y se obtiene en el algoritmo ECDSA de las bibliotecas estándar del sistema operativo.

Por lo tanto, en toda la función solo puede afectar esta variable. Lo que da dos vectores de ataque:

  1. vulnerabilidad de número seudoaleatorio
  2. y suerte universal en la que un número aleatorio cae dos veces


Ataque generador de números pseudoaleatorios


Nils Schneider fue el primero en investigar y publicar este problema el 28 de enero de 2013 en su página personal. Pero el problema persistió y, además, adquirió una nueva escala.

Un ataque de software en el PRNG se divide en tres tipos:
Ataque criptográfico directo basado en el análisis de la salida del algoritmo.

Los ataques basados ​​en datos de entrada se pueden dividir en ataques con datos de entrada conocidos, ataques con datos de entrada reproducibles y ataques a datos de entrada seleccionados.

Ataques basados ​​en revelar el estado interno en el que el atacante conoce el estado inicial o inicial del generador.

También se incluyen aquí marcadores en el software, en el que el creador del algoritmo conoce cualquiera de los números pseudoaleatorios hash y los siguientes en la cadena. Tal algoritmo es difícil de determinar desde el exterior, ya que los números se ven distribuidos uniformemente en todo el rango.

Las vulnerabilidades de software también incluyen una generación débil de números pseudoaleatorios en bibliotecas individuales. Como SSL, OpenSSL, algunas bibliotecas Java, JavaScript, etc. Materiales detallados se han descrito repetidamente en publicaciones periódicas de pirateo y con el tiempo se han convertido en ejemplos en los libros de texto de criptografía.

¿Cuál es la escala de la amenaza para Bitcoin?


Al tener un nodo de Bitcoin completo, puede comparar y agrupar todas las transacciones de red. Es suficiente comparar la variable "k" en todas las transacciones en cada dirección y encontrar duplicados.

La primera vez que hicimos la reconciliación a fines de 2016, la base de datos ascendió a más de 210 millones de direcciones, transacciones con un total de más de 170 millones de direcciones y firmas 447 millones. Tomó una semana escanear las direcciones vulnerables en diez hilos.

Como resultado, se encontraron 1327 direcciones vulnerables con las mismas firmas. Se puede encontrar una lista de direcciones al final del artículo.

Esto significa que puede calcular la clave privada de estas direcciones, lo que significa obtener control sobre el dinero.

La mayor fuga ocurrió en el verano de 2015. La billetera JavaScript Blockchain.info durante varias horas produjo el mismo valor de la variable "k". ¡Lo que llevó al robo de unos 200 Bitcoins!

Si eliminamos el factor humano de las vulnerabilidades del software, la probabilidad de coincidencia es aproximadamente del 0,000296868%. No mucho, pero realmente no me gustaría ser tan "afortunado" y perder mi dinero.

¿Cómo lidiar con eso?


Como describimos anteriormente, esta vulnerabilidad solo funciona cuando se envían pagos y se genera la misma variable "K" en al menos dos transacciones. Por lo tanto, si no crea transacciones salientes o minimiza su número, entonces no hay ninguna amenaza. Tal idea se ha implementado durante mucho tiempo en el protocolo Bitcoin BIP 32 (Carteras deterministas jerárquicas, billetera HD) Cartera determinista jerárquica.

Su idea es utilizar una clave privada de la que puede obtener una cadena interminable de direcciones de Bitcoin. Puede usar una dirección única para recibir cada transacción individual. Al mismo tiempo, el saldo de la billetera HD es la suma de todos los saldos de la cadena de direcciones. Y con una transacción saliente, se recopilan monedas de estas direcciones, lo que constituye una transacción saliente para cada dirección de Bitcoin. El cambio se dirigirá a la nueva dirección de Bitcoin de la cadena de direcciones.

Este esquema de trabajo aumenta significativamente la seguridad y el anonimato de la billetera.

Referencias

[1] ECDSA - Fallos de aplicación e implementación, Markus Schmid, UC SANTA BARBARA, CS 290G, FALL 2015.

[2] Nils Schneider: Recuperando claves privadas de Bitcoin usando firmas débiles de la cadena de bloques, entrada de blog, 28 de enero de 2013.

[3] Ataques combinados de recuperación de clave privada

[4] Lista de direcciones vulnerables y balance general

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


All Articles