SlideShare a Scribd company logo
Mobile Security su Android
Stefano Sanna
Mobile Security su Android
Agenda
●
Prigioneri!
●
Attacchi alla rete
●
Attacchi al codice
●
Attacchi ai dati (Sa Scafa)
●
Attacchi agli utenti (The Matrix)
●
Conclusioni
●
Riferimenti e contatti
Mobile Security su Android
“We are all just prisoner
here of our own device”
Eagles, “Hotel California”, 1978
Mobile Security su Android
OLTRE-CENTO-MILIONI-AL-MESE
Mobile Security su Android
Mercato smartphone usati
Mobile Security su Android
Always on...
Mobile Security su Android
SECURITY SU
ANDROID
Mobile Security su Android
Security enhancements on Android
●
ADB Authentication (4.3)
●
AndroidKeyStore Provider (4.3)
●
Certificate pinning (4.4)
●
Updated to WebView without OTA (5.0)
●
Runtime Permissions (6.0)
●
Trusted CA Store (7.0)
●
Network Security Config (7.0)
●
Privacy, Keystore, Unknown apps En. (8.0)
●
KeyStore StrongBox (9.0)
●
Android Protected Confirmation (9.0)
Mobile Security su Android
Market share delle versioni
Mobile Security su Android
Market share delle versioni
Mobile Security su Android
ATTACCO
(D)ALLA RETE
Mobile Security su Android
Always on...
Loghi trovati sul web usando come chiave “free wifi” e “wifi gratis”. Questa slide non attribuisce carattere malevolo a questi loghi
ma vuole solo attirare l’attenzione del lettore sulla molteplicità di occasioni in cui si può incorrere in una rete wireless non sicura,
Mobile Security su Android
… e terzo incomodo!
●
Il modo più facile ed economico per attaccare un
terminale mobile è intercettare le comunicazioni
attraverso la rete Wi-Fi.
●
Accedendo ad una rete wireless sconosciuta, è
complesso capire se a valle dell’Access Point sia
presente una macchina che traccia tutto il
traffico, agendo da proxy più o meno manifesto.
Mobile Security su Android
Banale ma fatale
●
Un attacco MITM (Man-In-The-Middle) si realizza
con un soggetto frapposto tra sorgente e
destinazione in grado di:
– Nascondere la propria presenza ad entrambi
– Tracciare richieste e risposte tra client e server
– Alterare le richieste e/o le risposte in caso di
necessità
Device Man-In-The-Middle
Access
Point
Web
Service
Mobile Security su Android
No hacking: MITM a’ la carte
●
Se non si adotta HTTPS, non è richiesta alcuna
competenza particolare per sniffare il traffico in
chiaro che transita attraverso la connessione
l’hotspot condiviso.
●
E’ obbligatorio implementare tutte le
comunicazioni in HTTPS, anche quando si
accede a dati pubblici e senza
autenticazione
– l’attaccante potrebbe comunque alterare il
risultato
Mobile Security su Android
Semplice MITM con macOS
Si attiva un hotspot Wi-Fi che condivide la connessione ad Internet fornita via Ethernet
Mobile Security su Android
Proxy o VPN
●
Una (valida!?!) alternativa è ingannare l’utente
facendogli installare un client VPN o passare
attraverso un proxy HTTP/HTTPS
●
Può essere utile installare una utility di packet
capture (ad esempio SSL Capture) per verificare il
comportamento dell’app in presenza di
(potenziali) attacchi MITM. Senza opportune
contromisure, una applicazione malevola può
intercettare tutto il traffico di rete
Mobile Security su Android
SSL Capture
●
Chiede l’installazione di un certificato self-signed
per l’attivazione di una VPN.
Mobile Security su Android
SSL Capture attivo su Android 6
●
Apertura homepage https://www.fsf.org: tutto il
traffico è intercettato e decodificato!
Mobile Security su Android
Certificate Pinning
●
Per verificare l’autenticità del servizio,
l’applicazione possiede una copia del fingerprint
del certificato atteso: alla connessione può
confrontare l’impronta con quello ottenuto dal
server remoto
●
E’ possibile confrontare uno specifico certificato
oppure uno degli elementi della catena (ad
esempio, l’emittente)
●
Android 7 supporta il Certificate Pinning
nativamente con la Network Security
Configuration
Mobile Security su Android
Mobile Security su Android
Certificate Pinning con OkHttp
CertificatePinner certPinner =
new CertificatePinner.Builder()
.add("https://www.fsf.org",
"sha256/H+5xdXgfQgGqgHqLlU48gpjtAdmjiinuP1KcgW2XVPk=")
.build();
OkHttpClient client =
new OkHttpClient.Builder()
.certificatePinner(certPinner)
.build();
Request request = new Request.Builder().url(URL_STRING).build();
Response response = client.newCall(request).execute();
final String body = response.body().string();
Mobile Security su Android
Certificate Pinning su Android >= 7
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="it.gerdavax.gulch.linuday2018.ld2018http">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:networkSecurityConfig="@xml/network_security_config" ...
●
Si specifica sul Manifest la presenza di un file di
policy di sicurezza per la libreria di networking
Mobile Security su Android
Certificate Pinning su Android >= 7
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">fsf.org</domain>
<pin-set expiration="2019-01-01">
<pin
digest="SHA-256">H+5xdXgfQgGqgHqLlU48gpjtAdmjiinuP1KcgW2XVPk=</pin>
</pin-set>
</domain-config>
</network-security-config>
●
Il file network_security_config contiene le
informazioni di pinning
Mobile Security su Android
Ricavare SHA-256 Digest in Base64
gerdavax:~$ openssl s_client -connect www.fsf.org:443
< /dev/null 2 > /dev/null |
openssl x509 -pubkey -noout |
openssl rsa -pubin -outform der 2>/dev/null |
openssl dgst -sha256 -binary |
openssl enc -base64
H+5xdXgfQgGqgHqLlU48gpjtAdmjiinuP1KcgW2XVPk=
Mobile Security su Android
Certificate Pinning su Android 6
●
Apertura homepage https://www.fsf.org: la
connessione è interrotta per errore sul certificato!
Mobile Security su Android
Bypass su Android 7+
●
ll sistema bypassa automaticamente connessioni
con certificato self-signed (anche senza pinning)
Mobile Security su Android
ATTACCO AL
CODICE
Mobile Security su Android
Cambio di bersaglio
●
Se l’obiettivo non è accedere ai dati dell’utente
(credenziali, informative…) ma attaccare un
servizio, allora potrebbe essere superfluo
intercettare il traffico di rete
●
Più efficace analizzare il codice binario
dell’applicazione per studiare l’interfaccia di
comunicazione del servizio di interesse
Mobile Security su Android
Un semplice client HTTP (1/3)
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Thread t = new Thread() {
@Override
public void run() {
ConnectionManager.doConnection();
}
};
t.start();
}
});
Mobile Security su Android
Un semplice client HTTP (2/3)
public static void doConnection() {
try {
URL url = new URL(Constants.URL_STRING);
HttpsURLConnection https = (HttpsURLConnection)
url.openConnection();
String credentials = Constants.USERNAME_STRING +
":" + Constants.PASSWORD_STRING;
https.setRequestProperty("Authorization", "Basic " +
Base64.encodeToString(credentials.getBytes("UTF-8"),
Base64.DEFAULT));
InputStream input = https.getInputStream();
} catch (Throwable t) { }
}
Mobile Security su Android
Un semplice client HTTP (3/3)
final class Constants {
static final String URL_STRING = "https://www.fsf.org";
static final String USERNAME_STRING = "MyUsername";
static final String PASSWORD_STRING = "MySuperPassword";
}
Mobile Security su Android
Reverse engineering made simple
Estrarre APK dal device
Decomprimere APK
Convertire file DEX in JAR
Decompilare file JAR
adb pull PATH_TO_APK
unzip FILENAME.apk
dex2jar classes.dex
Mobile Security su Android
Reverse engineering made simple
Mobile Security su Android
Reverse engineering made simple
Mobile Security su Android
Code Obfuscation
●
Se l’API del servizio non è pubblica, può essere
opportuno offuscare il codice affinché sia difficile
ricostruire la logica applicativa con cui si
elaborano request e response del servizio
●
E’ sufficiente impostare l’attributo
“minifyEnabled” nel file gradle del modulo
dell’app per attivare la Code Obfuscation
attraverso Proguard
●
Un insieme di regole consente di specificare quali
classi/campi/metodi devono essere offuscati e
quali devono essere lasciati inalterati
Mobile Security su Android
Codice troppo semplice!!!
Mobile Security su Android
Just an illusion...
●
Il processo di obfuscation non può
“nascondere” le chiamate alle librerie di
sistema (ART non riuscirebbe a risolverne i
riferimenti)
●
E’ necessario creare livelli di indirezione, in cui i
dati per le librerie di sistema (URL, parametri,
credenziali) sono elaborati per via algoritmica
custom prima di essere passati come argomenti
ai metodi
Mobile Security su Android
Costanti? Ancora più semplice!
Mobile Security su Android
Gestione delle costanti
●
Per nascondere le costanti è necessario usare
sistemi di obfuscation commerciali più sofisticati
oppure nasconderle “manualmente” nel codice.
●
Esempi:
– Array “sparsi” tra diverse classi e assemblati a
runtime
– Subset di costanti binarie
– “Steganografia” in risorse binarie
Mobile Security su Android
ATTACCO AI
DATI
Mobile Security su Android
Non al denaro, non all’amore… ma ai dati!
Perché preoccuparsi di decriptare comunicazioni
cifrate o comprendere codice offuscato, quando i
dati sono in chiaro e su un filesystem non protetto?
Mobile Security su Android
WhatsApp...
●
Salva i dati nello spazio di condiviso (/sdcard/...)
●
Salva le immagini in chiaro
Mobile Security su Android
Mobile Security su Android
Sviluppiamo “Sa Scafa App”
●
Apparentemente:
– Applicazione (di fantasia) dedicata al popolo giovane di
Cagliari
●
Informazioni su tutti gli eventi in città
●
Sconti presso locali convenzionati
●
Promozione di gruppi musicali
●
In realtà:
– Ad ogni utilizzo cattura le immagini WhatsApp degli
utenti e le invia ad un server remoto
– Prima o poi qualcuno condividerà qualche immagine
utile: fronte/retro carta di credito, username/password
di qualche servizio utile, foto di qualche persona da
ricattare
Mobile Security su Android
Poche righe di codice per vedere tutto
private void doScan() throws Exception {
File file = new
File(Environment.getExternalStorageDirectory(),
"WhatsApp/Media/WhatsApp Images");
if (file.isDirectory()) {
String[] files = file.list();
final ArrayAdapter<String> adapter =
new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, files);
runOnUiThread(new Runnable() {
@Override
public void run() {
mListView.setAdapter(adapter);
}
});
}
}
Mobile Security su Android
“Sa Scafa” in azione!
●
L’immagine appena ricevuta è immediatamente
accessibile all’applicazione malevola.
Mobile Security su Android
ATTACCO
ALL’UTENTE
Mobile Security su Android
Checklist
✔ Protocolli di rete sicuri
✔ Obfuscation del codice e delle costanti
✔ Cifratura di tutti i contenuti salvati in locale
✔ Utilizzo di API recentissime
 Manca qualcosa?
