En resumen

  • Un error de firmware hizo que las carteras Coldcard generaran semillas a partir de un generador pseudoaleatorio de software en lugar del chip de hardware diseñado para esa tarea.
  • El error redujo efectivamente el espacio de búsqueda de 128 bits a aproximadamente 40 en modelos más antiguos.
  • Esto es lo que todo eso significa, y cómo llevó a que se robaran más de 130 millones de dólares en Bitcoin.

Alguien ha estado vaciando carteras de Bitcoin que nunca deberían haber sido accesibles.

Las monedas estaban en dispositivos Coldcard: carteras de hardware del fabricante canadiense Coinkite, del tipo que nunca toca Internet. Sin enlace de phishing. Sin malware. Sin portátil robado. Los atacantes simplemente dedujeron cuáles eran las claves privadas.

Galaxy Research ha rastreado más de 1.596 BTC robados en tres oleadas confirmadas, con una cuarta oleada sospechosa que elevaría el total a aproximadamente 2.055 BTC, unos 130 millones de dólares a los precios actuales. Un barrido movió 70 millones de dólares en 41 minutos. Coinkite dice que al menos 15 atacantes separados se han sumado.

La compañía publicó un documento técnico de antecedentes el 1 de agosto explicando qué salió mal. Es un documento inusualmente sincero, y la versión corta es que la cartera estuvo lanzando dados cargados durante ocho años sin que nadie lo notara.

Cero sigue siendo algo

En 2021, Coinkite trasladó la criptografía de Coldcard a libsecp256k1, la misma biblioteca que usa Bitcoin Core. Decisión acertada. La integración es donde se desmoronó.

La migración redirigió silenciosamente la generación de semillas desde el generador de números aleatorios por hardware de Coldcard hacia el respaldo por software de MicroPython: un pequeño algoritmo llamado Yasmarang que existe para dispositivos sin chip de aleatoriedad.

Coldcard tiene un chip de aleatoriedad. Simplemente dejó de ser consultado.

La razón es casi demasiado pequeña para creerla. Un guard de compilación usó #ifndef, que verifica si una configuración existe en lugar de si está activada. Coinkite había definido esa configuración como cero, lo que significa "apagado". Debido a que cero aún cuenta como definido, la verificación de seguridad pasó y la compilación se completó. Ambas versiones de la función tenían firmas idénticas, por lo que nada parecía mal.

"La mayor parte de la aleatoriedad en el COLDCARD provenía de un PRNG que no sabía que estaba realmente en la base del código fuente", escribió Coinkite, refiriéndose a un generador de números pseudoaleatorios: software que produce números que parecen aleatorios pero siguen una receta fija a partir de un valor inicial.

Alimenta la receta con el mismo valor inicial y obtienes la misma salida. Cada vez.

En los dispositivos Mk2 y Mk3 que ejecutan firmware 4.0.1 a 4.1.9, ese valor inicial provenía del número de serie del chip y su reloj. Coinkite estima que el espacio de búsqueda resultante es de aproximadamente 40 bits. Los modelos más nuevos mezclaron un poco de entropía del elemento seguro, elevándolos a aproximadamente 72 bits.

Ninguno es 128, el objetivo.

La brecha importa más de lo que parece. Los bits son exponentes. Un espacio de búsqueda de 128 bits contiene más combinaciones que átomos en el universo observable, y nadie lo busca. Cuarenta bits son aproximadamente un billón: un número que una computadora portátil decente puede procesar. Cada bit que pierdes reduce el trabajo a la mitad.

El equipo de ingeniería de Block, que publicó su propio análisis, situó el espacio de búsqueda efectivo del elemento seguro de los dispositivos más nuevos en 2^32 candidatos, con un promedio de alrededor de 2^31 intentos. Su evaluación para las placas más antiguas es más contundente: para un ID de dispositivo conocido, estado del temporizador e historial de llamadas, la generación de billeteras es determinista.

Y determinista es lo opuesto a aleatorio, que es esencial para la criptografía.

No "débil". Predecible.

Coinkite sospecha que fue encontrado por una máquina. "Tenemos que asumir que alguien usó IA para revisar versiones anteriores de nuestro firmware y se topó con este problema", escribió la compañía, añadiendo que recientemente había ejecutado uno de los mejores modelos de IA disponibles sobre el mismo código y no encontró nada. "Tanto atacantes como defensores tienen las mismas herramientas de IA, pero hoy no nos ayudó, y solo ayudó a los malos".

El firmware corregido está disponible para todos los modelos afectados. No repara las semillas existentes; esas billeteras deben regenerarse y los fondos deben moverse. Decrypt ha cubierto cómo el almacenamiento aislado cambia después de una explotación como esta y ha rastreado las pérdidas que superan los $114 millones.

Qué es realmente la entropía

La entropía es la medida de cuánto desconoce un atacante.

En otras palabras, es básicamente incertidumbre, contada en bits. Un bit es un lanzamiento de moneda: dos resultados, y un adivinador acierta la mitad de las veces. Diez bits son 1,024 resultados. Cada bit duplica la carga de trabajo del adivinador.

