Investigación. Resumen
Aleatoriedad débil en los monederos criptográficos
A lo largo de una década de software de monederos, se ha repetido una y otra vez el mismo error: la criptografía era sólida, pero la aleatoriedad en la que se basaba no lo era. Este es un repaso a esa serie de fallos y a por qué, para los usuarios, la previsibilidad es una vía de recuperación.
La mayoría de las pérdidas catastróficas de monederos no se deben a fallos en el cifrado, sino a fallos en la generación de números aleatorios. La seguridad de un monedero se basa por completo en números impredecibles, y cuando esos números resultan ser predecibles, todo se viene abajo, por muy robustos que sean los algoritmos. Esta página recopila los principales casos que investigamos —cada uno de los cuales cuenta con su propia página detallada— y explica el patrón común que comparten y lo que esto implica para la recuperación.
La aleatoriedad es la base de un monedero
Cada monedero comienza con un secreto: una clave privada o una semilla, elegida idealmente de un espacio tan vasto que nadie podría adivinarla ni enumerarla jamás. Esa imposibilidad de adivinarla proviene íntegramente de la aleatoriedad. Si la aleatoriedad utilizada para crear tus claves fuera realmente impredecible, tu monedero estaría a salvo incluso frente a una potencia de cálculo ilimitada. Si no fuera así —si los números «aleatorios» procedieran de algo predecible, como un reloj o un generador defectuoso—, entonces ese vasto espacio se reduciría a uno pequeño y rastreable, y ni siquiera el cifrado más potente del mundo podría salvarla.
Dos formas en las que la aleatoriedad falla
Una aleatoriedad deficiente afecta a una cartera en dos aspectos distintos. El primero es la generación de claves: si la semilla o la clave privada se han generado a partir de una entropía predecible, un atacante puede regenerar la clave exacta. El segundo es la firma: cada firma de transacción necesita un valor aleatorio nuevo (el nonce ECDSA), y si ese valor es predecible o se repite, la clave privada puede calcularse directamente a partir de las transacciones públicas de la cadena de bloques. Ambos son fatales, y existen diferentes casos reales que entran en cada una de estas categorías.
Randstorm: claves predecibles para carteras en el navegador
Randstorm afectó a millones de carteras generadas en el navegador entre, aproximadamente, 2011 y 2015 utilizando la biblioteca BitcoinJS, cuya rutina SecureRandom recopilaba mucha menos entropía de lo que se suponía. El resultado fue que las claves se generaban a partir de un espacio muy reducido. Se trata de un fallo en la generación de claves que afecta a un gran número de carteras antiguas. Consulta nuestro estudio sobre Randstorm para obtener más detalles.
MilkSad: una semilla del reloj… o algo peor
MilkSad (CVE-2023-39910) afectó a los monederos cuya semilla procedía del comando «bx seed» de libbitcoin-explorer, que generaba una semilla para el algoritmo Mersenne Twister utilizando la hora del sistema de 32 bits. Esto deja solo unos cuatro mil millones de semillas posibles —y, por lo general, muchas menos, ya que a menudo se conoce la hora de creación—. Se trata de otro fallo en la generación de claves, en una herramienta de uso muy extendido. Consulta nuestra investigación sobre MilkSad.
SecureRandom de Android: fuga de claves durante la firma
La vulnerabilidad de SecureRandom en Android de 2013 es el classic fallo classic . El generador aleatorio de Android podía devolver valores repetidos, lo que provocaba que las carteras de Bitcoin reutilizaran el nonce ECDSA en diferentes firmas, lo que permitía a cualquiera calcular la clave privada a partir de dos transacciones públicas. Los fondos fueron sustraídos directamente de la cadena. Consulta nuestro estudio sobre SecureRandom en Android.
Trust Wallet: una versión moderna
La aleatoriedad débil no es solo un problema antiguo. En 2023 se descubrió que la extensión para el navegador Trust Wallet generaba frases mnemotécnicas utilizando un generador pseudoaleatorio predecible, por lo que las claves creadas en la ventana afectada podían enumerarse —el mismo fallo en la generación de claves que Randstorm y MilkSad, una década más tarde—. Esto nos recuerda que este tipo de fallo se repite cada vez que un desarrollador recurre a una fuente de aleatoriedad cómoda, pero que no cumple con los estándares criptográficos.
El enfoque del PRNG en la preventa de 2014
Nuestra propia investigación amplía este patrón al generador de la preventa de Ethereum de 2014, que se basaba en la función Math.random() del navegador para algunas partes de su proceso. En Firefox, un colapso específico de la entropía podría reducir la aleatoriedad desconocida a una marca de tiempo acotada, lo que supondría una posible vía de recuperación para un subconjunto de esas carteras de gran valor. Consulta nuestra investigación sobre el PRNG de la preventa.
El patrón: criptografía sólida, semilla predecible
En todos y cada uno de estos casos, la criptografía en sí misma funcionaba correctamente. AES, ECDSA y las funciones hash nunca fueron el punto débil; el punto débil siempre fue la entrada: un valor aleatorio que resultó ser predecible porque procedía de un reloj, un generador de plataforma defectuoso, una peculiaridad del navegador o una función no criptográfica utilizada cuando se requería una criptográfica. Reconocer este patrón es lo que nos permite analizar un monedero «seguro» y plantearnos la pregunta adecuada: no «¿es fuerte el cifrado?», sino «¿de dónde procede realmente la aleatoriedad?».
Por qué la previsibilidad tiene sus pros y sus contras
Esta es la parte que le importa al propietario. Esa misma previsibilidad que permite a un atacante regenerar una clave o derivarla a partir de una firma es precisamente lo que nos permite recuperar una cartera para su legítimo propietario. Si tu cartera se creó con un nivel de aleatoriedad insuficiente y has perdido el acceso, el espacio de búsqueda reducido que la pone en peligro es la razón por la que puede reconstruirse —ya sea barriendo el espacio enumerable de semillas o derivando la clave a partir de tus propias transacciones públicas—. Hacemos esto estrictamente como recuperación para el propietario, en el caso de carteras de las que un cliente pueda demostrar que es propietario, con el fin de devolverle los fondos que, de otro modo, habría perdido.
Cómo saber si podrías estar afectado
Podrías estar expuesto si tu monedero: se creó en un navegador entre 2011 y 2015 (Randstorm); se generó con la semilla «bx» de libbitcoin o con una herramienta basada en ella (MilkSad); se creó en una de las primeras carteras de Bitcoin para Android, alrededor de 2013 (SecureRandom); se creó en la ventana de la extensión de Trust Wallet afectada; o si se trata de una cartera de la preventa de Ethereum de 2014. Lo inquietante de todos estos casos es que la cartera parece completamente normal: la vulnerabilidad es invisible hasta que alguien realiza un análisis exhaustivo del espacio. Si alguna de estas descripciones se ajusta a una de tus carteras que aún contiene fondos, considérala en riesgo y transfiere los fondos; si has perdido el acceso, esa misma vulnerabilidad podría ser la clave para recuperarlo.
Cómo es una aleatoriedad adecuada
La lección en materia de seguridad es clara: las claves y las semillas deben proceder de una fuente aleatoria criptográfica adecuada, y la firma debe utilizar un nonce único e impredecible en cada ocasión (las carteras modernas utilizan nonces determinísticos según la RFC 6979 para eliminar por completo el riesgo de reutilización). Genera semillas con software actualizado y de confianza o con un monedero físico de buena reputación; desconfía de los generadores antiguos basados en navegadores y de las herramientas en desuso; y si un monedero se creó con alguno de los elementos de la lista anterior, cámbialo por uno recién generado. Una buena aleatoriedad pasa desapercibida cuando funciona y resulta catastrófica cuando no lo hace, por eso merece tanta atención.
Nuestra investigación
La recuperación de claves con aleatoriedad débil es un eje central del trabajo de KeychainX, ya que una gran parte de las criptomonedas «perdidas» en sus inicios son, en realidad, criptomonedas con aleatoriedad débil que esperan ser reconstruidas para sus propietarios. Cada uno de los casos mencionados anteriormente cuenta con su propia página detallada, y esta visión general los agrupa como una misma familia. Actualizamos y mantenemos este resumen a medida que surgen nuevos casos; la tendencia no va a desaparecer, ya que la tentación de recurrir a una aleatoriedad «cómoda» se repite con cada nueva generación de software de monederos.
Preguntas frecuentes
¿Qué es la aleatoriedad débil en un monedero criptográfico?
Se produce cuando los números aleatorios que se utilizan para generar claves o firmar transacciones proceden de una fuente predecible —un reloj, un generador defectuoso o una función no criptográfica—, lo que reduce el enorme espacio de claves a uno pequeño y fácil de rastrear. El cifrado sigue siendo seguro; el punto débil es la entrada.
¿Qué vulnerabilidades forman parte de esta familia?
Randstorm (carteras de navegador, 2011-2015), MilkSad (semilla de libbitcoin bx, CVE-2023-39910), la vulnerabilidad de SecureRandom en Android de 2013, el problema con la extensión de Trust Wallet de 2023 y la vulnerabilidad del PRNG en la preventa de Ethereum de 2014.
¿Significa que, al tratarse de una aleatoriedad débil, he perdido mi dinero?
Esto significa que la cartera está en peligro: cualquiera podría regenerar la clave. Pero para el propietario legítimo también significa que, a menudo, es posible recuperarla, ya que el espacio de búsqueda reducido que pone en peligro la cartera es precisamente lo que permite reconstruirla.
¿Cómo puedo saber si mi monedero ha utilizado un generador de aleatoriedad poco seguro?
Comprueba cómo y cuándo se creó: las carteras integradas en el navegador de entre 2011 y 2015, las claves generadas por BX Seed, las primeras carteras para Android, la ventana afectada de Trust Wallet o las carteras de la preventa de 2014 son los principales perfiles de riesgo. La cartera en sí misma parece normal, por lo que el historial de creación es lo que delata el problema.
¿Se puede recuperar un monedero afectado por una aleatoriedad deficiente?
A menudo, para el propietario. Con los datos sobre cómo y cuándo se creó el monedero (y una dirección conocida), analizamos el espacio de semillas reducido o derivamos la clave a partir de tus transacciones públicas. Pago por resultados, sin coste inicial.
¿Un monedero creado con aleatoriedad débil?
Si tu monedero se ajusta a alguno de estos perfiles y has perdido el acceso, esa misma vulnerabilidad suele ser la vía para recuperarlo. Cuéntanos cómo y cuándo se produjo la intrusión: te daremos una valoración sincera en un plazo de 24 horas.