¿Cómo evito la suplantación de identidad en un juego multijugador?
9
Estoy pensando en los clientes falsificando direcciones IP, engañando a otros clientes que son el servidor; ese tipo de cosas (No sé mucho sobre esto, así que si esto está completamente mal, corrígeme).
¿Qué debo hacer para evitar esto? Debido a que es un juego en tiempo real, si usara cifrado, usaría algo rápido y seguro como RC4. ¿Debo cifrar los datos del paquete con una clave que el servidor le da al cliente?
Una posible solución es autenticar al usuario utilizando TCP + TLS; luego, dentro del mismo canal, use algo como Diffie-Hellman para negociar una clave simétrica. Finalmente, encripte cada paquete UDP utilizando un algoritmo simétrico como RC4.
Técnicamente, no necesita usar TCP + TLS para negociar la clave simétrica si usa algo como SRP , solo recuerde que Diffie-Hellman es vulnerable a un ataque MITM .
Podría ir aún más lejos y usar el campo SEQ personalizado en sus paquetes UDP (si está utilizando algún tipo de UDP confiable) para implementar una forma de encriptación en modo contador , donde agrega el número SEQ a la clave negociada para cada paquete; haciendo que sea mucho más difícil montar un ataque conocido de texto sin formato.
No permita que su servidor entregue claves a voluntad: un servidor 'falso' podría entregar fácilmente su propia clave; derrotando el propósito de todo su esquema de encriptación. La única forma segura es usar TLS o conocimiento mutuo (como una contraseña / hash).
¿Podría describir exactamente qué vulnerabilidades cerraría esto? Escuché sobre la suplantación de propiedad intelectual y cosas por el estilo, pero no estoy educado sobre el tema
liamzebedee
@ LiamE-p GameDev no es el lugar para un curso intensivo sobre seguridad; ni tengo tiempo para repartir uno. Esencialmente, SRP y TLS (cualquiera) deben ser tan seguros como su sitio web de banca en línea; SRP más aún con el modo CTR. Si necesita más explicaciones, debe preguntar en el sitio web de Security SE.
Jonathan Dickinson
Esto definitivamente sería un tema sobre seguridad SE. Marcaré un mod para migrarlo allí.
Rory Alsop
8
Tengo un fondo lejano (hace 2 años) en piratería, los paquetes más difíciles de descifrar (y lo que sugiero que use) es usar un método de cifrado de clave simétrica que Jonathan Dickinson describió en resumen. Debe usar TCP + TLS como también lo mencionó. Sin embargo, dijo una secuencia contraria.
Me he topado con tiempos en los que un sistema de programadores "a prueba de pirateo" se engañaba fácilmente porque tenían un sistema de conteo lo suficientemente extraño como para poder descifrarlo sin conocimientos de programación y lógica algebraica del primer año. Siempre que elija un método secuencial adecuado, su objetivo debe recibir los datos exactamente como se esperaba, lo que también significa que debe usar TCP para las operaciones más seguras.
De vuelta al camino de "en mis experiencias", un sistema que encontré funciona fantásticamente. Un método secuencial basado en el tiempo enviado y el tiempo esperado. Como los paquetes siempre deben recibirse en el orden correcto, falsificar un paquete era casi imposible, ya que nunca podría predecir cuándo se enviaría un paquete y cuándo se esperaba (entre un paquete y otro) sin hackear primero el programa cliente.
La respuesta corta
En resumen: cada estructura de paquete también tendría una marca de tiempo como cuando se envió al milisegundo. Eso es muy simple y es muy fácil verificar si un momento es anterior / posterior a otro. La razón por la que tiene tanto sentido es porque el servidor aún puede recibir paquetes en orden de suplantación de identidad, sin tiempo de autenticación.
Obviamente, este no es el único método secuencial o incluso el mejor de cualquier método. Es solo uno que he encontrado que funciona muy bien. En combinación con TCP + TLS, no debería tener demasiados problemas.
El problema con los juegos es que las cosas suceden en niveles inferiores a milisegundos.
Jonathan Dickinson
@ JonathanDickinson Eso es completamente cierto. Pero usando UDP y cuando se usa TCP especialmente, se deben usar algoritmos de cálculo muertos para operaciones de sub milisegundos e incluso muchas operaciones de milisegundos. Eso es para ayudar en la velocidad, las imágenes y algunas cosas detrás de escena, por supuesto. (principalmente relacionado con la velocidad)
Joshua Hedges
66
Supongo que al final del día es un juego y no un sistema de control satelital de rayos de muerte. +1
Jonathan Dickinson
4
Personalmente, no me excedería demasiado pronto. Incluso si encriptas tus paquetes como Jonathan recomienda, los hackers como mi hermano solo accederán a los datos del paquete antes de que estén encriptados. Si los usuarios malintencionados desean ingresar, encontrarán una forma de ingresar.
Ahora que eso está fuera del camino, hay formas para que los desarrolladores independientes minimicen el daño que los usuarios maliciosos pueden hacer. Probablemente debería encriptar sus paquetes salientes, pero eso solo detendrá ciertos tipos de ataques, no se engañe y piense que ahora es "a prueba de piratería". Para desactivar realmente a los piratas informáticos, proporcione a los clientes el menor control de cambio de juego posible. Uno de estos grandes MMO existentes solía permitir que los clientes le dijeran al servidor cuánto XP habían ganado. ¿Adivina qué pasó allí? No hagas eso. Deja que el cliente le diga al servidor que quiere lanzar un súper hechizo sobre la criatura, y luego deja que el servidor resuelva la acción y luego agregue el XP cuando la criatura esté muerta. Los clientes deben ser terminales delgados, tontos, que pueden enviar y recibir comandos, y pueden hacer algunas predicciones (si es necesario).el juego y reaccionar a los comandos enviados por los clientes.
Las grandes compañías de juegos usan lo anterior además de algo como VAC o PunkBuster para evitar que los piratas informáticos conocidos continúen interrumpiendo a los clientes que pagan. El funcionamiento de estas medidas de seguridad se mantiene en secreto, pero conozco un método que utilizan: escanean las aplicaciones que se ejecutan actualmente y las comparan con las listas de hacks conocidos. Una vez que haya sido atrapado haciendo trampa, no podrá unirse a los servidores seguros VAC / PunkBuster.
Tengo un fondo lejano (hace 2 años) en piratería, los paquetes más difíciles de descifrar (y lo que sugiero que use) es usar un método de cifrado de clave simétrica que Jonathan Dickinson describió en resumen. Debe usar TCP + TLS como también lo mencionó. Sin embargo, dijo una secuencia contraria.
Me he topado con tiempos en los que un sistema de programadores "a prueba de pirateo" se engañaba fácilmente porque tenían un sistema de conteo lo suficientemente extraño como para poder descifrarlo sin conocimientos de programación y lógica algebraica del primer año. Siempre que elija un método secuencial adecuado, su objetivo debe recibir los datos exactamente como se esperaba, lo que también significa que debe usar TCP para las operaciones más seguras.
De vuelta al camino de "en mis experiencias", un sistema que encontré funciona fantásticamente. Un método secuencial basado en el tiempo enviado y el tiempo esperado. Como los paquetes siempre deben recibirse en el orden correcto, falsificar un paquete era casi imposible, ya que nunca podría predecir cuándo se enviaría un paquete y cuándo se esperaba (entre un paquete y otro) sin hackear primero el programa cliente.
La respuesta corta
En resumen: cada estructura de paquete también tendría una marca de tiempo como cuando se envió al milisegundo. Eso es muy simple y es muy fácil verificar si un momento es anterior / posterior a otro. La razón por la que tiene tanto sentido es porque el servidor aún puede recibir paquetes en orden de suplantación de identidad, sin tiempo de autenticación.
Obviamente, este no es el único método secuencial o incluso el mejor de cualquier método. Es solo uno que he encontrado que funciona muy bien. En combinación con TCP + TLS, no debería tener demasiados problemas.
fuente
Personalmente, no me excedería demasiado pronto. Incluso si encriptas tus paquetes como Jonathan recomienda, los hackers como mi hermano solo accederán a los datos del paquete antes de que estén encriptados. Si los usuarios malintencionados desean ingresar, encontrarán una forma de ingresar.
Ahora que eso está fuera del camino, hay formas para que los desarrolladores independientes minimicen el daño que los usuarios maliciosos pueden hacer. Probablemente debería encriptar sus paquetes salientes, pero eso solo detendrá ciertos tipos de ataques, no se engañe y piense que ahora es "a prueba de piratería". Para desactivar realmente a los piratas informáticos, proporcione a los clientes el menor control de cambio de juego posible. Uno de estos grandes MMO existentes solía permitir que los clientes le dijeran al servidor cuánto XP habían ganado. ¿Adivina qué pasó allí? No hagas eso. Deja que el cliente le diga al servidor que quiere lanzar un súper hechizo sobre la criatura, y luego deja que el servidor resuelva la acción y luego agregue el XP cuando la criatura esté muerta. Los clientes deben ser terminales delgados, tontos, que pueden enviar y recibir comandos, y pueden hacer algunas predicciones (si es necesario).el juego y reaccionar a los comandos enviados por los clientes.
Las grandes compañías de juegos usan lo anterior además de algo como VAC o PunkBuster para evitar que los piratas informáticos conocidos continúen interrumpiendo a los clientes que pagan. El funcionamiento de estas medidas de seguridad se mantiene en secreto, pero conozco un método que utilizan: escanean las aplicaciones que se ejecutan actualmente y las comparan con las listas de hacks conocidos. Una vez que haya sido atrapado haciendo trampa, no podrá unirse a los servidores seguros VAC / PunkBuster.
Relacionado: ¡ Lógica del juego en el servidor! ¿Bueno o malo?
fuente