Software seguro: ¿Cómo garantizar que la persona que llama es auténtica?

6

Para los juegos multijugador (competitivos), a menudo existe el problema de la necesidad de detectar jugadores ilegítimos para que se les pueda negar el servicio. Por otro lado, los jugadores legítimos deberían, por supuesto, tener permitido el acceso al servicio.

Estos jugadores ilegítimos se simulan por un medio u otro, pero me gustaría centrarme en ellos cuando se simula mediante el uso de software de terceros que utiliza API de terceros para consultar o enviar información a un servidor central.

Me gustaría entender cómo debe diseñarse esta API para que un software fraudulento (de terceros) no pueda fingir que es el software legítimo (de terceros) que ya está implementado para el usuario final.

Para que quede claro, un software malintencionado lo obtiene un usuario malintencionado, en el que el software de terceros se compila con la API que se comunica con el servidor. Dado que la API se implementa en un usuario legítimo, los desarrolladores del software malintencionado simplemente necesitan realizar una ingeniería inversa (tal vez a través de la ofuscación) de esa API y usarla.

¿Hay alguna forma en que esta API pueda implementar algún protocolo de seguridad para que los usuarios ilegítimos no puedan acceder al servidor en absoluto?

He pensado en exigir alguna contraseña que se envía al servidor para verificar a la persona que llama, pero no puedo ver cómo podemos distinguir entre usuarios genuinos y usuarios falsos.

    
pregunta Nick Miller 29.10.2015 - 22:54
fuente

2 respuestas

3

Básicamente, no puedes ...

Cualquier cosa en el lado del cliente debe ser considerada como pública. Claro, puedes intentar ofuscar la API con varias técnicas, pero siempre hay una forma de realizar ingeniería inversa y crear tu propia API de creación de bots. Debe tener en cuenta que un pirata informático puede controlar todo en el lado del cliente.

¿Qué puedes proteger?

Lo único que puedes proteger es tu servidor. Por lo tanto, si desea controlar lo que sus jugadores pueden o no pueden hacer, debe validar todas sus acciones en el lado del servidor. El servidor debe ser la fuente de la verdad. En este punto, si el servidor puede detectar cualquier acción no válida, un atacante aún podría crear un cliente "no válido" pero las únicas cosas que este cliente podría hacer son acciones válidas. Por lo tanto, es fácil ¿verdad?

Bueno, no mucho. Tratar de validar todo en el lado del servidor crea muchos problemas. Muchos se relacionan con la suavidad con la que se ejecutará el juego, pero también hay que descubrir cómo incluir problemas de red, como un usuario que se está retrasando. Por ejemplo, si va al extremo en términos de protección, irá así:

  • El comando de acción de envío del cliente al servidor
  • El servidor ejecuta la acción (si es válida) y envía el resultado al cliente
  • El cliente simplemente muestra el resultado que el servidor les dijo que mostraran.

Es super simple de hacer y anular cualquier acción no válida, PERO destruye totalmente la experiencia del usuario para cualquier persona con una mala red. Cuando un usuario presiona una tecla para avanzar, espera avanzar de inmediato. Dado que cada acción realiza un viaje de ida y vuelta al lado del servidor, los usuarios que se retrasen experimentarán una acción lenta en todo momento.

¿Qué puedes hacer?

La mejor idea es tener un sistema mixto. Usted realiza la validación en el lado del servidor, PERO todavía "ejecuta" la acción en el lado del cliente tan pronto como ocurren. De esa manera, el usuario piensa que su acción ocurre en el momento en que los realiza, mientras que, de hecho, pueden realizarse unos milisegundos o segundos más tarde. Básicamente, está haciendo una simulación en el lado del cliente, y si el servidor le confirma que todo estaba bien, esa simulación se mantiene. En el caso de que la simulación haya sido considerada incorrecta por el servidor, estas acciones se "invierten".

Es un poco molesto conseguir que ese tipo de sistema sea el correcto, pero es lo único que proporciona una buena experiencia de usuario y al mismo tiempo derrota completamente la acción no válida.

Un enfoque más sencillo: el registro

Dado que, realmente controlar todo en el lado del servidor puede ser una molestia, ya que es difícil decidir qué hacer cuando la historia necesita ser reescrita, un enfoque más fácil es hacer el registro. Deja que el cliente haga casi lo que quiera, él es la fuente de la verdad, pero luego, en el lado del servidor, registra cada acción y detecta cada acción no válida. Las acciones no válidas seguirán ocurriendo, pero si un cliente hace demasiadas, puedes asumir con seguridad que no es un cliente válido y, finalmente, prohibirlo.

Acerca de la ofuscación: Esfuerzo VS Ganancia

Las cosas ofuscantes en el lado del cliente hacen que sea más difícil para un atacante crear un programa de bots, por lo que desalentará a muchos atacantes aspirantes, por lo que tendrá que lidiar con un subconjunto más pequeño de jugadores problemáticos.

No soy un experto en tales técnicas pero es algo similar a:

  • cambiando todos los nombres de variables / métodos
  • insertar código inútil para confundir al ingeniero inverso
  • cifrar el código (pero la contraseña aún está oculta en algún lugar del código ...)

En realidad, solo son cosas para que sea más doloroso tratar de hacer ingeniería inversa al cliente del juego ...

    
respondido por el Gudradain 30.10.2015 - 16:02
fuente
3

Este es uno de los problemas más grandes que enfrentan los juegos competitivos en línea. Desafortunadamente, no hay una solución simple. La forma más efectiva de detectar bots o usuarios malintencionados es a través del análisis de comportamiento.

    
respondido por el Ammar Bandukwala 29.10.2015 - 22:59
fuente

Lea otras preguntas en las etiquetas