Un error de programación de hace cinco años acaba de costar 88 millones de dólares
Durante 41 minutos, la madrugada del 30 de julio, alguien vació 1.196 monederos de bitcoin sin forzar ninguna puerta. No hubo phishing, ni malware, ni una contraseña robada: el atacante sencillamente ya tenía las llaves. La firma de análisis Galaxy Research cifró aquella primera oleada en 1.083 BTC, unos 70,2 millones de dólares. Dos días después, con la segunda y la tercera oleada contabilizadas, la cifra ascendía a 1.367 bitcoin —cerca de 88,6 millones de dólares— sustraídos de 4.585 direcciones. El origen de todo: un fallo en el generador de números aleatorios del firmware de los monederos físicos COLDCARD, fabricados por la canadiense Coinkite.
Cuando el azar deja de ser azar
Un monedero de hardware existe precisamente para lo contrario de lo que ha ocurrido: guardar las claves privadas en un dispositivo aislado, lejos del ordenador y de internet. Todo su valor descansa sobre una premisa sencilla: la semilla (seed) que da origen a esas claves debe ser imposible de adivinar. Y para que sea imposible de adivinar, tiene que nacer de una fuente de aleatoriedad real.
Los equipos de ingeniería y seguridad de Block, que analizaron el firmware junto a otros investigadores tras las primeras denuncias de robos, encontraron el problema. En palabras de su informe, «el firmware de COLDCARD contiene un error de integración en el RNG que hace que ngu.random utilice el generador determinista Yasmarang de MicroPython en lugar del RNG por hardware del STM32». Traducido: el dispositivo incorpora un chip diseñado específicamente para producir aleatoriedad de calidad criptográfica, pero una comprobación mal escrita en el código hacía que ese chip se ignorase y se recurriese al plan B por software.
Ese plan B se alimentaba del identificador del microcontrolador y de valores de temporización del sistema. Ninguno de los dos es secreto ni impredecible: son datos observables o reconstruibles. Con ellos, un atacante puede generar sin conexión millones de semillas candidatas, calcular las direcciones de bitcoin que les corresponderían y compararlas con las direcciones que cualquiera puede ver en la cadena de bloques. Cuando hay coincidencia, la semilla es correcta y las claves privadas caen solas.
La firma de un ataque automatizado
El patrón de las transacciones delata la mecánica. Todas pagaron exactamente la misma comisión, 30 satoshis por byte virtual, entre 30 y 75 veces por encima de la mediana de aquella semana, y ninguna dejó salida de cambio. «Eso parece una herramienta automatizada gastando claves que ya poseía, no propietarios moviendo fondos», resumió Galaxy. Chainalysis añadió un detalle inquietante: el atacante fue a por los monederos más gordos primero, se llevó unos 30 millones de dólares en los diez primeros minutos y vació 1,8 millones de una sola víctima. Había estudiado el terreno antes de entrar.
Y hay un dato que resume la asimetría de esta historia mejor que ninguna cifra: el saqueo se produjo unas 30 horas antes de que Coinkite publicase el aviso de seguridad. El fallo fue comunicado al fabricante el 30 de julio; los ladrones ya estaban dentro.
Qué modelos están afectados y qué hacer
Según el aviso de Coinkite, las semillas en riesgo son las generadas en Mk2 y Mk3 con firmware de la versión 4.0.1 a la 4.1.9, en Mk4 y Mk5 anteriores a la 5.6.0 estándar (o 6.6.0X Edge) y en dispositivos Q anteriores a la 1.5.0Q (o 6.6.0QX Edge). Los productos TAPSIGNER, OPENDIME y SATSCARD utilizan otra base de código y no se ven afectados. La compañía asegura haber destruido todas las unidades pendientes de envío que llevaban firmware vulnerable.
Aquí está la parte que conviene subrayar, porque es contraintuitiva: actualizar el firmware no arregla una semilla ya generada. El parche impide que el error vuelva a producirse, pero las claves creadas con el generador defectuoso siguen siendo débiles para siempre. El procedimiento correcto pasa por verificar la copia de seguridad existente, instalar el firmware corregido, generar y anotar una semilla nueva, comprobar la dirección en la pantalla del dispositivo, enviar una transacción de prueba pequeña y, solo entonces, mover el resto de los fondos. La copia antigua se conserva hasta que la migración esté confirmada. Coinkite indica que las semillas complementadas con al menos 50 tiradas de dado justas e independientes no corren riesgo por este fallo, y que una frase de contraseña BIP-39 fuerte dificulta la explotación, aunque no repara la semilla subyacente.
La lección incómoda
El episodio no cuestiona la idea del monedero físico, que sigue siendo mucho más segura que dejar las claves en un móvil o en un exchange. Cuestiona algo más profundo: que la seguridad de un sistema entero puede colgar de una sola línea de código que nadie revisó, en un componente que se da por hecho. La aleatoriedad es el cimiento invisible de toda la criptografía moderna —también la que protege el correo, la banca electrónica y las conexiones cifradas— y, cuando falla en silencio, no salta ninguna alarma. El dispositivo funciona, la pantalla muestra doce o veinticuatro palabras aparentemente irrepetibles y el usuario duerme tranquilo durante años. Hasta la madrugada en que deja de hacerlo.






