Informe completo del incidente · 16 fuentes · Anzen Lab

Cuatro líneas de código.
Más de 1.596 BTC perdidos.

En marzo de 2021 una compilación de firmware de COLDCARD dejó de pedir números aleatorios a su chip de hardware y en su lugar hizo que software ordinario los calculara. Nadie lo descubrió durante cinco años. En julio de 2026 los atacantes hicieron las cuentas y empezaron a vaciar las carteras.

Lo que costó la configuración
5 años
el fallo permaneció en código totalmente público, desapercibido1
1.596+ BTC
confirmado robado de unas 7.300 direcciones, y sigue subiendo7
41 min
el mayor robo individual: 1.083 BTC, unos 70 millones de dólares en ese momento9
1 entre un billón
las probabilidades que un atacante tenía que superar en un Mk3. El diseño exigía una posibilidad entre un número con 78 dígitos1
Qué salió mal

Una comprobación de seguridad que estaba ahí y no hizo nada

01

Toda la protección depende de un número que nadie puede adivinar

Una cartera de hardware hace varias tareas. Te muestra lo que estás firmando realmente en lugar de pedirte que confíes en la pantalla de un ordenador infectado, y mantiene tu clave dentro de un chip diseñado para resistir aperturas físicas. Cada una de esas defensas presupone que el número del que salió tu clave no se podía adivinar. Si se pudiera, un atacante nunca tendría que superar ninguna de ellas. El conjunto del que se extrae una frase de 24 palabras contiene aproximadamente un número por cada mil átomos en el universo observable. Un conjunto de ese tamaño no se puede buscar. Ese es todo el modelo de seguridad.

Detalle técnico

12 palabras contienen 128 bits de entropía, 24 contienen 256, además de una suma de comprobación obtenida mediante el SHA-256 de dicha entropía. BIP-39 extiende el resultado para generar la clave maestra de BIP-32.

Detalle técnico

12 palabras contienen 128 bits de entropía, 24 contienen 256, además de una suma de comprobación obtenida mediante el SHA-256 de dicha entropía. BIP-39 extiende el resultado para generar la clave maestra de BIP-32.

02

COLDCARD dejó de extraer números de ese conjunto

Un cambio en el firmware realizado en 2021 hizo que la cartera dejara discretamente de pedirle ese número a su chip de aleatoriedad dedicado y pasara a calcular uno mediante software ordinario. Vista lado a lado, esta es la incidencia al completo:

Eso no es seguridad reducida a un tercio. Cada bit duplica el trabajo, por lo que 88 bits menos reducen la tarea en un factor de 2⁸⁸. Un billón es un número grande para una persona y pequeño para alguien que alquila máquinas de alto rendimiento para procesarlo.

Detalle técnico

La generación de semillas pasó de ckcc.rng_bytes() a ngu.random.bytes(). Coinkite estima unos 40 bits de espacio de búsqueda restante en el Mk3 y unos 72 en el Mk4/Mk5/Q, frente a un objetivo de 128 bits. Un análisis independiente de Block llega al mismo orden (por debajo de 2⁴⁰·⁷ y de 2⁷³·³) y encuentra condiciones más restrictivas donde queda mucho menos.2

Detalle técnico

La generación de semillas pasó de ckcc.rng_bytes() a ngu.random.bytes(). Coinkite estima unos 40 bits de espacio de búsqueda restante en el Mk3 y unos 72 en el Mk4/Mk5/Q, frente a un objetivo de 128 bits. Un análisis independiente de Block llega al mismo orden (por debajo de 2⁴⁰·⁷ y de 2⁷³·³) y encuentra condiciones más restrictivas donde queda mucho menos.2

De dónde deberían extraerse las 24 palabras
115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936
De dónde extrajo COLDCARD realmente las palabras
1,099,511,627,776
03

Porque el software no puede ser aleatorio

