When Random Isn't
- Como es una anécdota de hace unos 10 años, agradezco que me disculpen por las partes que no recuerdo con exactitud porque perdí el código real.
- Algunos detalles se simplificaron para que cualquiera a quien le guste la seguridad informática pueda disfrutarlo.
- A los 14 años descubrí World of Warcraft y me volví adicto.
- Descubrí los add-ons con los que se podía modificar la interfaz de usuario del juego, y empecé a crear los míos.
- Los add-ons, hechos en el lenguaje de programación Lua, estaban compuestos por unos cuantos archivos fuente
.lua.
- Me fascinaba que el juego cargara y ejecutara código fuente escrito por mí directamente.
Seguridad de los add-ons
- Tener add-ons programables por el usuario puede parecer una mala idea, ya que podría dar lugar a bots.
- El sistema que creó Blizzard es bastante ingenioso para evitar comportamientos de programación arbitrarios.
- La mayoría de los elementos de la UI son puramente decorativos o informativos, así que no tienen restricciones.
- Las APIs para recopilar información, como una llamada que muestra la salud del personaje, no tienen restricciones.
- Sin embargo, algunas llamadas a la API están protegidas para que solo puedan invocarse desde el código oficial de Blizzard.
- La mayoría de las APIs relacionadas con realizar acciones reales dentro del juego están protegidas.
- En algún momento también se protegieron las APIs para obtener la posición en el mundo y la dirección de la cámara.
- Si quieres crear un botón que lance un hechizo específico, puedes crear un botón especial que ejecute código en un entorno seguro al hacer clic.
- Estos botones no pueden crearse, destruirse ni moverse durante el combate, lo que evita la automatización en combate.
- El entorno seguro puede configurar mediante programación qué hechizo lanzar, pero no permite la recopilación de información necesaria para una automatización arbitraria.
Un canal trasero
- Unos años después, al interesarme por una programación más "seria", casi dejé de jugar World of Warcraft.
- Pero seguía dándole vueltas a la idea de desactivar el entorno seguro.
- En lugar de usar software de terceros, quería resolverlo como un reto usando herramientas técnicamente permitidas.
- Descubrí que la función
random estaba en la lista de funciones permitidas dentro del entorno seguro, y se me ocurrió una forma de usarla para pasar información de contrabando.
Problemas con el generador de números aleatorios
- Resultó que
random era simplemente un envoltorio de la función rand de C.
- La implementación de
rand era un generador congruencial lineal simple y débil.
- Desarrollé una forma de transmitir información haciendo ingeniería inversa del estado interno del RNG.
Juntándolo todo
- Una vez que podía hacer ingeniería inversa del estado interno del RNG, podía tomar decisiones de automatización arbitrarias dentro del entorno seguro.
- Accedía a la información en el entorno inseguro para tomar decisiones, y luego ejecutaba acciones "elegidas al azar" dentro del entorno seguro.
Conclusión
- No sé cuándo Blizzard corrigió el problema del estado del RNG, que era débil y compartido, ni si siquiera sabían que era un problema.
- Cuando volví a probar el código años después, ya no funcionaba.
- Aunque era aprovechar un hueco en un videojuego que en realidad no quería usar, había algo casi mágico en manipular lo que parecía aleatorio.
Opinión de GN⁺
- Este artículo ofrece un caso interesante sobre seguridad informática y programación.
- Explorar una forma creativa de eludir la seguridad dentro del juego resalta la importancia de las habilidades de programación y la conciencia sobre posibles vulnerabilidades.
- La historia de aprovechar una debilidad del RNG es un ejemplo aleccionador que recuerda a los desarrolladores de software la importancia de la seguridad y de los algoritmos.
1 comentarios
Opiniones de Hacker News
Un usuario mencionó que hace unos meses respondió en StackOverflow una pregunta sobre la "inversión de RNG (generador de números aleatorios)". Este usuario atacó el RNG de Java, que usa un diseño LCG (generador congruencial lineal) similar al RNG de MSVC, ya que produce como salida un truncamiento del estado interno, por lo que el método de ataque es muy parecido.
Otro usuario especuló que, si el servidor está usando el mismo RNG, teóricamente podría explotarse si se dan ciertas condiciones: un servidor con poca carga, baja latencia, la capacidad de obtener una ventana precisa del estado actual del RNG y la capacidad de generar rápidamente otros eventos con alta volatilidad económica.
Otro usuario señaló que el RNG congruencial lineal dado solo genera 12445 números distintos antes de repetirse, y comentó que sería razonable usar mejores parámetros para este algoritmo.
Un usuario dijo que World of Warcraft (WoW) fue lo que despertó su interés por la programación; el juego salió cuando él tenía 6 años, y cuando aparecieron los servidores privados, empezó a interesarse en cómo crear sus propios NPC. Gracias a eso aprendió Lua, cómo compilar el core de servidores privados, SVN, cómo aplicar parches y más.
Un usuario compartió una cita de John von Neumann diciendo que todos los métodos para generar números aleatorios son pecados, y sostuvo que un procedimiento aritmético estricto no es un método para generar números aleatorios.
Un usuario dijo que escribió un script para la casa de subastas de WoW; este script escaneaba todas las subastas para comprar objetos infravalorados y volver a subastarlos. Si alguien bajaba el precio, el script podía cancelar y volver a publicar la subasta a un precio apenas inferior.
Hay un usuario que mencionó un caso en el que Hacker News fue hackeado debido a números aleatorios débiles. Proporcionó un enlace relacionado.
Hay un usuario que usa la expresión "cuando las variables no varían y las constantes no son constantes".
Hay un usuario que no jugó WoW, pero escuchó que muchos addons usaban chats privados como medio de comunicación. Mencionó que, si existe una forma de hacerlo, la gente eventualmente la encontrará y la usará.
En relación con los incentivos económicos del RNG, un usuario mencionó que, cuando no hay nada realmente importante en juego (por ejemplo, en un juego), incluso un RNG imperfecto puede ser suficiente. Pero cuando hay dinero de por medio o la seguridad es importante (por ejemplo, en una wallet de criptomonedas o un casino en línea), la perfección del RNG se vuelve crucial.