(Android) pirateando el servidor con un simple socket

2

He escrito un juego para Android. Ahora, quiero conectar las marcas de los jugadores.

El siguiente código es el programa del lado del cliente, que envía sus nombres, países y marcas al servidor. Básicamente, uso ':' para separar la información.

Sin embargo, los piratas informáticos pueden conocer la ip y el puerto de mi servidor al descompilar el archivo .apk. Luego, pueden crear una aplicación java básica para acceder a mi servidor. Podrían enviarme "hacker: badserver: 123456789". Finalmente, la marca superior se convierte en "123456789".

¿Es el método más seguro para conectar los datos del usuario?

Socket client = new Socket(ip, port);
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hacker:HK:3910");
    
pregunta SzeKaKa 02.07.2014 - 15:39
fuente

3 respuestas

2

Ha encontrado dos problemas "difíciles": autenticación y autorización. Hay muchísima de información en línea sobre este tema, pero en su caso, creo que su problema se remonta al diseño de la aplicación.

Comencemos con dos preguntas:

  1. ¿Cómo sabes si el usuario puede publicar un puntaje alto? ( Autorización )
  2. ¿Cómo sabes que la conexión a tu servidor proviene de un usuario real del juego y no de alguien que se hace pasar por el juego como en tu ejemplo de Java? ( autenticación )

Antes de intentar reinventar la rueda, tenga en cuenta que hay muchas bibliotecas que hacen precisamente eso, con el beneficio adicional de ser madura, probada, funcionando y bien documentada.

Sin conocer los detalles de su aplicación, aquí hay algunas sugerencias:

  • Permite a los usuarios jugar en modo 'solo' o en modo 'en línea'. En el modo anterior, el juego es independiente y no necesita realizar ninguna conexión de red (bueno para usuarios conscientes de la privacidad). En este último caso, los usuarios se registrarán en su servidor.
  • Una vez que un usuario está registrado (inicio de sesión / contraseña) y usted ha verificado que en realidad es un usuario "real" (contestador de correo electrónico, mensaje de texto, etc.), su servidor puede enviar un "token" para jugar.
  • Cuando la aplicación desea enviar su puntuación más alta a su servidor, DEBE autenticarse proporcionando el token de una manera similar a la que describió el usuario @ mike-mackintosh en su respuesta.
  • Obviamente, todas las comunicaciones a / desde deben estar cifradas con TLS u otras formas de cifrado fuerte.
  • Su aplicación debe validar los certificados para evitar ataques de intermediarios.

El escenario se simplifica: por supuesto, un atacante con suficientes recursos podría registrar una cuenta falsa, aplicar ingeniería inversa a su aplicación, determinar el mensaje a utilizar y enviar datos falsos a su servidor. Para evitarlo, deberá pedir a la plataforma que verifique que la aplicación no haya sido manipulada, lo que a su vez significa extender la cadena de confianza al sistema operativo que ejecuta la aplicación, etc. . Al final, se complica (¿has oído hablar de " informática de confianza " y la gestión de derechos digitales?) Y depende del valor que estamos tratando de proteger

Otra vía de investigación podría ser alguna forma de validación del lado del servidor. Por ejemplo, cada vez que un usuario publica una puntuación superior a X, también debe proporcionar "pruebas" de que desbloqueó un cierto logro, por ejemplo. una cadena aleatoria que se guarda en el perfil del usuario cuando llegan a un punto específico del juego. En este caso, puede verificar el lado del servidor que el usuario realmente pasó los logros anteriores anteriormente.

Puedes mejorar aún más las cosas al generar los tokens de "nivel" al combinar el IMEI del teléfono con una clave aleatoria y usar algún tipo de cifrado de clave pública para que cada usuario esté vinculado a su teléfono. Lo que funcionaría, a menos que alguien estuviera utilizando una ROM personalizada para Android que permita ajustar el IMEI del teléfono, etc.

    
respondido por el lorenzog 02.07.2014 - 16:24
fuente
0

Tienes algunas opciones. Honestamente, lo más probable es que desee habilitar algún tipo de autenticación, como HMAC, para enviar las solicitudes y asegurarse de que provengan de su aplicación. Si no conoce HMAC, búsquelo en Google, hay mucho contenido.

Consulte este Security.StackExchange respuesta:

  

Se genera un código de autenticación de mensaje (MAC) a partir de un mensaje y un   clave secreta por un algoritmo de MAC. Una propiedad importante de un MAC es que   es imposible producir el MAC de un mensaje y una clave secreta   Sin saber la clave secreta. Un MAC del mismo mensaje producido por   una clave diferente parece no relacionada. Incluso conociendo el MAC de otros   Los mensajes no ayudan a calcular el MAC de un mensaje nuevo.

     

Un HMAC es un MAC que se basa en una función hash. La idea básica es   para concatenar la clave y el mensaje, y juntarlos. Ya que   Es imposible, dado un hash criptográfico, averiguar qué es   el hash de, conocer el hash (o incluso una colección de tales hashes)   No permite encontrar la llave. La idea básica no lo hace.   bastante trabajo, en parte debido a los ataques de extensión de longitud, por lo que el   La construcción real de HMAC es un poco más complicada. Para más   información, navegue por la etiqueta hmac en Cryptography Stack Exchange,   especialmente ¿Por qué H (k || x) no es una construcción MAC segura?   H (k || longitud || x) ¿una construcción MAC segura? y funciones HMAC vs MAC.   Hay otras formas de definir un MAC, por ejemplo, algoritmos basados en MAC   en cifrados de bloque como CMAC.

Además, para proteger su fuente, use proguard, que ayuda a ofuscar la fuente de APK de un decalválico dalvik. enlace

Esto no es infalible, pero eliminará algunos de los huevos malos rápidamente.

    
respondido por el Mike Mackintosh 02.07.2014 - 15:49
fuente
0

Hay dos cosas que debes hacer para resolver tu problema.

Uno es ver SSL mutuo . Esto permitirá a su cliente autenticar su servidor y su servidor autenticará a su cliente evitando el repudio. Hay algunos enlaces en SE sobre esto.

  

Mutual SSL proporciona las mismas funciones que SSL, con la adición de la autenticación y el no repudio de la autenticación del cliente, utilizando firmas digitales. Cuando se utiliza la autenticación mutua, el servidor solicitará al cliente que proporcione un certificado además del certificado del servidor emitido al cliente.

autenticación mutua entre dos clientes

enlace

Lo segundo que debe asegurarse de hacer independientemente es bloquear la API de su servidor. Valide todas las entradas que reciba independientemente.

Tenga en cuenta que en Android el usuario obtiene su apk, por lo que en muchos casos los esfuerzos de seguridad pueden superarse. Sin embargo, con los pasos anteriores, debería poder aumentar el nivel de esfuerzo tanto que los usuarios malintencionados no estén interesados en pasar el tiempo para romper su aplicación.

    
respondido por el KDEx 06.07.2014 - 16:18
fuente

Lea otras preguntas en las etiquetas