Mobile Security su Android
Mobile Security su Android
Cavallo di Troia per eccellenza
●
Eventuali backdoor sul sistema operativo
non sono rimosse dopo hard reset
●
Le applicazioni preinstallate sul sistema non
possono essere rimosse
●
Applicazioni malevole possono essere nascoste
dalla lista dei processi di sistema e dalle
statistiche di consumo di banda e batteria
●
Il codice di sistema può essere eseguito in
background senza le limitazioni delle app di terze
parti, soggette a sospensione e disattivazione in
base alle logiche del sistema operativo
●
Qualsiasi dato che transiti su API di sistema
può essere tracciato, salvato e inoltrato
Mobile Security su Android
Alcuni esempi
●
Tutto il traffico veicolato da InputStream e
OutputStream
●
Tutte le istanze di String
●
Tutti i dati in ingresso a funzioni di encryption
●
Tutte le bitmap decodificate
●
Tutte le immagini acquisite dalla fotocamera
●
Tutte le posizioni (GPS sempre attivo)
●
Tutto il traffico voce e SMS
Mobile Security su Android
Mobile Security su Android
Attacco Alla Rete… reloaded
URL url = new URL(Constants.URL_STRING);
HttpsURLConnection https = (HttpsURLConnection)
url.openConnection();
Log.d("GULCH", https.getClass().getName());
Mobile Security su Android
Bersaglio: HttpsURLConnection
●
Si scopre quale classe concreta estende la classe
astratta HttpsURLConnection fornita dall’API
pubblica
●
Individuata la classe concreta nel sorgente del
sistema operativo (in questo caso
com.android.okhttp.internal.huc.HttpsURLC
onnectionImpl), si risale la gerarchia delle classi
fino a trovare la prima classe che implementa il
metodo getInputStream()
●
Trovato il primo passo dove l’InputStream è
disponibile dalle librerie di più basso livello, sarà
sufficiente intercettare le chiamate read() e
salvarne il risultato prima di restituirlo ai livelli
superiori
Mobile Security su Android
HttpsURLConnection
javax.net.ssl.
HttpsURLConnection
com.android.okhttp.internal.huc.
HttpsURLConnectionImpl
com.android.okhttp.internal.huc.
DelegatingHttpsURLConnection
La classe DelegatingHttpsURLConnection finalmente
implementa il metodo getInputStream()
Mobile Security su Android
DelegatingHttpsURLConnection (1/2)
/**
* Implement an HTTPS connection by delegating to an HTTP connection for
* everything but the HTTPS-specific stuff.
*/
abstract class DelegatingHttpsURLConnection extends HttpsURLConnection {
private final HttpURLConnection delegate;
public DelegatingHttpsURLConnection(HttpURLConnection delegate) {
super(delegate.getURL());
this.delegate = delegate;
}
...
Path su AOSP:
/external/okhttp/okhttp-urlconnection/src/main/java/com/squareup/okhttp/internal/huc
Mobile Security su Android
DelegatingHttpsURLConnection (2/2)
//GERDAWASHERE
@Override public InputStream getInputStream() throws IOException
{
TrojanInputStream trojan =
new TrojanInputStream(delegate.getURL().toString(),
delegate.getInputStream());
return trojan;
//return delegate.getInputStream());
}
Mobile Security su Android
TrojanInputStream
public class TrojanInputStream extends InputStream {
private InputStream mSource;
private String mTag;
public TrojanInputStream(String tag, InputStream source) {
mSource = source;
mTag = tag;
}
@Override
public int read(byte[] b) throws IOException {
int source = mSource.read(b);
if (source != -1) {
System.out.println(mTag + " ###" + new String(b, 0, source));
}
return source;
}
Mobile Security su Android
Tutto ciò che transita è su system log
Mobile Security su Android
CONCLUSIONI
Mobile Security su Android
Conclusioni
●
Abbiamo una grande certezza: siamo in mutande!
●
Qualsiasi applicazione che tratti dati degli utenti
deve essere sicura. Non è una imposizione del
GDPR: deve essere una norma di buona
programmazione.
●
Si può offrire un alto livello di sicurezza se e solo
se tutta la catena è sicura: rete, codice, firmware.
Un solo anello debole rende debole tutta la catena
●
E’ necessario aggiornare regolarmente le app per
supportare le nuove API orientate alla sicurezza
Mobile Security su Android
Riferimenti
●
https://developer.android.com
●
https://source.android.com
●
https://www.wearesocial.com
Mobile Security su Android
Stefano “gerdavax” Sanna
●
GULCh Co-Founder
●
Manager @ OpenReply (Reply Group)
– Formerly @ beeweeb
– Formerly @ CRS4 (NDA group)
●
Technical Writer
●
Passionate retrocomputing collector
●
Links:
– @gerdavax
– http://www.gerdavax.it
– https://www.linkedin.com/in/gerdavax

More Related Content

PDF
Android Security - Key Management at GDG DevFest Rome 2013
PDF
Prevenzione degli attacchi informatici che coinvolgono dati sensibili aziendali
PDF
SMobile Network Security: quanto sono sicure le reti cellulari?
PDF
Ingegneria Sociale Seminario Sulla Tutela Dei Dati Strategici Aziendali 28112012
PDF
Mobile Network Security: Quanto sono sicure le reti cellulari? - Smau Milano ...
PDF
NetIQ Access Manager - presentazione della soluzione
PDF
Offensive security con strumenti open source
PDF
Workshop sulla Sicurezza Informatica
Android Security - Key Management at GDG DevFest Rome 2013
Prevenzione degli attacchi informatici che coinvolgono dati sensibili aziendali
SMobile Network Security: quanto sono sicure le reti cellulari?
Ingegneria Sociale Seminario Sulla Tutela Dei Dati Strategici Aziendali 28112012
Mobile Network Security: Quanto sono sicure le reti cellulari? - Smau Milano ...
NetIQ Access Manager - presentazione della soluzione
Offensive security con strumenti open source
Workshop sulla Sicurezza Informatica

Similar to Mobile Security su Android - LinuxDay 2018 (20)

PPTX
Soluzioni IoT con le tecnologie Microsoft
PPTX
Pentesting Android with BackBox 4
PPTX
Soluzioni IoT con le tecnologie Microsoft
PPS
Sophos - Sicurezza dei Dati
PDF
Easy Smart Working
PDF
Consulthink at GDG Dev Fest Rome 2013 Android Key Management
PDF
Sicurezza e resilienza di Architetture a Containers
PPTX
Forcepoint Overview
PDF
Security by design: la cyber security per un progetto innovativo
 
PDF
festival ICT 2013: Il rischio è mobile
PDF
Sophos Complete Security: arte e scienza della sicurezza
KEY
iPad per le imprese
PDF
Android (Un)Security Guidelines - VoidSec
PDF
Presentazione Suite Nethesis
PDF
Proteggi il tuo cammino verso l’industria 4.
PPSX
Firewall, Antispam e ipmonitor
PDF
Smart Badge
ODP
Intrusion Detection Systems
PDF
Smau 2017. Linee guida per la messa in sicurezza di un server web
PDF
Wiress Lan Pros And Cons.Pdf
Soluzioni IoT con le tecnologie Microsoft
Pentesting Android with BackBox 4
Soluzioni IoT con le tecnologie Microsoft
Sophos - Sicurezza dei Dati
Easy Smart Working
Consulthink at GDG Dev Fest Rome 2013 Android Key Management
Sicurezza e resilienza di Architetture a Containers
Forcepoint Overview
Security by design: la cyber security per un progetto innovativo
 
festival ICT 2013: Il rischio è mobile
Sophos Complete Security: arte e scienza della sicurezza
iPad per le imprese
Android (Un)Security Guidelines - VoidSec
Presentazione Suite Nethesis
Proteggi il tuo cammino verso l’industria 4.
Firewall, Antispam e ipmonitor
Smart Badge
Intrusion Detection Systems
Smau 2017. Linee guida per la messa in sicurezza di un server web
Wiress Lan Pros And Cons.Pdf
Ad

More from Stefano Sanna (20)

PDF
Android Things, from mobile apps to physical world
PDF
Android Things Linux Day 2017
PDF
Android Things in action
PDF
Introduzione alla tecnologia iBeacon
PDF
Augmented Smartphone
PDF
Bluetooth Low Energy
PDF
Google TV: la nuova frontiera Android
PDF
Enlarge your screen: introducing the Google TV
PDF
Introduzione ad NFC
PDF
NFC: tecnologia e applicazioni
PDF
Android - Programmazione Avanzata
PDF
HCIM08 - Mobile Applications
PDF
Android & Bluetooth: hacking e applicazioni
PDF
Application Store: opportunita' e trappole
PDF
Android Bluetooth Hacking
PDF
Android
PDF
Free Software e Open Hardware
PDF
Playing with Mobile 2.0
PDF
Sun SPOT
PDF
Comunicazione Pervasiva
Android Things, from mobile apps to physical world
Android Things Linux Day 2017
Android Things in action
Introduzione alla tecnologia iBeacon
Augmented Smartphone
Bluetooth Low Energy
Google TV: la nuova frontiera Android
Enlarge your screen: introducing the Google TV
Introduzione ad NFC
NFC: tecnologia e applicazioni
Android - Programmazione Avanzata
HCIM08 - Mobile Applications
Android & Bluetooth: hacking e applicazioni
Application Store: opportunita' e trappole
Android Bluetooth Hacking
Android
Free Software e Open Hardware
Playing with Mobile 2.0
Sun SPOT
Comunicazione Pervasiva
Ad

Mobile Security su Android - LinuxDay 2018