Piensa en qué hace que el lanzamiento de una moneda sea impredecible. La fuerza del lanzamiento, la gravedad, una corriente de aire de un aparato de aire acondicionado, ligeros temblores en el suelo. Docenas de influencias que puedes nombrar y docenas que no. Nadie puede calcular la trayectoria, así que nadie puede adivinar el resultado. El software funciona de otra manera. Ejecuta una fórmula fija sobre un puñado de valores iniciales y produce una respuesta fija. Aquí esos valores eran el número de serie del chip y el tiempo que el dispositivo llevaba encendido. Un atacante que aprende la receta y los ingredientes vuelve a calcular el resultado en lugar de adivinarlo.

Detalle técnico

Con el generador de números aleatorios de hardware desactivado, rng_get() se vinculó al PRNG Yasmarang de MicroPython, inicializado a partir de un estado no secreto (UID, SysTick, RTC) y no recopiló nueva entropía después de eso, por lo que los candidatos se enumeran sin conexión. Coinkite no considera que las semillas mezcladas con 50 o más tiradas justas y privadas estén en riesgo solo por este problema: 50 × log₂6 ≈ 129 bits.3

Detalle técnico

Con el generador de números aleatorios de hardware desactivado, rng_get() se vinculó al PRNG Yasmarang de MicroPython, inicializado a partir de un estado no secreto (UID, SysTick, RTC) y no recopiló nueva entropía después de eso, por lo que los candidatos se enumeran sin conexión. Coinkite no considera que las semillas mezcladas con 50 o más tiradas justas y privadas estén en riesgo solo por este problema: 50 × log₂6 ≈ 129 bits.3

04

Y la comprobación destinada a evitarlo formulaba la pregunta incorrecta

Había una salvaguarda en la compilación, escrita específicamente para evitar que el firmware se enviara sin el generador de hardware. Preguntaba si existía un ajuste, no si el ajuste estaba activado. El ajuste existía y estaba desactivado. La salvaguarda se quedó callada, la compilación no informó de errores y el firmware se envió.

Detalle técnico

#ifndef solo comprueba si está definido. La configuración de placa definió MICROPY_HW_ENABLE_RNG como 0, definido y desactivado, por lo que el #error nunca se activó y el enlazador resolvió rng_get() recurriendo al software.3

Detalle técnico

#ifndef solo comprueba si está definido. La configuración de placa definió MICROPY_HW_ENABLE_RNG como 0, definido y desactivado, por lo que el #error nunca se activó y el enlazador resolvió rng_get() recurriendo al software.3

El defecto, citado del código fuente.3

05

Nada en él parecía incorrecto durante cinco años

Una frase de recuperación débil se ve exactamente igual que una fuerte. Veinte palabras ordinarias, el checksum correcto, un dispositivo que se comporta normalmente. Nada te avisa en pantalla y nada da error en la compilación. El código fuente estuvo público todo el tiempo. Leerlo aún requería que alguien abriera ese archivo en particular.

Detalle técnico

La longitud de la salida, la ausencia de ceros y la no repetición se superan sin problemas en un PRNG débil, por lo que las pruebas de control habituales tampoco podrían haberlo detectado.

Detalle técnico

La longitud de la salida, la ausencia de ceros y la no repetición se superan sin problemas en un PRNG débil, por lo que las pruebas de control habituales tampoco podrían haberlo detectado.

06

Entonces alguien hizo los cálculos

Jamás tocaron un solo dispositivo. Generaron las frases probables en sus propias máquinas, calcularon qué direcciones de Bitcoin produciría cada una y comprobaron esas direcciones frente a la cadena de bloques pública. Toda dirección que contenía saldo fue vaciada. Una cartera que había permanecido desconectada en un cajón desde 2022 estaba exactamente igual de expuesta que una en uso diario.

Detalle técnico

Los candidatos se derivan sin conexión mediante BIP-39/BIP-32; solo la consulta del saldo final accede a la red, por lo que no hay ningún rastro ni señal previa en el lado de la víctima.3

Detalle técnico

