Proteger la aplicación para que no sea modificada

10

Tengo una pregunta sobre cómo proteger un programa de modificaciones si ese programa puede comunicarse con un servidor de validación remoto. Más específicamente, estoy pidiendo un archivo APK de Android, pero también puede ir a cualquier otro programa.

Me imagino el siguiente escenario hipotético:

Hay un archivo de instalación APK que el usuario está descargando e instalando en su dispositivo. La aplicación, después de ser instalada y utilizada, envía " alguna información " sobre su integridad a un servidor remoto. El servidor está validando que el programa está bien o está modificado por hackers.

Dado el escenario y el hecho de que los archivos APK están escritos en Java, ¿cuáles son algunas de las formas que un desarrollador puede usar para generar un valor hash de sus archivos de aplicación, de modo que posteriormente este hash se pueda enviar a un servidor remoto que a su vez ser capaz de validar ese hash - hash sobre el tamaño de los archivos, o algún otro tipo de estructura?

Me interesan algunas formas de generar esa " información " que se envía al servidor de validación.

Por favor, corríjame si la pregunta no está bien hecha ya que este escenario no es tan claro para mí y quizás haya otras maneras en que esto se puede lograr más fácilmente. Muchas gracias!

--- EXTENSIÓN ---

¡Hola y muchas gracias por las respuestas!

Me sorprenden las respuestas un poco, porque no pensé demasiado en el tema y pensé que habría un mecanismo fácil para hacer esto :) Pero ahora escucho que incluso los TPM no pueden garantizar el 100% protección ...

Como experto en el tema, me gustaría preguntar algo más. No quiero proteger el programa de la redistribución, como un mecanismo de protección contra copia. Quiero que el programa se pruebe de vez en cuando a través del servidor de validación, que no esté modificado.

Este es el escenario:

El servidor que distribuye la aplicación (que proporciona la descarga) calcula un hash del programa con algún algoritmo extraño, si lo hay. Más tarde, el programa utiliza el mismo algoritmo extraño para calcular un hash de sí mismo y enviarlo al servidor. El servidor luego compara los dos hashes. Si alguien ha modificado un archivo, por ejemplo, una instrucción JMP, el hash debe ser diferente y la aplicación se considera pirateada. ¿Cuáles son las fallas en este escenario? ¿Alguien podrá disolver el algoritmo para calcular el hash del programa y luego modificar el programa para enviar el mismo valor al servidor?

E incluso si este es el caso, ¿crees que esto todavía es mucho trabajo para que alguien lo haga, y puede que no valga la pena?

    
pregunta luben 23.07.2011 - 16:11
fuente

5 respuestas

13

El escenario que describe es muy similar al concepto de "atestación remota". Ha habido mucha investigación sobre esto y hay dos resultados principales:

  • Necesita un ancla de confianza, como el TPM o un servicio de sistema confiable, para medir su aplicación de manera segura e informar los resultados al servidor. De lo contrario, siempre puede crear un simulador que genere las respuestas correctas [1].

  • Una vez que implementas y utilizas toda la infraestructura informática confiable, aún no puedes prevenir o incluso detectar la explotación de vulnerabilidades en tu aplicación con más seguridad que al implementar la tecnología de desbordamiento de búfer estándar de hoy.

Entonces, si desea implementar esto hoy, su mejor opción es la ofuscación de código. Básicamente, desea implementar un mecanismo de protección contra copia, igual que se ha implementado y roto por décadas.

[1] Ha habido algunos avances muy interesantes que explotan los límites de cómputo y comunicación de la plataforma cliente, pero esto todavía es ciencia ficción.

    
respondido por el pepe 23.07.2011 - 16:35
fuente
6
  

¿Cuáles son las fallas en este escenario?

La falla básica aquí es que usted asume que la parte remota se adhiere a sus reglas.

Tienes un servidor con un programa.

Recibe una solicitud de descarga.

En este momento no tiene idea de quién o qué es el descargador remoto.

Una vez descargado, un adversario puede guardarlo donde quiera. Pueden intentar ejecutar su programa en cualquiera de varios depuradores, emuladores o hardware físico. Es bastante trivial para el adversario evitar que su programa se comunique con cualquier sistema remoto mientras se depuran, desensamblan, ejecutan, modifican o analizan.

  

¿Alguien podrá desarmar el algoritmo para calcular el hash del programa y luego modificar el programa para enviar el mismo valor al servidor?

El problema básico con el envío del hash al servidor es que no hay ningún incentivo para permitir que el programa envíe ese hash.

Imagina un dispositivo estándar con un firewall de aplicación. El usuario descarga y ejecuta su programa sin modificaciones. Cuando su programa intenta enviar el hash al servidor, el firewall de la aplicación muestra un diálogo que le pregunta: "La aplicación YourApp es un intento de conexión a Internet, ¿desea permitir esto?" El usuario no tiene incentivo para decir que sí.

