El documento describe los diferentes métodos para probar la seguridad de aplicaciones Android, incluyendo análisis estático y dinámico, pruebas de caja blanca y negra, y herramientas como Android Lint, SonarQube, Agnitio Tool, Androwarn, DroidBox y Drozer. También cubre temas como el desarrollo seguro de componentes, encriptación, almacenamiento de datos, logs, webviews, librerías de terceros, SQLite, ofuscación, detección de rooting, y pentesting y forensics móv
3. INDEX
•Introducción al ciclo de desarrollo
•Análisis estático y dinámico
•Desarrollo seguro en componentes
•Librerías de encriptado
•OWASP Mobile Top Risks Security
•Ofuscación de aplicaciones
•Herramientas de pentesting /forensics
4. Ciclo de desarrollo
Requerimientos
Análisis
Diseño
Desarollo
Testing / QA
Security review en
cada iteración
+Security
Requirements
Analysis
El Testing de seguridad se debería integrar en
el ciclo de desarrollo e integración contínua
desde las primeras etapas
El objetivo es detectar posibles riesgos y
minimizar las vulnerabilidades que nuestra
aplicación pueda generar
6. Security testing
SQLite
• Cifrado
• SQL injection
Cifrado de datos
HTTPS
Información sensible
Almacenamiento
• Ficheros
• Shared Preferences
• BD SQLite
• Logs
• Cache
Enfocadas a verificar que el
software está protegido de ataques
externos y a certificar que se
protege la confidencialidad,
integridad y disponibilidad del
sistema y sus datos
Security testing is a process to determine
that an information system protects data
and maintains functionality as intended.
7. Security test cases
Test cases Example
Título/grado Encriptación /critical
Descripción Encriptar los datos sensibles del usuario que
se envían y reciben
Detalles La información sensible(datos personales)
se tiene que encriptar durante la
transmisión o peticion de los mismos
Resultado
esperado
La aplicación encrypta o cifra la información
mediante alguno de los algoritmos
soportados por el SDK
8. White box / Black box
•Pruebas de caja blanca
•Pruebas de caja negra
Análisis estático
Cobertura de código
Control de flujo
Análisis dinámico
Comportamiento en tiempo de ejecución
Performance
12. Android plugin in Sonar
https://github.com/SonarCommunity/sonar-android
13. Android plugin in Sonar
https://github.com/SonarCommunity/sonar-android
14. Android plugin in Sonar > Rules
https://github.com/SonarCommunity/sonar-android
JavascriptInterface [Missing @JavascriptInterface on methods]
As of API 17, you must annotate methods in objects registered with the addJavascriptInterface
SetJavaScriptEnabled [Using setJavaScriptEnabled in webview]
Your code should not invoke setJavaScriptEnabled if you are not sure that your app really requires
JavaScript support
WorldReadableFiles [openFileOutput() call passing MODE_WORLD_READABLE]
There are cases where it is appropriate for an application to write world readable files, but these should be
reviewed carefully to ensure that they contain no private data that is leaked to other applications
HardcodedDebugMode [Hardcoded value of android:debuggable in the manifest]
AllowBackup [Missing allowBackup attribute]
23. Análisis dinámico
•Monitorizar la aplicación
•Analizar el tráfico de red(Burp Suite,Wireshark,Fiddler)
•Inyectar instrucciones para detectar
comportamientos anómalos o sospechosos
•DroidBox
•Drozer
•TraceDroid
31. Factores de riesgo
•Permisos en androidManifest.xml
•Verificar la firma de la aplicación
•Origen de la aplicación
•Dispositivo rooteado
•Depuración habilitada en androidManifest
<application android:debuggable=“true”/>
32. Proteger los datos
set android:allowBackup=false
Crear ficheros en MODE_PRIVATE
Evitar almacenar información sensible en la SD
CARD
Filtrar información de log
33. Almacenamiento
en ficheros
• MODE_WORLD_READABLE
• MODE_WORLD_WRITABLE
• MODE_PRIVATE
/mnt/sdcard is world-readable
and world‐writable
• WRITE_TO_EXTERNAL_STORAGE
PERMISSION
• Any application can access to sd-
card
WORLD_READABLE / WORLD_WRITABLE
Deprecated API >=17
Otra aplicación podría leer el fichero si conoce la ruta
Fichero que contengan información
confidencial deberían crearse con el permiso
MODE_PRIVATE
34. Logs
Sólo mostrar en
modo debug
Eliminar logs
con proguard
public static final boolean SHOW_LOG =
BuildConfig.DEBUG;
public static void d(final String tag, final String msg) {
if (SHOW_LOG)
Log.d(tag, msg);
}
-assumenosideeffects class android.util.Log
{
public static boolean isLoggable(java.lang.String, int);
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** e(...);
}
Proguard
configuration
35. Atributo export
•En activity,content providers,broadcast
receivers y servicios debería estar a false
•Por defecto esta a false a partir de la version
4.2 en content-providers
36. Limitar acceso desde otras aplicaciones
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
ComponentName v0 = this.getCallingActivity();
if (v0 == null) { this.finish(); }
else if (!"package_name".equals(v0.getPackageName())) { this.finish(); }
}
• Comprobar que quien llama a la activity sea un
componente que se encuentre en el mismo
paquete/proyecto
38. Webview
Deshabilitar JavaScript para evitar ataques cross-site
scripting(XSS)
myBrowserSettings.setJavaScriptEnabled(false);
Deshabilitar el acceso a ficheros
myBrowserSettings.setAllowFileAccess(false);
Usar la anotación @JavascriptInterface para aquellos métodos
que queramos exponer en javascript
40. SQLite / SQLCipher
Fichero que se guarda en
/data/data/<package>/databases
Permite cifrar la base de datos con el algoritmo
de encriptación AES 256 bits
SQLiteDatabase myPrivateDB =
openOrCreateDatabase("Contacts", MODE_PRIVATE, null);
43. Secure Preferences
https://github.com/scottyab/secure-preferences
Fichero que se guarda en /data/data/<package>/shared_prefs
Librería que permite securizar este fichero
Permite cifrar keys y values
AES Encryption(Simétricomisma clave para encriptar y
desencriptar)
La primera vez que se instancia SecurePreferences,se crea
una clave que permite encriptar y desencriptar los valores
49. Detectar root
Permisos lectura /escritura sobre la carpeta
system
Comprobar acceso a los ficheros de las
aplicaciones dentro de
/data/data/<package_name>
51. Anti-malware
Escanear aplicaciones y paquetes con la
información obtenida de
PackageManager.getInstalledPackages(int)
Comprobar nombres de paquetes,permisos y
firmas
Comprobar cada vez que se instala una
aplicación a través del intent
android.intent.action.PACKAGE_ADDED
57. Pentesting
Distribuciones que tienen integradas la mayorías
de aplicaciones de análisis estático y dinámico
Santoku linux https://santoku-linux.com
Mobisec http://sourceforge.net/projects/mobisec