Los candidatos se derivan sin conexión mediante BIP-39/BIP-32; solo la consulta del saldo final accede a la red, por lo que no hay ningún rastro ni señal previa en el lado de la víctima.3

Esta página no es una celebración.

Coinkite reveló el fallo, publicó un informe técnico y lanzó una corrección. Investigadores externos pudieron reconstruir lo ocurrido porque COLDCARD es de código abierto.

Una advertencia sobre las estimaciones: describen a cuántas adivinanzas se enfrenta un atacante bajo las suposiciones actuales, no con un cronograma. Nadie puede decir cuánto tiempo tardaría en descifrarse una cartera en particular.2

Si tienes una COLDCARD

Lee esto antes que nada

Lo que debes hacer depende de qué dispositivo estabas usando cuando se creó por primera vez la frase de recuperación, no de cuál tengas hoy.

Asume que esto sigue ocurriendo. Las frases se volvieron adivinables en 2021 y el método ya es público, por lo que cualquiera puede ejecutar la misma búsqueda. No hay ningún parche que lo solucione desde fuera, ni razón para que un atacante se detenga. Si estás afectado, la suposición segura es que el tiempo es lo único que hay entre tú y ellos.

Mk2 y Mk3: mueve tus monedas ahora

El rango afectado abarca desde el firmware 4.0.1 hasta el 4.1.9. La versión 4.2.0 corrige la generación de nuevas frases, pero ninguna actualización puede retroceder para añadir aleatoriedad a una frase que ya existe. Cree una billetera nueva en un dispositivo en el que confíe y mueva sus fondos.1

Mk4 y Mk5: comprueba la versión de firmware

Si la frase se creó en un firmware anterior al 5.6.0 (o 6.6.0X en compilaciones Edge), actualiza, crea una cartera completamente nueva en el firmware actualizado y luego mueve tus fondos. Actualizar por sí solo no repara la vieja frase.1

Q: igual, el límite es 1.5.0Q

Actualice a la versión 1.5.0Q o posterior, o a la 6.6.0QX en compilaciones Edge, cree una billetera nueva, anote y pruebe la copia de seguridad, envíe una pequeña transacción de prueba y luego mueva el resto.1

¿Actualizar el firmware de COLDCARD soluciona una frase de recuperación que ya tengo?

¿Cómo puedo averiguar con qué firmware se creó mi frase de recuperación de COLDCARD?

¿Cómo puedo comprobar si mi dirección se ha visto afectada por esto?

¿Protegen las tiradas de dados o una frase de contraseña una frase de recuperación de COLDCARD?

¿Cubre el aviso de Coinkite a todas las COLDCARD afectadas?

Aviso técnico oficial de CoinkiteCambia a una cartera nueva en un dispositivo en el que ya confíes y envía una pequeña transacción de prueba antes de migrarlo todo. Guarda la evidencia pública (IDs de transacciones, direcciones, marcas de tiempo) y nunca un secreto. Cualquiera que se ofrezca a recuperar tus fondos es un segundo robo en curso, y no existe tal servicio. Qué hardware comprar después puede esperar hasta que tus monedas estén a salvo.
Y si posee un OneKey

Ningún dispositivo OneKey se ve afectado

Ni un solo modelo que hayamos lanzado jamás. Nuestro firmware no incluye ninguna dependencia de libngu, Coinkite, COLDCARD o CKCC, por lo que la ruta de código que falló no está ahí para ser alcanzada, y puedes comprobarlo tú mismo en nuestros repositorios. En nuestro hardware actual la clave proviene del generador verdaderamente aleatorio dentro de un elemento seguro certificado, nunca de software en el procesador principal. Esa sustitución es lo que fue este fallo.

Sin afectación
OneKey Pro
OneKey Classic 1S
OneKey Classic 1S Pure
OneKey Touch
OneKey Classic
OneKey Mini

