Rompiendo la criptografía casera de Tower Unite: factorización de RSA-509 y lecciones de seguridad

Fuentes: The "authoritative" game coordinator that wasn't
Imagen generada por IA con el prompt: A glowing cracked RSA padlock overlaid on circuit board patterns with prime numbers and binary digits floating around, dark cyberpunk atmosphere, editorial illustration
Imagen generada con IA

Un investigador independiente destapó múltiples fallos de seguridad en el backend de Tower Unite, el juego de la pequeña editora PixelTail. El sistema, llamado Authoritative Game Coordinator (AGC), empleaba una capa criptográfica desarrollada internamente: un esquema RSA de 509 bits cuya clave pública estaba embebida en el binario y pudo factorizarse en apenas día y medio usando CADO-NFS y el método general del cuerpo de números, ejecutado en equipos domésticos. Con la clave privada en la mano, el autor descifró la clave de sesión AES-256 y reconstruyó el protocolo completo a partir del tráfico de un cliente sin modificar.

El análisis identifica tres fallos encadenados: un generador de claves rudimentario, una clave estática que se distribuyó con el juego y una rutina de descifrado que filtraba memoria del heap sin inicializar. La arquitectura de AGC, un RPC bit-packed y con estado escrito en C++ bajo el nombre interno CasinoBackend, resultaba trivialmente autodescriptiva: cada conexión recibía el esquema completo de eventos y permisos, filtrando funciones reservadas a servidores oficiales.

El investigador también documentó una escalada de privilegios local: modificar el flag bIsAdmin en memoria bastaba para obtener control administrativo sobre condominios dedicados de otros jugadores. PixelTail respondió en dos semanas reemplazando toda la capa casera por secp256k1 y libsodium, aunque la autenticación del servidor quedó pendiente, lo que deja abierta la posibilidad de un ataque activo de intermediario. El artículo sirve como caso de estudio sobre los riesgos de implementar criptografía propia y la importancia de validar permisos en el servidor.