Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Seguridad en videojuegos

entdark
April 05, 2017
73

Seguridad en videojuegos

Slides de la charla sobre seguridad en videojuegos para la conferencia de la Hackers Week 4.

entdark

April 05, 2017
Tweet

Transcript

  1. ¿Quién soy? Analista de Malware en Hispasec Sistemas Botnet Android

    ataca a usuarios españoles: http://unaaldia.hispasec.com/2017/03/evoluciona-mazain- ahora-ataca-usuarios.html Crypt0l0cker vuelve a la carga: http://unaaldia.hispasec.com/2017/03/crypt0l0cker-vuelve-al-ataque.html Remcos RAT a bancos colombianos: http://unaaldia.hispasec.com/2017/03/remcos-rat-dirigido- usuarios-del-banco.html
  2. ¿Por qué debemos preocuparnos por ello? Es posible (y recomendable)

    que para realizar tu videojuego quieras partir de un motor ya hecho, después de todo ahorra mucho trabajo. ¿Es un motor mantenido? ¿Tienes un equipo de personas para mantenerlo? ¿Está muy distribuido?
  3. Pero lo que realmente nos interesa... - Vulnerabilidades en el

    servidor (Crashes, inutilizaciones…) - Exploits que afecten a clientes - Denegaciones de servicio (DoS)
  4. ¿Qué es Q3 Engine? El motor llamado “id Tech 3”,

    más conocido como Q3 Engine, es el motor producido y utilizado para el videojuego Quake 3. • En la época competía con el motor Unreal • Muchos juegos se basaron en este motor.
  5. Juegos que comparten este motor... - Quake 3 - Star

    Trek: Elite Force - Star Wars Jedi Knight: Jedi Outcast - Return to castle Wolfenstein - Call of Duty - Medal of Honor: Allied Assault - Wolfenstein: Enemy Territory
  6. ¿Qué ocurre con estos juegos? - Comparten motor, por lo

    que podemos observar similaridades a la hora de jugarlos. - Normalmente, se hacen cambios a nivel de gameplay. - En el servidor suele añadirse código, pero no tocarse el principal.
  7. Si hay una update... Cada uno tiene que parchear los

    errores de seguridad por su cuenta.
  8. ¿Que nos podemos encontrar? - Ejecución de código remoto -

    Denegaciones de servicio - Modificaciones en la configuración utilizada por el servidor...
  9. ¿Qué ocurre? Los estudios que realizaron los juegos no esperaron

    a que estos perduren en el tiempo, por lo que tras un número determinado de parches estos dejaron de emitirse. ¡¡EFECTIVAMENTE!! Todos los juegos dependientes del mismo motor presentaban los mismos fallos de seguridad… Y no los arreglaron.
  10. RCON - No puedes estar siempre en la consola del

    servidor o logueandote en el para cambiar las settings. - RCON es el mecanismo utilizado para el envío de comandos remotos al servidor. - Es *casi* equivalente a una shell: * Podemos acceder a información almacenada en el servidor * Si corre como root, hacer mucho más daño…
  11. Obtener la configuración del servidor - Este error se produce

    por la confianza en el usuario - Utiliza un sistema diseñado para usos aparentemente benignos - En caso de una mala configuración, permite obtener la configuración de otros servidores. - Muchas configuraciones tenían enabled este cvar por defecto, permitiendo explotar la vulnerabilidad
  12. Fake players - Consiste en una falsa conexión de jugadores

    a nuestro servidor. - El servidor recibe un paquete connect - Llenamos el servidor de falsos jugadores constantemente. Ejemplo de un paquete: connect"\challenge\1234567890\qport\18468\protocol\26\name\Padawan\rate\24000\snaps\ 38\model\mara_ponytail/default\forcepowers\7-1- 030000000000000330\color1\4\color2\4\handicap\100\sex\male\cg_predictItems\1\saber1\ dual_1\saber2\none\char_color_red\255\char_color_green\255\char_color_blue\255\teamt ask\0"
  13. Fixes… - Limitar el número de conexiones por IP -

    Examinar el intercambio de paquetes para validar la conexión - Comprobar el intervalo entre conexiones.
  14. ¿Controlamos todos los casos? Va a ser que no… Cmd_FollowCycle_f

    se utiliza para ‘ciclar’ entre los distintos jugadores desde espectador. Esto permite al usuario observar a los demás jugadores y alternar entre ellos.
  15. Podemos solucionarlo rápidamente... if (ent - > client - >

    sess.spectatorClient < 0) { switch (ent - > client - > sess.spectatorClient) { // Si intenta hacer uso de /team follow1 case -1: ent - > client - > sess.spectatorClient = -2; break; // Si intenta hacer uso de /team follow2 case -2: ent - > client - > sess.spectatorClient = -1; break; default: G_LogPrintf("Transicion de espectador exitosa."); } }
  16. ¿Confiamos en el usuario? ¡Pues claro! - Una funcionalidad común

    es poder comunicarse por chat. - Se establece un límite de caracteres que el usuario puede enviar - Pero no observamos ninguna validación... void trap_SendServerCommand( int clientNum, const char *text ) { syscall( G_SEND_SERVER_COMMAND, clientNum, text ); }
  17. Solución... void trap_SendServerCommand( int clientNum, const char *text ) {

    if( strlen( text ) > 1022 ) { G_LogPrintf( "trap_SendServerCommand( %d, ... ) la longitud excede 1022 caracteres.\n", clientNum ); G_LogPrintf( "text [%s]\n", text ); return; } syscall( G_SEND_SERVER_COMMAND, clientNum, text ); }
  18. * crash... Saga Jedi Knight - Jugador puede tener poderes

    de la fuerza - Estos poderes se asignan a través de un menú gráficamente - A nivel de código, es una string conformada por números y guiones. E.g: 7-1-033330000000000333
  19. forcestring crash... Saga Jedi Knight - Jugador puede tener poderes

    de la fuerza - Estos poderes se asignan a través de un menú gráficamente - A nivel de código, es una string conformada por números y guiones. E.g: 7-1-033330000000000333
  20. forcestring crash La función void WP_InitForcePowers(gentity_t *ent) no sanitiza la

    entrada recibida por el usuario. Al parsear una cadena errónea el intérprete de la string falla provocando el colapso del servidor.
  21. Para arreglarlo... Gamall Ida publicó un parche que arreglaba (entre

    otros fallos) el juego base en JK:JKA, pero no para juegos anteriores. char *gaGENERIC_FORCE = "7-1-033330000000000333"; char *gaFORCE_LOWER = "0-1-000000000000000000"; char *gaFORCE_UPPER = "7-2-333333333333333333"; char* gaCheckForceString(char* s) { char *p = s, *pu = gaFORCE_UPPER, *pl = gaFORCE_LOWER; if (!s || strlen(s) != 22) return gaGENERIC_FORCE; while(*p) {if (*p > *pu++ || *p++ < *pl++) {return gaGENERIC_FORCE;}} return s; }
  22. R_RemapShader() - Falta de comprobación(Bounds-check) en COM_StripExtension - Un servidor

    malicioso puede provocar que los usuarios que se conecten a él ejecuten código arbitrario.
  23. RCE. ¿Otra vez? - Ejecución de código remoto en el

    cliente. - Se permite la carga de archivos de la máquina virtual de Quake directamente en cliente del juego.
  24. RCE II - Podemos forzar la descarga de un archivo

    por parte del servidor (PK3) - Ese archivo puede contener en su interior QVM que reemplace al código original - Este codigo entra una región del stack donde el propio binario lo busca para ejecutarlo, permitiendo ejecutar una shellcode. - El motor de Quake 3 busca los archivos de manera inversa (z-a).
  25. Conclusiones - Tener presentes si jugamos un juego que cuenta

    con soporte oficial, tanto como para el cliente como para el servidor - Estar jugando las últimas versiones de los juegos. - Si existen versiones libres de juegos, activas es mejor jugar a través de ellas: IOQuake3, OpenJK - Configurar correctamente nuestros clientes y servidores.