2 puntos por GN⁺ 2024-01-15 | 1 comentarios | Compartir por WhatsApp

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

 
GN⁺ 2024-01-15
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.

    • Compartió su experiencia respondiendo una pregunta similar sobre "inversión de RNG" en StackOverflow. Tanto el RNG de Java como el de MSVC usan un diseño LCG, lo que permite ataques similares.
  • 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.

    • Especuló sobre la posibilidad de explotarlo bajo ciertas condiciones si el servidor usa el mismo RNG.
  • 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.

    • Señaló el problema de que el RNG congruencial lineal genera una cantidad limitada de números y luego se repite, enfatizando la necesidad de mejorar el 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.

    • Compartió cómo WoW despertó su interés por la programación. Aprendió habilidades de programación a través de servidores privados y del aprendizaje de Lua.
  • 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.

    • Citó la postura de John von Neumann sobre la generación de números aleatorios, enfatizando que un procedimiento aritmético estricto no es un método para generarlos.
  • 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.

    • Compartió su experiencia obteniendo oro infinito mediante un script usado en la casa de subastas de WoW.
  • 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.

    • Mencionó un caso en el que Hacker News fue hackeado por números aleatorios débiles, señalando un problema de seguridad.
  • Hay un usuario que usa la expresión "cuando las variables no varían y las constantes no son constantes".

    • Usó una expresión satírica sobre el papel de las variables y las constantes en programación.
  • 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á.

    • Comentó que había oído que los addons de WoW usaban chats privados como medio de comunicación, y opinó que la gente siempre encontrará y usará esos métodos.
  • 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.

    • Señaló que un RNG imperfecto puede bastar en situaciones poco críticas, como juegos, pero que su precisión se vuelve muy importante cuando están en juego el dinero o la seguridad.