Bitcoin Core acaba de publicar tres vulnerabilidades localizadas con un escaneo de inteligencia artificial, y una de ellas permite que un extraño tumbe un nodo de bitcoin en Windows o en Mac con solo conectarse a él. El aviso oficial salió el miércoles 28 de octubre, con las correcciones ya listas: quien opere un nodo debe actualizar a las versiones 29.5, 30.4, 31.2 o 32.1.
El hallazgo nació en Project Loupe, una iniciativa de Elias Rohrer en Spiral que pasó un modelo extenso de lenguaje sobre el código del programa. Cada señal del escaneo la revisó un colaborador humano, Gregory Sanders, antes de pasarla al equipo de seguridad del proyecto. Nada de automatismo a ciegas: la máquina señaló y las personas confirmaron.
Un nodo es el programa que verifica y retransmite cada transacción de bitcoin, y Bitcoin Core es la versión que ejecuta la mayoría de esos nodos en el mundo. Cuando un nodo cae, los fondos de nadie desaparecen. Lo que se apaga es un vigilante: una computadora menos comprobando bloques y propagando movimientos por la red.
El dato urgente que burló el freno de memoria
La falla principal, calificada de gravedad media y de descubrimiento fácil, vive en la forma en que el programa vigila las conexiones fuera de Linux. En Windows, macOS y los sistemas BSD, esa vigilancia usa un mecanismo llamado select(); en Linux usa otro, poll(), y esa diferencia dejó a Linux fuera del problema.
Bitcoin Core limita los datos que pone en cola por cada conexión y pausa las lecturas cuando la cola crece demasiado. El mecanismo select() seguía atento a las condiciones excepcionales aun con las lecturas en pausa, y atender una de esas señales disparaba otra lectura que volvía a llenar la cola, sin tope. La señal se provoca con datos urgentes de TCP, el canal fuera de banda que la red reserva para avisos prioritarios. Traducido a la práctica: un nodo conectado con malas intenciones inundaba al nodo víctima hasta agotar su memoria y provocar el cierre del programa.
La cronología del aviso oficial muestra la velocidad nueva del proyecto. Project Loupe detectó el fallo el 23 de octubre y Sanders lo validó ese mismo día. El 26 de octubre, Antoine Poinsot abrió la corrección, que entró al código y se trasladó a las cuatro ramas mantenidas. Las versiones 31.2 y 32.1 salieron el 27, y las 29.5 y 30.4 llegaron el 28, el mismo día de la divulgación pública.
Otros dos fallos salieron del mismo escaneo
El segundo problema también ataca la memoria, aunque a fuego lento. CoinDesk informó que un nodo conectado podía fingir que usaba una versión antigua del protocolo, anterior al estándar BIP 31, y quedarse detenido mientras los mensajes se acumulaban en la memoria de la víctima: hasta 2 MB por hora por cada conexión entrante y 5 MB por hora por cada conexión saliente. Loupe lo reportó el 15 de septiembre y otro desarrollador, L0rinc, lo encontró por su cuenta seis días después, un detalle que el proyecto leyó como una señal clara de que guardar el secreto ya no protegía a nadie.
Quedó un tercer fallo, de gravedad baja, que toca los archivos que un nodo guarda para deshacer bloques cuando la red cambia unos bloques recientes por una cadena rival, movimiento conocido como reorganización. Un minero podría crear bloques cuyos datos de reversión desborden esos archivos: en máquinas de 64 bits haría falta cerca de un mes de toda la producción de bloques de la red, una exigencia que vuelve el ataque poco práctico. En equipos Windows y de 32 bits el panorama cambia, porque el nodo puede fallar al escribir los datos y, en palabras del propio aviso, reiniciar no ayuda. Los nodos de 32 bits y los que guardan bloques en unidades FAT32 viejas quedan expuestos incluso después de aplicar la corrección.
Este tipo de susto no es nuevo para quien custodia bitcoin con programas de terceros: este mismo mes, la falla de Electrum en la billetera de Bitcoin recordó que el código que rodea a la moneda necesita revisión constante, venga el revisor de carne y hueso o de un modelo de lenguaje.
Versiones corregidas y una política que cambió el 22 de octubre
La divulgación rápida tiene explicación propia. Hasta la semana pasada, el proyecto guardaba los fallos de gravedad media en secreto hasta por un año, para dar tiempo a los operadores a actualizar antes de que los atacantes supieran dónde mirar. El 22 de octubre la regla cambió para los errores considerados fáciles de descubrir: los modelos de lenguaje abarataron tanto la búsqueda de fallos que un secreto así duraba poco. CoinDesk reportó que las correcciones de esa clase saldrán ahora lo antes posible, para todas las versiones con soporte y con su aviso público adjunto.
Quedan piezas pendientes. Las notas de la versión 30.0 anticipan tres vulnerabilidades más, de gravedad media y alta, ya corregidas en esa rama, y su divulgación está prevista para dentro de dos semanas. El operador que actualice hoy a cualquiera de las cuatro versiones corregidas cierra las tres puertas conocidas; el que deje el nodo en una versión vieja mantendrá abierta, en Windows, macOS o BSD, una vía que cualquier conexión hostil puede aprovechar con datos urgentes de TCP.
Fuente: Bitcoin Core
Foto: Unsplash vía CoinDesk