Una billetera de Bitcoin es un número muy grande mantenido en secreto. La dirección a la que la gente envía monedas se deriva matemáticamente de él, y la derivación funciona solo en una dirección: puedes ir de la clave a la dirección, pero nunca volver.

Así que la seguridad de cada billetera se basa en una pregunta: ¿Cuántos números tendría que probar un atacante?

Si el número se eligió con 128 bits de entropía, la respuesta es "más de lo que la física permite". Si se eligió con 40, la respuesta es "dame algo de tiempo".

Esta es la misma propiedad que hace que la amenaza de la computación cuántica valga la pena discutir: una máquina cuántica atacaría las matemáticas que vinculan la clave con la dirección. El error de Coldcard nunca necesitó eso. Hizo que las claves fueran adivinables antes de que esas matemáticas intervinieran.

Aquí es donde el vocabulario se vuelve resbaladizo. Un generador pseudoaleatorio produce una salida que pasa pruebas estadísticas de aleatoriedad, por lo que básicamente nada que una hoja de cálculo marcaría. Esa salida sigue estando completamente determinada por su valor semilla. Parece aleatoria pero no lo es.

La aleatoriedad estadística y la imprevisibilidad criptográfica son propiedades diferentes, y la salida de Coldcard habría pasado la primera prueba mientras fallaba completamente en la segunda.

La verdadera aleatoriedad tiene que provenir del ruido físico: fluctuaciones eléctricas en un circuito, fluctuación térmica, desintegración radiactiva. Para eso era el chip de hardware en el Coldcard. Ese es el chip que la bandera de compilación desconectó.

Entonces Luke Dashjr sacó los dados

Mientras los usuarios se apresuraban a regenerar semillas, muchos recurrieron a la solución obvia de baja tecnología. Los Coldcards te permiten lanzar dados físicos e introducir los resultados como entropía. La propia guía de Coinkite trata las semillas hechas con al menos 50 lanzamientos de dados independientes y privados como no en riesgo por el error.

Puede sonar estúpido, pero la empresa en realidad vende una bolsa con "100 lindos y diminutos dados" para facilitarte todo el proceso.

El 31 de julio, el desarrollador de Bitcoin Core, Luke Dashjr, publicó una advertencia: "Bastantes personas sugiriendo/usando dados para mitigar la vulnerabilidad de Coldcard. Tenga en cuenta que los dados comunes no están diseñados para ser criptográficamente seguros. Si va a hacer esto, probablemente debería comprar dados de casino de precisión. E incluso entonces, tenga otra fuente de entropía."

Bitcoin Twitter no se lo tomó con calma.

"jajaja ahora ni siquiera puedes tirar dados", escribió un usuario. "La autocustodia está acabada..." Otro preguntó si debería contratar a alguien con Parkinson para que los tirara. (No es agradable.)

Probablemente la respuesta más útil vino con aritmética. El desarrollador Justin Sharp calculó exactamente cuánto te cuesta un dado malo:

"Exagerado. Un d6 perfecto da 2.585 bits por tirada. Un dado notablemente sesgado, por ejemplo, con una cara que cae el 20% de las veces en lugar del 16.7%, todavía da alrededor de 2.55 bits. En 99 tiradas, eso es la diferencia entre ~256 bits y ~252 bits de entropía."

Cuatro bits de 256. Esa es toda la penalización por un dado visiblemente injusto.

Dashjr no se equivoca en que los dados baratos tienen un sesgo medible: los puntos moldeados por inyección eliminan cantidades ligeramente diferentes de plástico de cada cara, que es precisamente por lo que los casinos usan dados de precisión con relleno. Tiene razón en la física y se equivoca en lo que está en juego. Perder cuatro bits de 256 te deja en 252. El error de Coldcard dejó a los usuarios en 40.

Sin embargo, hay un argumento más agudo enterrado en su consejo, y no se trata de la tolerancia de fabricación. Se trata de no confiar en una sola fuente. El fallo de Coldcard no fue que su entropía estuviera ligeramente sesgada, sino que un componente dejó de contribuir silenciosamente y nada lo detectó.

Qué hacer al respecto

Si generó una semilla en un Coldcard afectado sin tiradas de dados (en serio) o sin una frase de contraseña BIP-39 fuerte, esa semilla está comprometida.

Actualice el firmware, genere una nueva semilla, verifique la huella digital, envíe una transacción de prueba y luego mueva todo. El aviso de Coinkite lo explica modelo por modelo. Las semillas exportadas llevan el defecto consigo: mover una semilla mala a una aplicación de billetera diferente no resuelve nada.

Para todos los demás, la conclusión no es que los monederos de hardware estén rotos o que los dados sean una trampa.

Es que "aleatorio" es una afirmación, y las afirmaciones necesitan verificación. El código fuente de Coldcard fue público todo el tiempo. El RNG de hardware previsto estaba justo ahí en el binario. Los revisores confirmaron que existía y nunca confirmaron que el generador de semillas realmente lo llamara.

Ocho años de auditorías examinaron el código correcto. Nadie comprobó si se ejecutaba.