Tampoco nos fiamos ciegamente de eso. Cuando saltó la noticia, Anzen Lab rastreó nuestra aleatoriedad de principio a fin (de dónde viene, qué la llama y los ajustes de compilación que deciden qué versión llega a tu dispositivo) y publicó los archivos exactos que comprobaron.12

Leer la revisión de Anzen Lab
La pregunta que te estás haciendo

¿Podría haberle ocurrido esto a un OneKey?

Este fallo necesitaba que tres cosas diferentes fueran ciertas a la vez. En un OneKey ninguna de ellas es cierta, y puedes comprobar las tres tú mismo.

De dónde proviene la nuestra

¿De dónde proviene entonces la aleatoriedad de OneKey?

Generado dentro de un chip con certificación EAL 6+

Sus claves se crean y almacenan en un chip dedicado y resistente a manipulaciones, en lugar de en el procesador de propósito general que ejecuta todo lo demás. EAL 6+ es el nivel de garantía utilizado en tarjetas de pago y de identidad.

Aleatoriedad que se supervisa a sí misma

Ese chip genera aleatoriedad a partir de ruido físico real y comprueba continuamente su propio resultado. Si la aleatoriedad empieza a funcionar mal, el chip se da cuenta en lugar de continuar silenciosamente.

Volvimos a revisar lo nuestro

Tras las noticias de COLDCARD, Anzen Lab rastreó nuestra propia aleatoriedad de principio a fin (de dónde viene, qué la llama realmente y los ajustes de compilación que deciden qué versión termina en tu dispositivo) y publicó los archivos exactos que examinaron.11

OneKey Pro's EAL 6+ certified secure element
EAL 6+ Badge
Cada transacción, asegurada por chips certificados EAL 6+
Dónde se genera la aleatoriedad
Elemento seguro
THD89
Nivel de garantía
Certificado EAL 6+
Fuente de entropía
TRNG de hardware, con autocomprobación
Salida certificada contra
BSI AIS 20 / 31
Reauditado tras este incidente
Anzen Lab, código fuente publicado
Cómo se fabrica OneKey y quién lo verifica

Cuatro controles en cada OneKey, y ninguno confía en los otros tres

Cualquiera de estos puede pasar por alto algo. El punto es que los cuatro tendrían que pasar por alto lo mismo. COLDCARD no tenía tal respaldo: una sola opción de compilación no verificada fue suficiente.

01

Código abierto que puedes verificar realmente

Nuestro firmware y aplicaciones son públicos en GitHub, y nuestras compilaciones son reproducibles, lo que significa que puedes compilar el código tú mismo y confirmar que produce exactamente el software que se ejecuta en tu dispositivo. Ese es el paso que detecta un problema de "código correcto, versión incorrecta".

OneKey en GitHub
02
SlowMist

Auditores externos nos examinan oficialmente

La firma de seguridad SlowMist nos audita y publica los informes. Evaluaciones separadas cubren OneKey Pro, el Classic 1S y nuestro SDK. Nuestras prácticas de seguridad están certificadas según la norma ISO/IEC 27001, y la línea Pro y Classic 1S está certificada frente a EN 18031 por un organismo designado por la UE. Todo ello publicado, nada de autoevaluación.13

Leer el resumen de auditoría de SlowMist
03

Un equipo pagado para romper nuestros propios productos

Anzen Lab es nuestro equipo de seguridad interno compuesto por ingenieros de seguridad de hardware, firmware y aplicaciones, que trabaja con un grupo rotativo de investigadores externos. Su trabajo es romper carteras de hardware, incluidas las nuestras, antes de que se envíe nada. Cuando estalló esta historia, reexaminaron la aleatoriedad de OneKey de principio a fin y publicaron exactamente qué archivos comprobaron.11

Leer el análisis de Anzen Lab
04

Pagamos a desconocidos para que encuentren nuestros errores

