Deshabilitar el modo de depuración de la aplicación de Android como práctica de seguridad

5

Hay una práctica de seguridad que dice que no debes publicar tu aplicación de Android con el modo de depuración habilitado.
Si bien un atacante puede usar apktool para descompilar tu aplicación, habilita el indicador de depuración en AndroidManifest.xml y lo recompila, ¿cómo no es realmente útil publicar la aplicación en modo de depuración?

¿Debería combinarse con técnicas de descompilación para ser útiles?

¿Qué información adicional se coloca en la aplicación en modo de depuración, si la hay, a la que no tendrá acceso cuando más tarde descompile y habilite el indicador de depuración?

    
pregunta Silverfox 12.03.2016 - 20:04
fuente

2 respuestas

4

Esta es probablemente la misma razón por la que no desea lanzar un programa C / C ++ con las marcas -g . Es probable que los símbolos innecesarios se eliminen o se confundan. El sistema de compilación podría omitir ciertas medidas de seguridad que harán que la depuración de la aplicación sea mucho más fácil. Es probable que los scripts de compilación de Pro-guard no estén incluidos en una compilación de depuración.

Los siguientes son diferentes tipos de datos que se pueden mantener en las versiones de depuración dependiendo de la configuración. Esperamos que pueda ver por qué estos podrían ser útiles para alguien que busca realizar ingeniería inversa en su aplicación.

Símbolos de depuración

Los símbolos de depuración son piezas selectas de información que se almacenan dentro del binario de depuración. Se incluyen todos los nombres de funciones, nombres de archivos, a veces incluso números de línea. Esto es para que cuando un programa falla y se agrega un depurador, toda esta información se puede incluir en los seguimientos de la pila. Permite al programador localizar la línea de código que está causando un error. Un seguimiento de la pila de depuración podría ser similar al siguiente ( tomado de esta respuesta ):

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Un programa sin símbolos de depuración solo conocerá las definiciones de la biblioteca. Me gusta lo siguiente:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff7fd3700 (LWP 22532)]0x00007fffe10002b4 in ?? ()
(gdb) bt
#0  0x00007fffe10002b4 in ?? ()
#1  0x0000000000000202 in ?? ()
#2  0x00007fffe1000160 in ?? ()
#3  0x00007ffff66bd1a9 in execute_internal_vm_tests () at /home/bionix/Openjdk8/hotspot/src/share/vm/prims/jni.cpp:5128
#4  0x00007ffff7fd2550 in ?? ()
#5  0x00007ffff6b08bf8 in VM_Version::get_cpu_info_wrapper () at /home/bionix/Openjdk8/hotspot/src/cpu/x86/vm/vm_version_x86.cpp:395
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

ProGuard en Android

Dentro de los scripts de compilación de Android (Gradle) encontrará referencias a ProGuard. ProGuard se utiliza para optimizar, reducir el tamaño binario y ofuscar el código. Debido a que Java puede ser completamente descompilado, Android usa ProGuard para ofuscar el código. Aquí hay un ejemplo de código que ha sido ofuscado con ProGruard:

// Before
btnNew = changeButtonLabel(btnNew, language.getText("new"));
btnOpen = changeButtonLabel(btnOpen, language.getText("open"));

// After
d = a(d, n.a("new"));
e = a(e, n.a("open"));

Puede ver el tutorial completo con enlaces al código fuente.

De la documentación de Android vinculada anteriormente:

  

ProGuard está integrado en el sistema de compilación de Android, por lo que no   Hay que invocarlo manualmente. ProGuard se ejecuta solo cuando construyes tu   aplicación en modo de lanzamiento, por lo que no tiene que lidiar con   código confuso cuando compila su aplicación en modo de depuración.

ProGuard es técnicamente opcional, pero cuando se usa Android Studio, está habilitado de forma predeterminada para las versiones de lanzamiento.

Registro de depuración

Siempre debe tener algún mecanismo en su código para eliminar los mensajes de depuración de su aplicación de lanzamiento. Los mensajes de depuración se almacenan como cadenas dentro del binario y no están ofuscados. Lo que significa que si tiene un mensaje como Log.d("Key " + super_secrey_key); , una persona que analiza el binario ahora sabrá dónde se hace referencia a "Key " . Ahora ha proporcionado contexto y un lugar interesante para comenzar a analizar.

Hay varias formas de eliminar los registros de depuración, y una de ellas es configurar ProGuard para eliminarlos por usted. También hay otras bibliotecas que puede usar, o puede envuelva su registro . De cualquier manera, es importante hacer la distinción entre depuración y lanzamiento para sus mensajes de registro.

    
respondido por el RoraΖ 14.03.2016 - 15:46
fuente
0

No quieres que la ingeniería inversa sea demasiado fácil para tu aplicación. Especialmente si contiene datos confidenciales, como contraseñas de back-end o material de clave privada. Estoy de acuerdo en que una aplicación no debe contener tales secretos para que sea segura, pero la realidad a veces es difícil.

    
respondido por el Mark Koek 12.03.2016 - 23:25
fuente

Lea otras preguntas en las etiquetas