testing android security
TRANSCRIPT
Testing Android Security
José Manuel Ortega Candel | @jmortegac
https://speakerdeck.com/jmortega
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
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
Security testing
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.
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
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
Análisis estático
•Analizar el código fuente •Android Lint •Android Studio > Inspect code > Security issues •SonarQube > Android Plugin > Rules •Agnitio Tool •Androwarn • Ingeniería inversa
Android Lint
Android inspect code
Android plugin in Sonar https://github.com/SonarCommunity/sonar-android
Android plugin in Sonar https://github.com/SonarCommunity/sonar-android
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]
Agnitio tool
http://sourceforge.net/ projects/agnitiotool
Análisis estático
Decompilar APK
Buscar llamadas a funciones
que pueden suponer un riesgo
Recomendaciones + checklist
Androwarn https://github.com/maaaaz/androwarn
python androwarn.py -i my_apk.apk -r html -v 3
Telephony identifiers exfiltration: IMEI, IMSI, MCC, MNC, LAC, CID, operator's name... Device settings exfiltration: software version, usage statistics, system settings, logs... Geolocation information leakage: GPS/WiFi geolocation... Connection interfaces information exfiltration: WiFi credentials, Bluetooth MAC adress... Telephony services abuse: premium SMS sending, phone call composition... Audio/video flow interception: call recording, video capture... Remote connection establishment: socket open call, Bluetooth pairing, APN settings edit... PIM data leakage: contacts, calendar, SMS, mails... External memory operations: file access on SD card... PIM data modification: add/delete contacts, calendar events... Arbitrary code execution: native code using JNI, UNIX command, privilege escalation... Denial of Service: event notification deactivation, file deletion, process killing, virtual keyboard disable, terminal shutdown/reboot...
Android Application Vulnerability Scanner tool
Android Application Vulnerability Scanner tool
Ingeniería inversa
Decompile dalvik to smali / classes.dex in APK
APKTOOL
DEX2JAR
Java Decompiler
APKTOOL / DEX2JAR
Ingeniería inversa
https://github.com/nkpanda/Android-Testing
Mobiliz3r
Script en python
Ingeniería inversa
DexInspector
Dalvik bytecode editor
APK Reverser
APK Analyzer
APK Multitool
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
DroidBox https://code.google.com/p/droidbox
Permite monitorizar: Fugas de información / Operaciones E/S de red y sobre ficheros Operaciones de cryptografía / Llamadas SMS y telefónicas
DroidBox
Drozer https://www.mwrinfosecurity.com/products/drozer
Analizar vulnerabilidades a través de un agente/proxy
Permite interactuar con activities,servicios,broadcast receivers y content providers
Automatizar testing de seguridad
Drozer https://www.mwrinfosecurity.com/products/drozer
Drozer
app-.package.info
TraceDroid http://tracedroid.few.vu.nl
Análisis online de peticiones de red,llamadas,sms
También realiza un análisis estático y de cobertura de código
Está orientada a detección de malware
Seguridad en componentes
•AndroidManifest.xml •Activities •ContentProviders •Services •Sqlite •Shared Preferences •Webview
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”/>
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
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
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
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
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
Custom permissions
<provider android:name="SampleContentProvider"
android:authorities="com.example.app.Provider“
android:export=“true"
android:permission="com.example.app.permission.Provider" />
<permission android:protectionLevel="signature"
android:name="com.example.app.permission.Provider">
</permission> protectionLevel="signature" – Permite limitar el acceso a componentes de aplicaciones firmadas con el mismo certificado
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
Librerías de terceros
Analizar posibles vulnerabilidades
PhoneGap
Apache Cordova
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);
SQLite Extension
Full Database Encryption
Good Performance
AES-256 Encryption
Portable
Open Source Core
SQLite / SQL injection
•Construir consultas mediante ?
•Sentencias preparadas
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
Secure prefefences
SharedPreferences prefs = SecurePreferences(context);
Editor edit = prefs.edit(); edit.putString("key", "value"); edit.apply();
Ofuscación
ProGuard / DexGuard /DashO
API Reflection
Encrypted Network Communication
Encrypted Files
Filtrar información de log y debug
Proguard http://proguard.sourceforge.net
Habilitar en Android Studio
build.gradle
Proguard Configuration 1. change names of classes, methods, fields 2. modify the control flow 3. code optimization 4. dynamic code loading 5. change instructions with metamorphic technique
Proguard
Detectar root
Permisos lectura /escritura sobre la carpeta system
Comprobar acceso a los ficheros de las aplicaciones dentro de /data/data/<package_name>
Detectar root https://code.google.com/p/roottools
if (RootTools.isRootAvailable()) { // su exists, do something }
if (RootTools.isAccessGiven()) { // your app has been granted root access }
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
Encriptado
import java.security.*; Import javax.crypto.*; AES / RSA Key 256 bits SecureRandom CBC - Cipher Block Chaining AES/CBC/PKCS5Padding cipher algorithm Password-Based Key Derivation Function
Mobile Top 10 Risks-
OWASP
(Open Web Application Security Project)
Mobile Top 10 Risks
OASAM-
Open Android Security Assessment Methodology http://oasam.org/en
OASAM-
Open Android Security Assessment Methodology http://oasam.org/es
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
Pentesting
Pentesting
https://code.google.com/p/c-ray
Permite probar los intents de forma manual
Forensics
https://github.com/viaforensics/android-forensics
https://www.isecpartners.com/tools/mobile-security.aspx
http://andriller.com
Forensics
Mobile secure coding
Resources
Developer.android.com • https://developer.android.com/training/articles/security-tips.html • https://source.android.com/devices/tech/security
OWASP • https://www.owasp.org/index.php/OWASP_Mobile_Security_Project Open Android Security Assessment Methodology • http://oasam.org/en
Resources
Android libraries security • https://android-arsenal.com/tag/87
Open Source Security Testing Methodology Manual (OSSTMM)
• http://www.isecom.org/research/osstmm.html,
Books
Books
Books
Thank you! José Manuel Ortega Candel | @jmortegac