Investigación. Vulnerabilidad
MilkSad: la vulnerabilidad de bx seed (CVE-2023-39910)
Parte de nuestra investigación sobre la aleatoriedad débil: consulta la descripción general sobre la aleatoriedad débil en los monederos criptográficos.
Las carteras generadas con el comando «bx seed» de libbitcoin-explorer obtenían su entropía de un reloj, y no de un proceso aleatorio real, lo que las hace predecibles y, para sus legítimos propietarios, recuperables.
MilkSad, catalogado como CVE-2023-39910, es uno de los fallos más evidentes relacionados con la aleatoriedad débil en la historia de las criptomonedas. Afecta a los monederos cuya semilla se generó mediante el comando «bx seed» de libbitcoin-explorer. El nombre proviene de la mnemotécnica de la semilla más débil posible, que comienza con «milk sad…». En esta página se explica el fallo y cómo funciona el proceso de recuperación para el propietario de un monedero afectado.
¿En qué consiste el fallo MilkSad?
Para crear un monedero se necesita aleatoriedad auténtica. En cambio, la herramienta de semillas «bx» inicializó un generador pseudoaleatorio Mersenne Twister (MT19937) con la hora del sistema en segundos —un valor de 32 bits—. Esto reduce drásticamente todo el espacio de claves: en lugar de un número astronómico de semillas posibles, solo hay unos cuatro mil millones y, en la práctica, muchas menos, ya que la hora de creación suele conocerse dentro de un intervalo. Cualquiera que sepa aproximadamente cuándo se creó un monedero puede regenerar la semilla exacta que este generó.
¿A quién afecta?
Cualquier monedero cuya entropía de semilla procediera de «bx seed» se ve afectado, durante los años en que la herramienta presentó ese fallo (aproximadamente de 2011 a 2023). Esto incluye a quienes utilizaron «libbitcoin-explorer» directamente y, lo que es más importante, a cualquiera que siguiera un tutorial o un script que, en segundo plano, utilizara «bx seed» para generar una frase mnemotécnica. Si tu frase BIP39 se creó de esa forma, nunca tuvo seguridad alguna: la frase formaba parte de un conjunto pequeño y enumerable.
Por qué la semilla de tiempo es fatal
Un Mersenne Twister es determinista: la misma semilla siempre produce la misma secuencia. Por lo tanto, el valor de la semilla es el único secreto, y en este caso ese valor era simplemente una marca de tiempo. Reproducir un monedero consiste en: recorrer los segundos candidatos dentro de la ventana de creación plausible, aplicar a cada uno el mismo algoritmo MT19937 para producir la misma entropía, derivar la frase mnemotécnica y las direcciones resultantes, y compararlas con la dirección conocida. Dado que un día solo tiene 86 400 segundos y un año unos 31 millones, la búsqueda se completa rápidamente en un equipo informático convencional. Se trata del mismo tipo de fallo que el de Randstorm —aleatoriedad predecible— pero en una herramienta diferente.
Cómo funciona el proceso de recuperación para el propietario
La misma previsibilidad que hace que MilkSad sea peligroso permite que el propietario legítimo recupere una cartera afectada. Si has creado una cartera con una herramienta afectada y posteriormente has perdido la frase mnemotécnica, podemos regenerarla: con una fecha de creación aproximada y una dirección conocida de la cartera, recorremos el rango de marcas de tiempo a través de la derivación MT19937 hasta que las direcciones coincidan, y luego reconstruimos la semilla exacta. Solo hacemos esto con carteras de las que seas propietario y con las que puedas demostrar una conexión; el objetivo es devolver los fondos a su propietario, no facilitar el robo.
Si crees que te ves afectado
Si alguna de tus carteras se ha generado con bx seed o con una herramienta basada en ella y aún contiene fondos, considérala comprometida: transfiere los fondos a una nueva cartera creada con una semilla verdaderamente aleatoria tan pronto como puedas, ya que cualquier otra persona también podría regenerar la antigua. Si ya has perdido el acceso, la recuperación es factible precisamente debido a este fallo: el mismo método que utilizaría un atacante es el que te permite recuperar tus monedas.
¿Cuánto estaba en juego?
La consecuencia de un espacio de claves de cuatro mil millones de semillas es que cualquiera que realice la enumeración puede vaciar en masa las carteras afectadas —y así ocurrió en algunos casos—. Dado que la vulnerabilidad se encontraba en una herramienta de línea de comandos muy utilizada, la exposición se extendió a todos los scripts, tutoriales y proyectos derivados que la utilizaban para «generar una semilla segura». Ese es el peligro silencioso de un fallo de aleatoriedad débil: no se manifiesta abiertamente, las carteras parecen normales, la frase mnemotécnica se parece a cualquier otra de doce palabras y la vulnerabilidad es invisible hasta que alguien enumera el espacio de semillas. Para el propietario, la conclusión práctica es que el saldo puede desaparecer en cualquier momento, por lo que el contenido de una cartera afectada debe transferirse inmediatamente a una nueva.
La aleatoriedad débil es un patrón recurrente
MilkSad no es un error aislado; forma parte de una serie de fallos en los que la aleatoriedad de una cartera procedía de algo predecible: un reloj, una peculiaridad del navegador o un generador de la plataforma defectuoso. Randstorm redujo drásticamente la entropía de las primeras carteras de navegador; el fallo de SecureRandom en Android de 2013 filtró claves a través de nonces de firma repetidos; el generador de la preventa de Ethereum de 2014 se basó en la función Math.random del navegador para parte de su proceso. El denominador común es que la criptografía era sólida, pero la semilla no lo era, y en todos los casos la misma previsibilidad que permitió el robo también permite la recuperación por parte del propietario legítimo. Este es un aspecto fundamental de nuestra investigación, ya que una gran parte de las criptomonedas «perdidas» de los primeros tiempos son, en realidad, criptomonedas con aleatoriedad débil a la espera de ser reconstruidas.
Transparencia y nuestro trabajo
MilkSad fue dado a conocer públicamente en 2023 por los investigadores de seguridad responsables del aviso publicado en milksad.info y se le asignó el CVE-2023-39910; el mérito del descubrimiento les corresponde a ellos. La contribución de KeychainX se centra en la recuperación: hemos desarrollado y ejecutado la reconstrucción de la semilla temporal en las carteras afectadas para sus propietarios, como parte de nuestro trabajo más amplio sobre la recuperación de aleatoriedad débil (véase nuestra investigación Randstorm para el caso estrechamente relacionado de las carteras de navegador). Remitimos al aviso original para consultar la divulgación técnica completa.
Preguntas frecuentes
¿Qué es MilkSad?
Una vulnerabilidad relacionada con una entropía insuficiente (CVE-2023-39910) en el comando «bx seed» de libbitcoin-explorer, que generaba una semilla para el algoritmo Mersenne Twister utilizando la hora del sistema de 32 bits, lo que hacía que las semillas resultantes fueran predecibles y enumerables.
¿Me afecta esto a mi bolsillo?
Si tu semilla se generó con «bx seed» o con alguna herramienta o tutorial que lo utilizara, sí. Esa frase nunca ha sido segura; transfiere todos tus fondos a un monedero con una semilla debidamente aleatoria.
¿Se puede recuperar una cartera MilkSad si pierdo la frase de recuperación?
A menudo sí, para el propietario. Con una fecha de creación aproximada y una dirección conocida, regeneramos la semilla barriendo el intervalo de marcas de tiempo a través de la misma derivación hasta que las direcciones coincidan.
¿Quién descubrió MilkSad?
Los investigadores responsables del aviso publicado en milksad.info lo dieron a conocer en 2023 (CVE-2023-39910). KeychainX se encarga de la recuperación para los propietarios afectados.
¿Cuánto cuesta la recuperación?
Basado en los resultados: un porcentaje del valor recuperado solo si recuperamos el monedero, y nada por adelantado.
¿Una cartera hecha con una herramienta poco eficaz?
Si tu semilla procede de BX Seed y has perdido el acceso, es probable que podamos recuperarla. Indícanos la cartera y una fecha aproximada; te daremos una valoración realista en un plazo de 24 horas.