  • 1. Mobile Security su Android Stefano Sanna
  • 2. Mobile Security su Android Agenda ● Prigioneri! ● Attacchi alla rete ● Attacchi al codice ● Attacchi ai dati (Sa Scafa) ● Attacchi agli utenti (The Matrix) ● Conclusioni ● Riferimenti e contatti
  • 3. Mobile Security su Android “We are all just prisoner here of our own device” Eagles, “Hotel California”, 1978
  • 4. Mobile Security su Android OLTRE-CENTO-MILIONI-AL-MESE
  • 5. Mobile Security su Android Mercato smartphone usati
  • 6. Mobile Security su Android Always on...
  • 7. Mobile Security su Android SECURITY SU ANDROID
  • 8. Mobile Security su Android Security enhancements on Android ● ADB Authentication (4.3) ● AndroidKeyStore Provider (4.3) ● Certificate pinning (4.4) ● Updated to WebView without OTA (5.0) ● Runtime Permissions (6.0) ● Trusted CA Store (7.0) ● Network Security Config (7.0) ● Privacy, Keystore, Unknown apps En. (8.0) ● KeyStore StrongBox (9.0) ● Android Protected Confirmation (9.0)
  • 9. Mobile Security su Android Market share delle versioni
  • 10. Mobile Security su Android Market share delle versioni
  • 11. Mobile Security su Android ATTACCO (D)ALLA RETE
  • 12. Mobile Security su Android Always on... Loghi trovati sul web usando come chiave “free wifi” e “wifi gratis”. Questa slide non attribuisce carattere malevolo a questi loghi ma vuole solo attirare l’attenzione del lettore sulla molteplicità di occasioni in cui si può incorrere in una rete wireless non sicura,
  • 13. Mobile Security su Android … e terzo incomodo! ● Il modo più facile ed economico per attaccare un terminale mobile è intercettare le comunicazioni attraverso la rete Wi-Fi. ● Accedendo ad una rete wireless sconosciuta, è complesso capire se a valle dell’Access Point sia presente una macchina che traccia tutto il traffico, agendo da proxy più o meno manifesto.
  • 14. Mobile Security su Android Banale ma fatale ● Un attacco MITM (Man-In-The-Middle) si realizza con un soggetto frapposto tra sorgente e destinazione in grado di: – Nascondere la propria presenza ad entrambi – Tracciare richieste e risposte tra client e server – Alterare le richieste e/o le risposte in caso di necessità Device Man-In-The-Middle Access Point Web Service
  • 15. Mobile Security su Android No hacking: MITM a’ la carte ● Se non si adotta HTTPS, non è richiesta alcuna competenza particolare per sniffare il traffico in chiaro che transita attraverso la connessione l’hotspot condiviso. ● E’ obbligatorio implementare tutte le comunicazioni in HTTPS, anche quando si accede a dati pubblici e senza autenticazione – l’attaccante potrebbe comunque alterare il risultato
  • 16. Mobile Security su Android Semplice MITM con macOS Si attiva un hotspot Wi-Fi che condivide la connessione ad Internet fornita via Ethernet
  • 17. Mobile Security su Android Proxy o VPN ● Una (valida!?!) alternativa è ingannare l’utente facendogli installare un client VPN o passare attraverso un proxy HTTP/HTTPS ● Può essere utile installare una utility di packet capture (ad esempio SSL Capture) per verificare il comportamento dell’app in presenza di (potenziali) attacchi MITM. Senza opportune contromisure, una applicazione malevola può intercettare tutto il traffico di rete
  • 18. Mobile Security su Android SSL Capture ● Chiede l’installazione di un certificato self-signed per l’attivazione di una VPN.
  • 19. Mobile Security su Android SSL Capture attivo su Android 6 ● Apertura homepage https://www.fsf.org: tutto il traffico è intercettato e decodificato!
  • 20. Mobile Security su Android Certificate Pinning ● Per verificare l’autenticità del servizio, l’applicazione possiede una copia del fingerprint del certificato atteso: alla connessione può confrontare l’impronta con quello ottenuto dal server remoto ● E’ possibile confrontare uno specifico certificato oppure uno degli elementi della catena (ad esempio, l’emittente) ● Android 7 supporta il Certificate Pinning nativamente con la Network Security Configuration
  • 22. Mobile Security su Android Certificate Pinning con OkHttp CertificatePinner certPinner = new CertificatePinner.Builder() .add("https://www.fsf.org", "sha256/H+5xdXgfQgGqgHqLlU48gpjtAdmjiinuP1KcgW2XVPk=") .build(); OkHttpClient client = new OkHttpClient.Builder() .certificatePinner(certPinner) .build(); Request request = new Request.Builder().url(URL_STRING).build(); Response response = client.newCall(request).execute(); final String body = response.body().string();
  • 23. Mobile Security su Android Certificate Pinning su Android >= 7 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="it.gerdavax.gulch.linuday2018.ld2018http"> <uses-permission android:name="android.permission.INTERNET" /> <application android:networkSecurityConfig="@xml/network_security_config" ... ● Si specifica sul Manifest la presenza di un file di policy di sicurezza per la libreria di networking
  • 24. Mobile Security su Android Certificate Pinning su Android >= 7 <?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <domain includeSubdomains="true">fsf.org</domain> <pin-set expiration="2019-01-01"> <pin digest="SHA-256">H+5xdXgfQgGqgHqLlU48gpjtAdmjiinuP1KcgW2XVPk=</pin> </pin-set> </domain-config> </network-security-config> ● Il file network_security_config contiene le informazioni di pinning
  • 25. Mobile Security su Android Ricavare SHA-256 Digest in Base64 gerdavax:~$ openssl s_client -connect www.fsf.org:443 < /dev/null 2 > /dev/null | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -binary | openssl enc -base64 H+5xdXgfQgGqgHqLlU48gpjtAdmjiinuP1KcgW2XVPk=
  • 26. Mobile Security su Android Certificate Pinning su Android 6 ● Apertura homepage https://www.fsf.org: la connessione è interrotta per errore sul certificato!
  • 27. Mobile Security su Android Bypass su Android 7+ ● ll sistema bypassa automaticamente connessioni con certificato self-signed (anche senza pinning)
  • 28. Mobile Security su Android ATTACCO AL CODICE
  • 29. Mobile Security su Android Cambio di bersaglio ● Se l’obiettivo non è accedere ai dati dell’utente (credenziali, informative…) ma attaccare un servizio, allora potrebbe essere superfluo intercettare il traffico di rete ● Più efficace analizzare il codice binario dell’applicazione per studiare l’interfaccia di comunicazione del servizio di interesse
  • 30. Mobile Security su Android Un semplice client HTTP (1/3) Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Thread t = new Thread() { @Override public void run() { ConnectionManager.doConnection(); } }; t.start(); } });
  • 31. Mobile Security su Android Un semplice client HTTP (2/3) public static void doConnection() { try { URL url = new URL(Constants.URL_STRING); HttpsURLConnection https = (HttpsURLConnection) url.openConnection(); String credentials = Constants.USERNAME_STRING + ":" + Constants.PASSWORD_STRING; https.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(credentials.getBytes("UTF-8"), Base64.DEFAULT)); InputStream input = https.getInputStream(); } catch (Throwable t) { } }
  • 32. Mobile Security su Android Un semplice client HTTP (3/3) final class Constants { static final String URL_STRING = "https://www.fsf.org"; static final String USERNAME_STRING = "MyUsername"; static final String PASSWORD_STRING = "MySuperPassword"; }
  • 33. Mobile Security su Android Reverse engineering made simple Estrarre APK dal device Decomprimere APK Convertire file DEX in JAR Decompilare file JAR adb pull PATH_TO_APK unzip FILENAME.apk dex2jar classes.dex
  • 34. Mobile Security su Android Reverse engineering made simple
  • 35. Mobile Security su Android Reverse engineering made simple
  • 36. Mobile Security su Android Code Obfuscation ● Se l’API del servizio non è pubblica, può essere opportuno offuscare il codice affinché sia difficile ricostruire la logica applicativa con cui si elaborano request e response del servizio ● E’ sufficiente impostare l’attributo “minifyEnabled” nel file gradle del modulo dell’app per attivare la Code Obfuscation attraverso Proguard ● Un insieme di regole consente di specificare quali classi/campi/metodi devono essere offuscati e quali devono essere lasciati inalterati
  • 37. Mobile Security su Android Codice troppo semplice!!!
  • 38. Mobile Security su Android Just an illusion... ● Il processo di obfuscation non può “nascondere” le chiamate alle librerie di sistema (ART non riuscirebbe a risolverne i riferimenti) ● E’ necessario creare livelli di indirezione, in cui i dati per le librerie di sistema (URL, parametri, credenziali) sono elaborati per via algoritmica custom prima di essere passati come argomenti ai metodi
  • 39. Mobile Security su Android Costanti? Ancora più semplice!
  • 40. Mobile Security su Android Gestione delle costanti ● Per nascondere le costanti è necessario usare sistemi di obfuscation commerciali più sofisticati oppure nasconderle “manualmente” nel codice. ● Esempi: – Array “sparsi” tra diverse classi e assemblati a runtime – Subset di costanti binarie – “Steganografia” in risorse binarie
  • 41. Mobile Security su Android ATTACCO AI DATI
  • 42. Mobile Security su Android Non al denaro, non all’amore… ma ai dati! Perché preoccuparsi di decriptare comunicazioni cifrate o comprendere codice offuscato, quando i dati sono in chiaro e su un filesystem non protetto?
  • 43. Mobile Security su Android WhatsApp... ● Salva i dati nello spazio di condiviso (/sdcard/...) ● Salva le immagini in chiaro
  • 45. Mobile Security su Android Sviluppiamo “Sa Scafa App” ● Apparentemente: – Applicazione (di fantasia) dedicata al popolo giovane di Cagliari ● Informazioni su tutti gli eventi in città ● Sconti presso locali convenzionati ● Promozione di gruppi musicali ● In realtà: – Ad ogni utilizzo cattura le immagini WhatsApp degli utenti e le invia ad un server remoto – Prima o poi qualcuno condividerà qualche immagine utile: fronte/retro carta di credito, username/password di qualche servizio utile, foto di qualche persona da ricattare
  • 46. Mobile Security su Android Poche righe di codice per vedere tutto private void doScan() throws Exception { File file = new File(Environment.getExternalStorageDirectory(), "WhatsApp/Media/WhatsApp Images"); if (file.isDirectory()) { String[] files = file.list(); final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, files); runOnUiThread(new Runnable() { @Override public void run() { mListView.setAdapter(adapter); } }); } }
  • 47. Mobile Security su Android “Sa Scafa” in azione! ● L’immagine appena ricevuta è immediatamente accessibile all’applicazione malevola.
  • 48. Mobile Security su Android ATTACCO ALL’UTENTE
  • 49. Mobile Security su Android Checklist ✔ Protocolli di rete sicuri ✔ Obfuscation del codice e delle costanti ✔ Cifratura di tutti i contenuti salvati in locale ✔ Utilizzo di API recentissime  Manca qualcosa?
  • 51. Mobile Security su Android Cavallo di Troia per eccellenza ● Eventuali backdoor sul sistema operativo non sono rimosse dopo hard reset ● Le applicazioni preinstallate sul sistema non possono essere rimosse ● Applicazioni malevole possono essere nascoste dalla lista dei processi di sistema e dalle statistiche di consumo di banda e batteria ● Il codice di sistema può essere eseguito in background senza le limitazioni delle app di terze parti, soggette a sospensione e disattivazione in base alle logiche del sistema operativo ● Qualsiasi dato che transiti su API di sistema può essere tracciato, salvato e inoltrato
  • 52. Mobile Security su Android Alcuni esempi ● Tutto il traffico veicolato da InputStream e OutputStream ● Tutte le istanze di String ● Tutti i dati in ingresso a funzioni di encryption ● Tutte le bitmap decodificate ● Tutte le immagini acquisite dalla fotocamera ● Tutte le posizioni (GPS sempre attivo) ● Tutto il traffico voce e SMS
  • 54. Mobile Security su Android Attacco Alla Rete… reloaded URL url = new URL(Constants.URL_STRING); HttpsURLConnection https = (HttpsURLConnection) url.openConnection(); Log.d("GULCH", https.getClass().getName());
  • 55. Mobile Security su Android Bersaglio: HttpsURLConnection ● Si scopre quale classe concreta estende la classe astratta HttpsURLConnection fornita dall’API pubblica ● Individuata la classe concreta nel sorgente del sistema operativo (in questo caso com.android.okhttp.internal.huc.HttpsURLC onnectionImpl), si risale la gerarchia delle classi fino a trovare la prima classe che implementa il metodo getInputStream() ● Trovato il primo passo dove l’InputStream è disponibile dalle librerie di più basso livello, sarà sufficiente intercettare le chiamate read() e salvarne il risultato prima di restituirlo ai livelli superiori
  • 56. Mobile Security su Android HttpsURLConnection javax.net.ssl. HttpsURLConnection com.android.okhttp.internal.huc. HttpsURLConnectionImpl com.android.okhttp.internal.huc. DelegatingHttpsURLConnection La classe DelegatingHttpsURLConnection finalmente implementa il metodo getInputStream()
  • 57. Mobile Security su Android DelegatingHttpsURLConnection (1/2) /** * Implement an HTTPS connection by delegating to an HTTP connection for * everything but the HTTPS-specific stuff. */ abstract class DelegatingHttpsURLConnection extends HttpsURLConnection { private final HttpURLConnection delegate; public DelegatingHttpsURLConnection(HttpURLConnection delegate) { super(delegate.getURL()); this.delegate = delegate; } ... Path su AOSP: /external/okhttp/okhttp-urlconnection/src/main/java/com/squareup/okhttp/internal/huc
  • 58. Mobile Security su Android DelegatingHttpsURLConnection (2/2) //GERDAWASHERE @Override public InputStream getInputStream() throws IOException { TrojanInputStream trojan = new TrojanInputStream(delegate.getURL().toString(), delegate.getInputStream()); return trojan; //return delegate.getInputStream()); }
  • 59. Mobile Security su Android TrojanInputStream public class TrojanInputStream extends InputStream { private InputStream mSource; private String mTag; public TrojanInputStream(String tag, InputStream source) { mSource = source; mTag = tag; } @Override public int read(byte[] b) throws IOException { int source = mSource.read(b); if (source != -1) { System.out.println(mTag + " ###" + new String(b, 0, source)); } return source; }
  • 60. Mobile Security su Android Tutto ciò che transita è su system log
  • 61. Mobile Security su Android CONCLUSIONI
  • 62. Mobile Security su Android Conclusioni ● Abbiamo una grande certezza: siamo in mutande! ● Qualsiasi applicazione che tratti dati degli utenti deve essere sicura. Non è una imposizione del GDPR: deve essere una norma di buona programmazione. ● Si può offrire un alto livello di sicurezza se e solo se tutta la catena è sicura: rete, codice, firmware. Un solo anello debole rende debole tutta la catena ● E’ necessario aggiornare regolarmente le app per supportare le nuove API orientate alla sicurezza
  • 63. Mobile Security su Android Riferimenti ● https://developer.android.com ● https://source.android.com ● https://www.wearesocial.com
  • 64. Mobile Security su Android Stefano “gerdavax” Sanna ● GULCh Co-Founder ● Manager @ OpenReply (Reply Group) – Formerly @ beeweeb – Formerly @ CRS4 (NDA group) ● Technical Writer ● Passionate retrocomputing collector ● Links: – @gerdavax – http://www.gerdavax.it – https://www.linkedin.com/in/gerdavax