Los monederos físicos de bitcoin prometían mantener las claves fuera del alcance de los hackers. Alguien simplemente las adivinó

Wait 5 sec.

Quienes han invertido alguna vez en criptomonedas lo saben bien: los monederos físicos ("cold wallets") eran la forma ideal de protegerlos ante potenciales robos. Esos monederos siempre prometían lo mismo: que las claves que permiten mover el dinero nunca abandonan el dispositivo. Era mentira. Catástrofe. El pasado 31 de julio, cientos de propietarios de los monederos ColdCard vieron cómo en apenas 40 minutos su dinero desapareció de sus dispositivos. El atacante no tuvo que tener acceso físico a los dispositivos, ni infectarlos ni conectarse a ellos. Le bastó hacer algo que debería haber sido imposible: adivinar las claves para robar ese dinero. El robo ha afectado a 1.367 bitcoins, unos 89 millones de dólares a los precios actuales, que se han sustraído de 4.585 direcciones de monederos distintos. Es un robo "menor" comparado con otros en el pasado, pero lo significativo es cómo se ha producido. En Xataka Monederos físicos de bitcoin: qué son y cómo funcionan a la hora de proteger tus inversiones La caja fuerte seguía cerrada. El ataque ni siquiera rompió el aislamiento implícito de los monederos ni tampoco extrajo claves almacenadas en ellos. El fallo era aún más grave: se produjo en el momento en el que el dispositivo creó esas claves. Un monedero de bitcoin genera primero una semilla, una sucesión de datos aleatorios. De ella se derivan las claves privadas y las direcciones. Si esa semilla es realmente impredecible, probar todas las posibilidades resulta inviable, incluso para los mejores supercomputadores del planeta. El problema es qeu si la semilla no lo es, da igual que la caja fuerte (el monedero) esté totalmente aislada y cerrada.El azar que dejó de serlo. En 2021 los responsables de ColdCard cambiaron parte del código empleado para generar semillas al integrar una biblioteca llamada libNgU. La intención era recurrir al generador físico de números aleatorios del dispositivo. Sin embargo, un error de integración hizo que el programa acabara usando como alternativa un generador seudoaleatorio de MicroPython embebido que exponía la librería libsecp256k1 y otras primitivas de bitcoin, como explican en Coinkite en un repaso técnico del desastre de seguridad que se creó en las ColdCard. Parecía aleatorio, pero no lo era tanto. El generador alternativo tomaba datos como el identificador fijo del chip y varios registros relacionados con el reloj del dispositivo. Esos valores producen números que pueden aparentar aleatoriedad, pero que no son un recurso criptográfico suficientemente fuerte porque podían acotarse. Con suficientes conocimientos del firmware y del comportamiento del hardware, un atacante podía recrear fuera del dispositivo una lista de semillas candidatas. {"videoId":"x801dhd","autoplay":false,"title":"Cómo comprar Bitcoins de forma segura y sin riesgo", "tag":"", "duration":"331"} Fuerza bruta. En los modelos Mk2 y Mk3 afectados, Coinkite estima que el espacio efectivo para generar semillas se reducía a 40 bits. En los Mk4 y Mk5 había un elemento de entropía más, y las semillas crecían hasta los 72 bits. El análisis de los expertos de Block reveló cómo un problema en ese firmware en realidad hacía que las semillas se limitasen a tan solo 32 bits, lo que en esencia hacía que "adivinar" las claves ya no fuese virtualmente imposible, sino tan solo cuestión de potencia de cálculo y tiempo.Adivinando claves era cuestión de minutos. Esos 32 bits dan lugar a unas 4.300 millones de posibles claves distintas. Es una cifra enorme si un ser humano tuviera que comprobarlas todas, pero también es un número totalmente asumible para máquinas capaces de realizar cálculos masivos. Para cada semilla, el atacante podía averiguar las posibles direcciones y luego compararlas con la cadena de bloques de bitcoin. Cuando una coincidencia mostraba fondos, se obtenía a continuación la clave para moverlos. Daba igual que el monedero físico estuviese a buen recaudo incluso en una caja fuerte: el atacante ni siquiera necesitaba acceso a él porque con esos datos era como si tuviera ese monedero en sus manos.Atraco por oleadas. La primera gran operación de transferencia de bitcoins vació 1.082,65 BTC de 1.196 monederos en apenas 41 minutos el 31 de julio. Nuevos barridos acabaron elevando el total a 1.367 bitcoin, cerca de 89 millones de dólares. El estudio de Galaxy Research revela que lo más probable es que el responsable fuera un único atacante, aunque puede que simplemente varios atacantes diferentes exploraran el mismo conjunto de claves débiles. En Xataka 256 millones de dólares en Bitcoin, una contraseña perdida y dos intentos restantes: la historia de un ingeniero alemán incapaz de acceder a su cartera Actualizar no basta. Coinkite ya ha publicado actualizaciones de firmware que corrigen el problema para los dispositivos afectados. Instalarlo solo evita que se creen nuevas semillas defectuosas, pero no transforma en segura una semilla generada anteriormente. La recomendación de los creadores de ColdCard es la de actualizar primero, crear luego una semilla completamente nueva y trasladar los fondos. La paradoja del código abierto. Los responsables de la ColdCard reconocen que su código era público y que las revisiones anteriors comprobaron la presencia del generador físico de números aleatorios y semillas, pero no siguieron con detalle qué implementación usaba realmente la función que creaba las semillas. Ellos mismos confiesan haber usado un modelo avanzado de IA para intentar analizar la seguridad de su software, pero el problema no fue detectado. Se especula con que alguien pudo utilizar un modelo de IA para revisar versiones antiguas y localizar el fallo, aunque no hay pruebas de que la brecha de seguridad se haya encontrado de esa forma. Imagen | WikimediaEn Xataka | Un grupo de hackers de Corea del Norte firmó el mayor robo de criptomonedas de la historia. Ahora sabemos cómo lo hicieron (function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();