Ahora imagine un adversario que haya modificado su programa. Ejecutan su aplicación en un dispositivo estándar con un firewall de aplicación. Ahora, cuando el firewall de la aplicación aparece un diálogo. El adversario tiene incentivos para no permitir que el programa se comunique con el servidor.

  

¿Crees que esto todavía es mucho trabajo para que lo haga alguien, y puede que no valga la pena?

El problema de la verificación remota del software es un problema fundamental en el que se ha trabajado durante décadas. Existen enfoques que funcionan bien para escenarios específicos y posibles atacantes. Sin embargo no hay una solución general.

Para su escenario, donde algunos usuarios remotos tienen control completo sobre la plataforma de hardware de destino, el binario de la aplicación es fácil de desmontar, y no hay ningún incentivo para que un usuario permita que su aplicación se comunique con su servidor. Detecta muy pocas de las modificaciones totales. En el peor de los casos, todas las modificaciones no se notificarán, y los informes no modificados le darán la falsa sensación de que nadie está modificando su software.

    
respondido por el this.josh 24.07.2011 - 08:36
fuente
6

Respecto a la extensión:

El esquema que propones también es fácil de romper: registro el hash que su software envía al servidor, luego modifico la aplicación y respondo el hash cada vez que el servidor lo solicite. Incluso si creas un protocolo estilo desafío-respuesta (para proporcionar frescura), puedo depurar tu aplicación para descubrir cómo generas la respuesta. En general, este ataque siempre es posible y su seguridad depende completamente de la cantidad de técnicas de ofuscación y anti-depuración. Puede engañar al 90% de sus clientes con seguridad moderada, pero recuerde que solo se requiere que un usuario publique un "crack" para su programa y que todos puedan usar una versión modificada que envíe los hashes correctos a su servidor.

Las palabras clave para la investigación actual sobre este tema son "certificación de software" o "agentes móviles seguros". Estos mecanismos solo son seguros bajo algunos requisitos bastante estrictos que son difíciles de lograr en la práctica (google "en la dificultad de la certificación del software" y "la certificación basada en PUF").

La mejor manera de resolver tales problemas en la práctica, aquí y ahora, es mover partes significativas de su servicio al servidor. Si el valor real proviene de la comunicación con el servidor, hay mucho menos incentivo para hacer trampa. Considere los juegos en línea. ¿Quizás pueda tener algunas "funciones sociales" como clasificaciones, salas de chat u otros servicios que proporciona desde el servidor?

    
respondido por el pepe 23.07.2011 - 21:52
fuente
6

Puede hacer que a un atacante le resulte más difícil modificar los archivos, pero no puede evitar que se modifique cualquier cosa que le entregue al atacante al final.

Suponiendo que el atacante tenga acceso completo a su computadora. Hay un trabajo que está realizando el Trusted Computing Group y otros proveedores para restringir las habilidades del propietario. Esos módulos informáticos de confianza se utilizan principalmente en consolas de juegos y teléfonos inteligentes. Pero tan pronto como esta protección se retire (por ejemplo, el teléfono está "rooteado"), se aplica el párrafo anterior.

Esas modificaciones incluyen la suma de comprobación enviada al servidor. Para dar un ejemplo digno de mención: en los Países Bajos, el CEO de Nedap afirmó que sus computadoras de votación son una máquina específica para propósitos especiales que solo se puede usar para elecciones y nada más. WVSN y CCC le portaron un programa de ajedrez de código abierto para demostrar que el CEO está equivocado. Como característica especial de la protección, la computadora de votación tiene un botón que calcula la suma de comprobación del programa y la muestra para evitar manipulaciones. El programa de ajedrez mostró el mismo número . ( artículo de Heise en alemán).

Puede hacer que sea más difícil usando muchas sumas de comprobación diferentes y no usándolas simplemente, pero como parte de los cálculos: Skype usa las sumas de comprobación para calcular el destino de los JMP como una tecnología anti depuración. Un punto de interrupción estándar modificará el programa depurado y, por lo tanto, hará que salte a los lugares equivocados. Skype finalmente se diseñó a la inversa ejecutando una segunda copia como oracle. ( Aguja de plata en Skype )

Otro ejemplo que probablemente se ajuste mejor a tus metas es SecondLife. Second Life es un juego en línea en el que los jugadores pueden crear y vender su propio contenido. A pesar de su DRM, cualquier tipo de información, que se envíe al cliente (texturas, animaciones, sonido), se ha copiado ilegalmente. Solo la información que se guarda en el servidor (scripts de usuario) es segura. Entré en más detalles sobre esto en ¿Hay ¿Técnicas de DRM para prevenir efectivamente la piratería?

    
respondido por el Hendrik Brummermann 23.07.2011 - 18:11
fuente
4

Es posible que le interese el enfoque que Microsoft ha adoptado con Authenticode y .NET.

enlace

    
respondido por el random65537 24.07.2011 - 21:49
fuente

Lea otras preguntas en las etiquetas