Cualquier persona puede informarnos sobre una vulnerabilidad de forma privada, a través de nuestro programa público en BugRap o directamente en [email protected], y recibir una compensación por ello. La gravedad determina el pago, puntuado según CVSS. El objetivo principal es hacer que informarnos sea más atractivo que vender la vulnerabilidad.15

OneKey en BugRap
entro.tools · Diseñado por nuestro fundador

Prueba la cartera en tu mano

entro.tools es una herramienta gratuita y de código abierto que lee los números aleatorios reales que salen de una cartera de hardware y ejecuta las pruebas de salud estadística estándar sobre ellos, en tu navegador, a través de USB, sin subir nada a ninguna parte y sin necesidad de actualizar el firmware.

Funciona tanto en Trezor y KeepKey como en nuestros propios dispositivos, por lo que puedes compararlos lado a lado en lugar de confiar en la afirmación de un único fabricante.
Cómo se ejecuta
En tu navegador, mediante WebUSB
Pruebas aplicadas
FIPS 140-2, NIST SP 800-22 / 90B
Tus datos
Nunca abandonan la página
Actualización de firmware
No requerida
Comprobación de entropía

Ejecuta pruebas de salud FIPS 140-2, NIST SP 800-22 y SP 800-90B localmente mediante WebUSB (Chrome o Edge de escritorio). El dispositivo pide exportar entropía, un lote de números aleatorios que acaba de generar, nunca tu frase de recuperación.16

La prueba universal de Maurer necesita al menos 387.840 bits; por debajo de esa cifra el informe la marca como omitida en lugar de descartarla en silencio.16

Qué carteras se pueden comprobar

Si un tercero puede leer los números aleatorios sin procesar de un dispositivo. Esta es una dimensión muy concreta. Consulta la nota debajo de ella.

OneKey
Verificable por ti mismo
Todos los modelos, firmware de serie16
Trezor
Verificable por ti mismo
Todos los modelos, protocolo de comunicación compartido16
KeepKey
Verificable por ti mismo
Familia de protocolos de Trezor16
Ledger
Confiar en el fabricante
Elemento seguro cerrado; ningún comando del host expone números aleatorios sin procesar16
BitBox02
Confiar en el fabricante
La solicitud de números aleatorios del protocolo fue eliminada por el fabricante16
Blockstream Jade
Confiar en el fabricante
El host solo puede añadir entropía; no hay forma de leer la fuente de vuelta16
COLDCARD
Confiar en el fabricante
Tiene USB, pero su protocolo no contiene ningún comando de entropía16
Keystone
Confiar en el fabricante
Aislado físicamente por diseño; el USB solo transporta información del dispositivo y actualizaciones de firmware16
"No se puede comprobar" y "inseguro" son afirmaciones distintas. Los elementos seguros cerrados siguen su propia vía de certificación. Un resultado favorable demuestra únicamente que hoy no se manifiesta ningún defecto estadístico. No puede probar la impredecibilidad criptográfica y no dice nada sobre la aleatoriedad utilizada el día en que se creó tu cartera.
Aún con dudas

Preguntas que esto plantea para el resto

¿Está OneKey afectado por el fallo de entropía de COLDCARD?

¿A qué monederos físicos afecta el fallo de entropía de COLDCARD?

¿Puedo comprobar la aleatoriedad de mi propio monedero?

¿Cómo puedo juzgar si se puede confiar en un monedero físico?

Seguridad que puedes comprobar, no seguridad en la que debas creer.

De código abierto y reproducible, auditada por terceros, atacada por nuestro propio laboratorio y con recompensa cuando alguien encuentra un agujero. Estos son los dispositivos sobre los que trata este debate.

Referencias

Fuentes a continuación, recuperadas el 6 de agosto de 2026. El aviso y el informe técnico de Coinkite van primero, seguidos del análisis independiente a nivel de código fuente y la contabilidad en la cadena de bloques. Las cifras de pérdidas siguen revisándose al alza: Galaxy Research confirmó 1.596 BTC el 4 de agosto y situó las pérdidas sospechosas cerca de los 2.055 BTC.