Tecniche e strumenti di penetration testing per Android Mobile apps

Pagina creata da Leonardo Marchetti
 
CONTINUA A LEGGERE
Tecniche e strumenti di penetration testing per Android Mobile apps
Scuola Politecnica e delle Scienze di Base
Corso di Laurea Triennale in Ingegneria Informatica

Tesi di Laurea Triennale in Ingegneria del Software

Tecniche e strumenti di penetration testing
per Android Mobile apps

Anno Accademico 2018/2019

candidato
Carmine Cesarano
matr. N46002883
Tecniche e strumenti di penetration testing per Android Mobile apps
Obiettivo e struttura della tesi

L’obiettivo del lavoro di tesi è quello di analizzare una particolare metodologia
utilizzata nell’ambito del testing di sicurezza di un’applicazione per dispositivi
mobili, nota come Penetration Testing. Il primo capitolo introduce il lettore alla
sicurezza informatica. Dopo aver dato una panoramica generale sul testing e
aver posto l’attenzione su una particolare tipologia di testing, quello di sicurezza,
saranno esposti nel secondo capitolo la metodologia di penetration testing, una sua
classificazione e le diverse fasi di cui esso si compone. Nel terzo capitolo di questo
elaborato, dopo aver descritto brevemente l’architettura Android, la struttura di
un’applicazione e il Security Model implementato dal sistema operativo, saranno
analizzati e comparati alcuni degli strumenti che vengono attualmente utilizzati
per il penetration testing su Android. Nell’ultimo capitolo, utilizzando ’Appie’,
uno dei framework analizzati, verrà replicato uno scenario di penetration testing su
un dispositivo Android virtualizzato. Lo scopo dell’esempio è duplice: mettere in
pratica la metodologia descritta per comprendere meglio il flusso delle operazioni
da effettuare e, allo stesso tempo, mettere in evidenza le vulnerabilità più diffuse
e più pericolose di cui può soffrire un’applicazione Android.

                                          i
Tecniche e strumenti di penetration testing per Android Mobile apps
Indice

Obiettivo e struttura della tesi                                                      i

1 Introduzione                                                                        1
   1.1   Introduzione alla Sicurezza Informatica . . . . . . . . . . . . . . . .      2
   1.2   Software Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . .     3
   1.3   Testing di Sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . .   4

2 Penetration Testing                                                                 7
   2.1   Penetration Testing . . . . . . . . . . . . . . . . . . . . . . . . . . .    7
   2.2   Tipi di Penetration Testing . . . . . . . . . . . . . . . . . . . . . . .    8
         2.2.1   External Testing . . . . . . . . . . . . . . . . . . . . . . . .     8
         2.2.2   Internal Testing . . . . . . . . . . . . . . . . . . . . . . . . .   8
         2.2.3   Gray Box Testing . . . . . . . . . . . . . . . . . . . . . . . .     9
         2.2.4   Red Team e Blue Team . . . . . . . . . . . . . . . . . . . . .       9
   2.3   Fasi di un Penetration Testing . . . . . . . . . . . . . . . . . . . . .     9
         2.3.1   Pre-Engagement Interaction . . . . . . . . . . . . . . . . . . 10
         2.3.2   Open Source Intellingence (OSINT) Gathering . . . . . . . . 11
         2.3.3   Threat Modeling . . . . . . . . . . . . . . . . . . . . . . . . 13
         2.3.4   Vulnerability Assessment . . . . . . . . . . . . . . . . . . . . 13
         2.3.5   Exploitation . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
         2.3.6   Post-Exploitation . . . . . . . . . . . . . . . . . . . . . . . . 14
         2.3.7   Reporting . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
   2.4   Limiti del Penetration Testing . . . . . . . . . . . . . . . . . . . . . 15

                                          ii
Tecniche e strumenti di penetration testing per Android Mobile apps
Tecniche e strumenti di penetration
                                                       testing per Android Mobile apps

3 Penetration Testing in Android                                                   17
  3.1   Architettura del sistema operativo Android . . . . . . . . . . . . . . 18
  3.2   Struttura di un applicazione . . . . . . . . . . . . . . . . . . . . . . 19
  3.3   Android Security Model . . . . . . . . . . . . . . . . . . . . . . . . 21
  3.4   Fasi di un pentesting in Android . . . . . . . . . . . . . . . . . . . . 23
  3.5   Strumenti per il pentesting in Android . . . . . . . . . . . . . . . . 25

4 Esempio di Pentesting: Appie                                                     27
  4.1   Configurazione dell’ambiente . . . . . . . . . . . . . . . . . . . . . . 27
  4.2   Installazione delle app vulnerabili . . . . . . . . . . . . . . . . . . . 29
  4.3   Treath Modeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
        4.3.1   Superficie di attacco . . . . . . . . . . . . . . . . . . . . . . 29
        4.3.2   Reverse Engineering . . . . . . . . . . . . . . . . . . . . . . 31
  4.4   Vulnerability Analysis . . . . . . . . . . . . . . . . . . . . . . . . . 32
  4.5   Exploitation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
        4.5.1   Improper export of component . . . . . . . . . . . . . . . . . 33
        4.5.2   Insecure data storage . . . . . . . . . . . . . . . . . . . . . . 35
        4.5.3   Insufficient transport layer protection . . . . . . . . . . . . . 35
        4.5.4   Unintended Data Leakage . . . . . . . . . . . . . . . . . . . 37
        4.5.5   Poor Authentication and Authorization . . . . . . . . . . . . 38
        4.5.6   Broken Cryptography . . . . . . . . . . . . . . . . . . . . . . 39
        4.5.7   Extraneous Functionality . . . . . . . . . . . . . . . . . . . . 39

5 Conclusioni                                                                      42

                                        iii
Tecniche e strumenti di penetration testing per Android Mobile apps
Capitolo 1

Introduzione

Negli anni lo smartphone è diventato uno strumento indispensabile per la comu-
nicazione e la gestione dei dati personali. Qualsiasi operazione che riguardi ad
esempio: pagamenti, transazioni, identificazione digitale o storage di dati sensibili
può essere effettuata con facilità tramite uno smartphone. Negli ultimi dieci anni
sono due i competitor che si contendono il mercato in questione: Google e Apple,
con i rispettivi sistemi operativi per dispositivi mobili, Android e iOS. Tradizional-
mente il primo si contraddistingue per fatto di essere un progetto completamente
Open Source; è infatti distribuito sotto i termini della licenza libera Apache 2.0.
La caratteristica dell’open source permette allo sviluppatore di consultare libe-
ramente il codice sorgente ed effettuare un’analisi più avanzata del sistema alla
ricerca di bug, vulnerabilità e falle di sicurezza. Questa caratteristica, accom-
pagnata da un’estensione massiccia del bacino d’utenza del sistema operativo in
questione (nel primo trimestre del 2019, circa l’80% degli smartphone ha Android
come sistema operativo[1]), giustifica sicuramente l’interesse per lo sviluppo di
malware per dispositivi Android. Un malware è un applicazione malevola atta a
sottrarre le informazioni personali della vittima o a controllare il suo dispositivo.
A marzo del 2018 si contano circa 26 milioni di detection di malware sui dispositivi
Android[2].

                                          1
Tecniche e strumenti di penetration testing per Android Mobile apps
Tecniche e strumenti di penetration
                                                          testing per Android Mobile apps

   A causa di questi numeri allarmanti si è reso necessario, fin da subito, iniziare a
discutere di sicurezza informatica, implementare meccanismi di analisi finalizzata
alla detection, ma ancor prima di definire metodologie di testing di sicurezza, per
cercare di prevenire a priori gli attacchi.

1.1      Introduzione alla Sicurezza Informatica

Con il termine ‘sicurezza informatica’ si intende quel processo di prevenzione e
individuazione dell’uso non autorizzato di un sistema informatico. Tali attività
indesiderate possono essere eseguite da soggetti che hanno un qualche interesse
nei confronti dei dati contenuti in un sistema o che vogliono in qualche modo
danneggiare il sistema stesso. È necessario chiarire che la sicurezza informatica
non deve essere intesa come una proprietà che può o non può essere raggiunta. È
più concreto invece identificare, per un sistema informatico, un livello di sicurezza e
quindi stabilire quale livello il sistema debba raggiungere. Per un sistema software
è essenziale che la sicurezza, oltre ad essere verificata a posteriori, quando il sistema
è in esercizio, sia garantita preventivamente già durante il ciclo di sviluppo, quindi
operando la fase di testing.

                                           2
Tecniche e strumenti di penetration testing per Android Mobile apps
Tecniche e strumenti di penetration
                                                           testing per Android Mobile apps

1.2      Software Testing

In modo del tutto analogo alla maggior parte dei processi fisici, un componente
software riceve un insieme di dati in ingresso per elaborarli e produce un insieme
di dati di uscita. Qualsiasi attività finalizzata alla valutazione delle caratteristiche
di un programma o di un sistema e alla verifica che i componenti degli stessi
diano i risultati previsti rientra nella definizione di software testing. Una prima
caratterizzazione del processo di testing può essere fatta ponendo l’attenzione sui
due principali obiettivi da raggiungere a valle di questo processo:

   • Dimostrare allo sviluppatore e al suo cliente che il software rispetta i requisiti
      stabiliti;

   • Rilevare situazioni in cui il comportamento del software non è corretto o è
      indesiderabile.

   Il primo obiettivo porta al testing di convalida, in cui è previsto che il sistema
esegua correttamente un determinato set di casi di test che riflettono l’utilizzo
effettivo del sistema. Il secondo obiettivo porta al testing dei difetti, in cui i casi di
test sono progettati con l’obiettivo specifico di portare alla luce i malfunzionamenti
del software. È anche vero che non vi è un confine definito tra queste due tipologie
di testing. Durante i test di validazione è possibile trovare difetti del sistema;
durante i test dei difetti potrebbero emergere requisiti non soddisfatti dal sistema.
È importante tenere presente che il testing non può dimostrare che il software
è privo di difetti o che si comporterà come specificato in ogni circostanza. È
sempre possibile che in un test alcune casistiche siano state trascurate in quanto
le combinazioni possibili dei valori di input validi sono enormi e non possono
essere riprodotte in un tempo ragionevole. Tuttavia, un buon testing può rendere
la probabilità di malfunzionamenti abbastanza bassa da essere accettabile.

   “Testing can only show the presence of errors, not their absence”, Dijkstra

                                            3
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

   Un’altra suddivisione può essere fatta sulla base della granularità:

   • Test di Modulo: ha lo scopo di verificare correttezza e completezza nell’im-
      plementazione di ogni componente minimo dotato di funzionalità autono-
      me, facendo emergere tempestivamente eventuali difetti, in modo che essi
      possano essere corretti facilmente prima dell’integrazione. È realizzato me-
      diante un approccio white-box testing e si articola tipicamente in test case
      idealmente indipendentementi tra di loro.

   • Test di integrazione: viene eseguito quando due o più unità già testate ven-
      gono aggregate in una struttura più grande per determinare se rispettano il
      comportamento atteso quando si trovano ad operare insieme come un unico
      componente.

   • Test di sistema: le singole caratteristiche testate dei vari moduli possono
      essere diverse e numerose e, anche se queste sono corrette, il sistema ottenuto
      integrandole potrebbe non esserlo. Pertanto, effettuare dei test sull’intero
      sistema è significativo. L’approccio utilizzato è per lo più di tipo black box,
      quindi orientato ai test funzionali, in quanto si deve utilizzare il software in
      modo più vicino possibile alle condizioni di normale operatività.

1.3     Testing di Sicurezza

Il testing di sicurezza è una particolare tipologia di testing del software mirata
a controllare la riservatezza di servizi e informazioni e la capacità di resistere a
tentativi di violazione (accidentali o intenzionali). Questa fase del testing è orien-
tata ad ottenere, per l’applicazione che si sta realizzando, caratteristiche come:
autenticità, controllo degli accessi, segretezza dei dati, integrità dei dati e non
ripudiabilità. Il testing di sicurezza può risultare molto impegnativo, complicato
e costoso per applicazioni che richiedono un elevato grado di sicurezza. Il testing

                                          4
Tecniche e strumenti di penetration
                                                          testing per Android Mobile apps

dei meccanismi di sicurezza viene sempre affiancato dalle analisi di rischio, che
possono aiutare ad analizzare e valutare l’impatto e gli eventuali danni di una
potenziale vulnerabilità. Mentre le analisi di rischio vengono affrontate con un ap-
proccio White Box testing, sfruttando una profonda conoscenza dell’architettura
interna del software, il testing dei meccanismi di sicurezza invece, viene solita-
mente effettuato con test funzionali di tipo Black Box. In questa fase del testing,
la analisi e la valutazione delle potenziali vulnerabilità del sistema possono essere
condotte in molti modi tra cui:

      • Riesame dei requisiti funzionali e delle specifiche tecniche del sistema infor-
        matico basandosi sulla documentazione disponibile;

      • Riesame del codice sorgente dell’applicazione (code review);

      • Verifica statica della qualità e della sicurezza del codice (SAST o Static
        application security testing);

      • Verifica dinamica della qualità e della sicurezza del codice (DAST o Dinamic
        application security testing);

      • Scansione automatica del software con strumenti di vulnerability scanning;

      • Prove di attacco (o penetration testing) da parte di personale autorizzato.

      Chiunque si occupa di sicurezza conosce il principio del security-by-design:
la sicurezza deve essere considerata e progettata fin dalle prime fasi di analisi e
sviluppo del sistema informatico. Solo progettando in questo modo è possibile
creare un sistema realmente sicuro. Grazie all’introduzione del GDPR 1 [3] questo
approccio sta diventando fortunatamente sempre più noto. Purtroppo, però non
tutti i progetti esistenti sono stati sviluppati in questo modo e spesso la sicurezza
viene trattata come un ottimizzazione da apportare in seguito. Dunque, risulta
  1
      General Data Protection Regulation

                                            5
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

necessario predisporre di alcune tecniche e strumenti atti a valutare a posteriori il
grado di sicurezza del sistema ed identificare le sue vulnerabilità.

                                         6
Capitolo 2

Penetration Testing

2.1        Penetration Testing

Per costruire un sistema sicuro è indispensabile delineare un profilo del potenziale
attaccante, capire come potrebbe agire e provare a scoprire tutte le vulnerabilità
del sistema tramite un vulnerability assessment. Dopo aver fatto ciò è necessario
eseguire dei penetration test che permettono di simulare l’attacco da parte di un
eventuale utente malevolo. In aggiunta a quello che succede con un vulnerability
assessment, dove i tester scoprono le vulnerabilità che potrebbero essere utilizzate
dagli aggressori, con un penetration testing quelle vulnerabilità rilevate vengono
sfruttate ed utilizzate per valutare cosa gli aggressori potrebbero ottenere dopo
una violazione avvenuta con successo [4]. Come definito dalla Computer Security
Division del NIST1 :
      Un penetration testing è un test di sicurezza in cui i tester tentano di eludere i
sistemi di sicurezza di un sistema. Lo scopo del penetration testing è quello di iden-
tificare i metodi di accesso al sistema sfruttando strumenti e tecniche comunemente
utilizzate dagli hacker[5].
  1
      National Institute of Standards and Technology

                                               7
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

2.2        Tipi di Penetration Testing

Esistono diversi tipi di penetration testing e normalmente la scelta dipende da ciò
che è necessario testare e se lo scopo è quello di simulare un attacco da parte di
un insider o un outsider. I due approcci più ampiamente accettati sono quello
del External Testing e quello del Internal Testing [6]. La differenza principale tra
le due metodologie è la quantità dei dettagli di implementazione forniti al tester
circa il sistema da testare.

2.2.1       External Testing

Con i pentest2 esterni, anche definiti test Black Box, i tester simulano un attacco
eseguito da un’entità che non ha precedenti conoscenze sull’infrastruttura da te-
stare. Nell’ambito di questi test i valutatori potrebbero essere a conoscenza, ad
esempio, soltanto del sito web o dell’indirizzo IP della rete. Tutte le altre infor-
mazioni necessarie devono essere raccolte implementando tecniche generalmente
utilizzate nell’ambito dell’hacking (social engineering, network scanning, motori
di ricerca, ecc.).

2.2.2       Internal Testing

Un pentest interno viene di solito effettuato da un tester interno all’organizzazione.
Permette di simulare la situazione in cui un utente malevolo riesce ad ottenere pas-
sword e altri dati di accesso di un impiegato. In pratica corrisponde ad un test di
tipo White Box, in cui l’attaccante ha una conoscenza completa dell’infrastruttura
da testare [6][7].
  2
      penetration testing

                                          8
Tecniche e strumenti di penetration
                                                       testing per Android Mobile apps

2.2.3    Gray Box Testing

La combinazione di entrambi i precendenti approcci fornisce una visione globale
della sicurezza da un punto di vista sia interno che esterno. Questa combinazione
è nota come Gray Box Testing. In questo approccio, i tester hanno o sono forniti
di una certa conoscenza e sono posti in una posizione privilegiata. E’ il metodo
preferito quando è necessario diminuire i costi per il team di testing.

2.2.4    Red Team e Blue Team

I penetration test possono essere condotti come teaming blu, cioè con la conoscenza
e il consenso del personale IT dell’organizzazione che predispone il test, o teaming
rosso, cioè solo con la conoscenza e l’autorizzazione del reparto di direzione. Il
teaming rosso è quello più costoso e complesso da gestire, ma può fornire una
migliore indicazione sulla sicurezza del sistema e permette di proteggersi anche da
eventuali attacchi interni eseguiti ad esempio da dipendenti insoddisfatti.

2.3     Fasi di un Penetration Testing

In generale, il processo di penetration testing può essere suddiviso in diversi pas-
saggi o fasi. Anche se non vi è una struttura prefissata, in quanto gli approcci

                                         9
Tecniche e strumenti di penetration
                                                         testing per Android Mobile apps

possono variare molto a seconda delle competenze del tester, dello scopo del te-
sting e del sistema sotto esame, il Penetration Testing Execution Standard
(PTES) detta alcune linee guida articolate in 7 livelli principali che aiutano a
definire le procedure da seguire durante un penetration testing.

  1. Pre-engagement Interactions

  2. OSINT Gathering

  3. Threat Modeling

  4. Vulnerability Assessment

  5. Exploitation

  6. Post Exploitation

  7. Reporting

2.3.1     Pre-Engagement Interaction

Prima di effettuare un penetration testing è opportuno definire con cura tutti i
requisiti necessari e programmare nel dettaglio tutte le operazioni che verranno
eseguite. È necessario inoltre avere autorizzazioni formali per ottenere tali requisiti
dato che il testing potrebbe causare gravi conseguenze al sistema in esame. Il
PTES considera l’ottenimento di questi requisiti come parte della fase di ‘Pre-
engagement’ [8]. I requisiti possono comprendere:

   • Lista degli indirizzi IP da testare;

   • Lista degli host da testare;

   • Una stima dei tempi di esecuzione del testing;

   • La definizione del periodo e degli orari durante il quale il testing è effettuato;

                                            10
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

   • Indirizzi IP delle macchine attraverso le quali vengono effettuate le simula-
      zioni di attacco;

   • Informazioni raccolte e risorse violate durante il test;

   • Tecniche e strumenti che è possibile utilizzare e non;

   • Azioni da intraprendere una volta che il sistema sarà violato con successo;

   • Altri requisiti possono includere aspetti legali e contrattuali che specificano
      le responsabilità individuali del tester.

2.3.2    Open Source Intellingence (OSINT) Gathering

Questa fase, detta anche di Information gathering, ha l’obiettivo di raccogliere
informazioni utili sul sistema sotto test che verranno poi utilizzate durante le
successive fasi del penetration testing. Solitamente le informazioni sono tutte
disponibili pubblicamente. Questa fase si può suddividere a sua volta in vari step:

   Reconnaissance Per portare a termine questa fase con successo devono es-
sere incluse tecniche di reconnaisance sia passive che attive. La reconnaissance
passiva si avvale di risorse informative disponibili sul web e non prevede un in-
terazione diretta con l’obiettivo; di conseguenza questo tipo di attività non può
essere mai rivelata dall’obiettivo. Possono essere utilizzate tecniche di social engi-
neering o sfruttati i motori di ricerca. La reconnaissance attiva, invece, può essere
rilevata dal target come un comportamento sospetto o malevolo. Durante questa
attività infatti, viene profilato direttamente il target mappando l’infrastruttura del
sistema tramite fingerprinting, port scanning, network mapping e web profiling.
Il vantaggio di utilizzare entrambi i metodi è quello di poter identificare informa-
zioni storiche mantenute in rete tramite la raccolta passiva, e di validare quelle

                                          11
Tecniche e strumenti di penetration
                                                          testing per Android Mobile apps

informazioni con metodi attivi. Gli strumenti e le tecniche più comuni utilizzate
in questa fase di reconnaissance sono:

      • Social Engineering: questa tecnica basa la sua natura sulla capacità del
        tester di manipolare la psicologia umana. In questo caso il tester entra di-
        rettamente nell’organizzazione che richiede il test e, con tecniche persuasive,
        cerca di estrapolare più informazioni possibili dai dipendenti.

      • Garbage Picking: il cassonetto dei rifiuti può fornire al pentester informa-
        zioni sensibili, sia a livello hardware che software. Documenti che vengono
        classificati come meno importanti, e gettati senza alcuna attenzione, potreb-
        bero fornire informazioni come nomi, indirizzi, numeri di telefono e id dei
        dipendenti.

      • Internet Footprinting: è il metodo di reconnaissance che fornisce i risultati
        più importanti. Possono essere identificate quattro tecniche:

          1. Web Presence: navigando sulle pagine web della società, il pente-
             ster può raccogliere molte informazioni, come ad esempio i dati dei
             dipendenti.

          2. DNS Reconnaissment: sfruttando i server DNS è possibile, partendo
             dai nomi di dominio della rete di destinazione, ricavare gli indirizzi IP.
             Vengono utilizzati strumenti come DNS Lookup o Nslookup

          3. Network Enumeration: è il processo che utilizza un particolare tool
             chiamato WHOIS; mediante l’interrogazione di appositi database con-
             sente di stabilire a quale provider appartiene un determinato indirizzo
             IP o uno specifico DNS3 , informazioni di contatto amministrativo e
             tecnico, con nomi, numeri di telefono e indirizzi e-mail [9];
  3
      Domain Name System

                                           12
Tecniche e strumenti di penetration
                                                           testing per Android Mobile apps

        4. Network-based Reconnaissance: è il processo di identificazione dei com-
           puter e degli altri servizi attivi su una rete di destinazione utilizzando
           strumenti come ping, traceroute e netstat.

   Port Scanning La fase di port scanning permette di identificare gli host
presenti all’interno della rete target. Per questi sistemi poi è possibile identificare le
porte aperte e quelle filtrate, i servizi che sono in esecuzione, i dettagli del sistema
operativo, i percorsi di rete, ecc. Alcuni degli strumenti più comuni utilizzati
durante questa fase sono Nmap, Netcat, Superscan.

   Enumeration Dopo aver identificato i sistemi attivi e i servizi in esecuzione,
essi dovrebbero essere classificati ed enumerati. L’enumerazione di fatto consiste
nel selezionare tra tutti quelli identificati un sottoinsieme dei punti di accesso più
vulnerabili e nell’eliminazione di eventuali falsi positivi.

2.3.3     Threat Modeling

Per portare a termine un penetration testing con successo, il tester oltre ad avere
più informazioni possibili sul target, deve avere una panoramica anche dei po-
tenziali attaccanti e del tipo di minacce che potrebbero derivare da un eventuale
attacco. Questo fornisce chiarezza per quanto riguarda la propensione al rischio
e permette la definizione di alcune priorità: quali minacce sono più importanti,
quali risorse è più importante proteggere, ecc.

2.3.4     Vulnerability Assessment

L’obiettivo di questo step è quello di identificare e analizzare le vulnerabilità del
sistema in esame e quindi assegnare un grado di pericolosità alle eventuali minac-
ce che ne possono derivare, monitorando gli eventuali danni provocati al sistema.
Esistono dei database che elencano e classificano le vulnerabilità note, come ad

                                           13
Tecniche e strumenti di penetration
                                                         testing per Android Mobile apps

esempio SecurityFocus [10], Exploit-DB [11] e PacketStorm [12]. Per questa at-
tività vengono abitualmente sfruttati alcuni tools che, grazie alla loro velocità di
scansione, permettono di analizzare automaticamente ed in breve tempo un ampio
numero di servizi.

2.3.5     Exploitation

Durante un penetration testing, la vera e propria violazione del sistema costituisce
una delle fasi più critiche. In questo step vengono sfruttate le vulnerabilità che sono
state identificate per violare le misure di sicurezza del sistema. Come descritto
in [13], un exploit è il mezzo attraverso il quale il penetration tester può ottenere
l’accesso ad una determinata risorsa. Poiché è probabile che gli exploit causino
danni temporanei o permanenti al sistema sotto test, è responsabilità del tester
determinare se è accettabile o meno usare un certo exploit. In alcuni casi si
rende necessario provare l’exploit prima in un ambiente controllato e simulato[14].
Mantenere una buona comunicazione con il cliente, di solito, supporta il tester in
queste decisioni.

2.3.6     Post-Exploitation

Una volta che il sistema è stato violato è necessario effettuare una serie di opera-
zioni che ricadono in una fase detta di post exploitation.

   Privilege Escalation La posizione raggiunta con la fase di exploitation vie-
ne sfruttata per tentare di ottenere dei permessi più privilegiati. Questo viene
fatto per acquisire il controllo di risorse che normalmente sono precluse al gruppo
di utenti che è stato violato e magari per estendere il proprio controllo anche ad
altri sistemi della rete. Solitamente l’obiettivo viene prefissato è quello di ottenere
i privilegi di root del sistema.

                                          14
Tecniche e strumenti di penetration
                                                         testing per Android Mobile apps

   Maintaining Access Nella fase di post exploitation inoltre vengono imple-
mentate tecniche per garantire un accesso facilitato al sistema, da utilizzare in un
momento futuro, come ad esempio il reindirizzamento di una porta o l’installazione
di una backdoor.

   Cleaning-up Un’altra attività essenziale da eseguire nella fase di post ex-
ploitation è il ripristino dello stato iniziale del sistema che è stato esaminato. Ven-
gono quindi rimossi eventuali rootkit installati o programmi backdoor configurati,
ripristinate le configurazioni di dispositivi e dell’infrastruttura di rete, effettua-
ta la pulizia delle voci di registro aggiunte durante l’exploit e rimosse infine le
condivisioni e le connessioni stabilite durante l’attacco.

2.3.7     Reporting

È necessario ricordare che l’obiettivo principale di un penetration testing non è
solo compromettere il sistema o la rete, ma anche informare e portare consapevo-
lezza alle parti interessate, in particolare all’amministratore del sistema, su quali
vulnerabilità esistono. Il report deve essere un documento molto dettagliato che,
oltre ad esibire informazioni sulle vulnerabilità riscontrate, fornisce una valutazio-
ne dei possibili rischi che possono comportare, con il relativo grado di pericolosità.
Vengono inoltre aggiunti dei suggerimenti ritenuti opportuni per l’eliminazione
delle vulnerabilità riscontrate.

2.4     Limiti del Penetration Testing

I penetration testing sono strumenti utili che possono avere un enorme valore per
rafforzare la sicurezza di un qualsiasi dispositivo o sistema, tuttavia hanno dei
limiti. Prima di tutto, un penetration testing potrebbe non identificare tutte le
vulnerabilità a causa di limitazioni sul tempo o sui costi che è possibile investi-

                                          15
Tecniche e strumenti di penetration
                                                      testing per Android Mobile apps

re. Al contrario del tester, una volta che il sistema è in esercizio, un eventuale
attaccante ha tutto il tempo per ricercare difetti che non sono stati trovati nel-
la fase di testing. Oltre a questi limiti imeposti dal progetto, i risultati di un
pentration testing possono essere compromessi dall’uso di exploit noti pubblica-
mente. Normalmente i tester non scrivono exploit ad hoc, ma si basano su quelli
più ampiamente diffusi ed utilizzati. Un attaccante esperto potrebbe scrivere un
exploit personalizzato, adattandolo ad un determinato difetto e ad un determinato
ambiente di destinazione. Inoltre, è da considerare il fatto che i penetration te-
sting potrebbero essere limitati deliberatamente escludendo determinate tecniche
perché magari potrebbero provocare danni ingenti a sistema in esercizio. [15].

                                       16
Capitolo 3

Penetration Testing in Android

Il penetration testing è uno strumento essenziale per testare la sicurezza di un’ap-
plicazione mobile. Gli obiettivi del penetration testing sono identificare, correggere
e prevenire le falle e le vulnerabilità di sicurezza all’interno dell’applicazione e di
determinare il danno che potrebbero comportare se sfruttate. L’archiviazione non
sicura delle password, la divulgazione di informazioni personali, la configurazione
non adeguata dei privilegi, l’autorizzazione alla modifica di file che dovrebbero
essere invece protetti sono tutte vulnerabilità comuni trovate tra le più diffuse
applicazioni. Prima di scendere nel dettaglio e descrivere gli strumenti necessari e
le metodologie per condurre un penetration testing in Android, è necessario avere
una visione generale di quella che viene definita superficie di attacco, ossia l’insie-
me dei diversi punti di accesso che possono essere sfruttati durante un penetration
testing. Per fare ciò è indispensabile comprendere l’architettura del sistema ope-
rativo Android, quale sia la struttura di un’applicazione e come i suoi componenti
interagiscono tra di loro.

                                          17
Tecniche e strumenti di penetration
                                                          testing per Android Mobile apps

3.1     Architettura del sistema operativo Android

Android è uno stack software open source sviluppato per dispositivi mobili da
Google Inc. La sua architettura a livelli, in cui gli strati inferiori offrono servizi a
quelli superiori, permette un livello di astrazione dell’hardware via via crescente.
Il livello più basso è costituito da Kernel Linux. Oltre che esporre funzionalità
tradizionalmente offerte da Linux come l’astrazione dell’hardware del dispositivo
tramite i device driver, la gestione dei processi, la gestione della memoria, il ker-
nel viene migliorato con delle modifiche esclusive per Android. Il Binder Driver,
ad esempio, sostituisce i meccanismi IPC1 tipici di Linux ed utilizza una parte
della shared memory riservata al Kernel per permettere alle applicazioni e ai loro
thread di comunicare tra loro e scambiarsi dati. Al secondo livello dello stack si
trovano le Native Libraries, un insieme di librerie scritte in C/C++ che imple-
mentano a basso livello diverse funzionalità tra cui: grafica 2D e 3D, un DBMS2
relazionale, funzionalità a supporto delle tecnologie web, codec per acquisizione e
riproduzione audio e video, ecc. Allo stesso piano è posto il componente Android
Runtime all’interno del quale coesistono istanze multiple di una particolare VM3 ,
la Dalvik Virtual Machine, ottimizzata per sfruttare le risorse limitate dei dispi-
sitivi mobili (potenza della CPU, memoria RAM e batteria). La DVM è stata
successivamente sostituita con ART4 , molto più performante e che, al contrario
del suo predecessore, compila l’intero codice durante l’installazione dell’app e non
durante l’esecuzione della stessa. A seguire, nello stack è presente l’Application
Framework, un insieme di API Java che fornisce un set di componenti riutiliz-
zabili direttamente dalle applicazioni sviluppate in linguaggio Java. Il livello più
alto è costituito da in insieme di applicazioni di sistema che offrono funzionalità
di base come calendario, gestore email, dialer, contatti, ecc.
  1
    Inter Process Communiclation
  2
    Database management system
  3
    Virtual Machine
  4
    Android RunTime

                                          18
Tecniche e strumenti di penetration
                                                         testing per Android Mobile apps

3.2        Struttura di un applicazione

Analizzare la struttura di un applicazione ed individuare i suoi componenti princi-
pali risulta fondamentale per una corretta comprensione del modello di sicurezza
implementato in Android.

      Activity L’Activity rappresenta il componente attraverso il quale l’utente
può interagire con l’applicazione. La composizione di uno o più moduli di questo
tipo realizzano di fatto l’interfaccia grafica dell’app. Le activity di un’applicazione
sono organizzate in uno stack la cui modalità di accesso segue una politica LIFO5 .
L’Activity ha un proprio ciclo di vita cioè, durante la propria esistenza, può passare
attraverso diversi stati:

   1. ACTIVE : l’activity si trova in testa allo stack, è visibile ed è quella con cui
        l’utente sta attualmente interagendo;

   2. PAUSED: l’activity non è attiva ma è ancora parzialmente visibile, o per la
        trasparenza di quelle superiori o perché queste non occupano l’intero spazio
  5
      Last in First Out

                                          19
Tecniche e strumenti di penetration
                                                         testing per Android Mobile apps

      a disposizione. Essa non è sensibile agli eventi dell’utente ma mostra lo stato
      precedente alla sua messa in pausa;

  3. STOPPED: l’activity non è attiva, né visibile. Non è sensibile alle interazioni
      dell’utente ed è tra le prime candidate ad essere eliminata.

  4. INACTIVE : l’activity viene eliminata e non si trova più nello stack.

   Service Un Service è adatto per operazioni da svolgere in background e
che quindi non necessitano di un interazione diretta con l’utente. Componenti
di questo tipo sono preservati dal sistema, che non li elimina se non in situazioni
estreme. Essi possono offrire determinati servizi a favore di un Activity. Il modello
di interazione tra un Activity e un Service è quello Client-Server.

   Content Provider Il Content Provider è un meccanismo utilizzato per con-
dividere basi di dati di utilità generale presenti nel sistema operativo (contatti, ca-
lendario) oppure per permettere a più applicazioni di condividere le proprie strut-
ture dati. L’oggetto che permette di invocare un Content Provider è il Content
Resolver con il quale comunica secondo un paradigma Client-Server.

   Broadcast Receiver I Broadcast Receiver forniscono la possibilità all’appli-
cazione di registrarsi a particolari eventi, segnalati dal sistema o da un’applicazione
ed inviati in broadcast. L’arrivo di un SMS o l’avviso di batteria scarica possono
esserne un esempio. Come i Service, i BR non implementano un’interfaccia grafica,
ma possono eseguire un Activity in risposta a determinati eventi segnalati. Sono
sfruttati spesso da applicazioni malevole che si mettono in attesa un determinato
tipo di evento per eseguire una qualsivoglia azione.

                                          20
Tecniche e strumenti di penetration
                                                            testing per Android Mobile apps

3.3       Android Security Model

Sandboxing Il modello di sicurezza di Android sfrutta le funzionalità offerte
dal kernel Linux di isolamento delle risorse e dei processi, trattando tuttavia gli
utenti in modo differente. In un sistema Desktop, un UID6 è assegnato ad ogni
utente fisico che può accedere al sistema. Essendo Android progettato per smart-
phone, solitamente ad uso personale, UID differenti sono utilizzati per identicare
differenti applicazioni. La creazione di un’istanza separata di una VM per ogni ap-
plicazione installata sul dispositivo crea una vera e propria Sandbox, che garantirà
l’isolamento di ogni app rispetto alle altre e rispetto al sistema operativo[16].

Permessi Oltre ad utilizzare la tecnica del sandboxing, Android protegge le
applicazioni anche a livello ICC7 utilizzando il concetto di permesso. Un permesso
è una stringa che un’applicazione deve possedere per far sì che un suo componente
possa utilizzare risorse sensibili (GPS, accesso alla rete, rubrica, ecc..) oppure
comunicare con altri componenti, attraverso internet ad esempio. Un reference
monitor provvede al controllo dei tentativi di accesso ad un componente. Ciascun
accesso viene identificato da un access permission label. Se l’access permission
label del secondo componente è tra quelli contenuti nel manifest dell’applicazione
allora la comunicazione è consentita[16]. I permessi in Android vengono suddivisi
in due grosse categorie:

      • Permission NORMAL: non mettono a rischio la privacy dell’utente (acces-
        so alla rete, accesso a periferiche per la connettività, impostazione di un
        allarme, gestione della vibrazione, ecc.). Permessi di questo tipo vengono
        automaticamente concessi dal sistema all’applicazione;

      • Permission DANGEROUS : potenzialmente più lesive per la privacy (localiz-
        zazione, contatti, attività telefoniche, accesso ai file, ecc.). L’installazione di
  6
      User Id
  7
      Inter-Component Communication

                                             21
Tecniche e strumenti di penetration
                                                          testing per Android Mobile apps

        app che prevedono la concessione di tali permessi può procedere solo previa
        autorizzazione esplicita dell’utente.

AndroidManifest Il manifest, oltre che contenere informazioni sulla struttura
dell’applicazione, come la dichiarazione delle componenti da cui è costituita op-
pure gli Intents che è in grado di gestire, costituisce il file in cui risiedono tutti i
permessi che un’applicazione richiede al sistema per svolgere il proprio compito.
Affinchè possa essere garantita l’interazione con le risorse esterne ad essa, ogni ap-
plicazione dovrà dichiarare esplicitamente in maniera statica a quali risorse vorrà
avere accesso. Ogni volta che un’app tenterà di incorporare o di accedere ad una
risorsa non dichiarata nel proprio manifest verrà sollevata un’eccezione di sicurezza
che interromperà l’esecuzione del programma[16].

Signing In Android tutte le applicazioni devono essere certificate affinché pos-
sano essere installate ed eseguite sul dispositivo. La creazione di tale certificato
non richiede l’intervento di una CA8 ; esso viene auto-generato dallo sviluppatore
in fase di rilascio dell’applicazione [16]. Questo meccanismo è necessario al sistema
per:

      • Aggiornamenti: per aggiornare un’applicazione il sistema confronta la signa-
        ture dell’upgrade con quella dell’applicazione installata;

      • Modularità: Android permette alle applicazioni certificate con la stessa
        signature di essere eseguite all’interno dello stesso processo UNIX;

      • Condivisione dati tramite permessi: applicazioni diverse, ma con la stessa
        signature e che utilizzano permessi signature-based possono condividere in
        maniera sicura codice e dati tra loro.
  8
      Certification Authority

                                           22
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

Intent I meccanismi di Binder, implementati all’interno del Kernel per permet-
tere l’IPC9 , sono completamente trasparenti agli sviluppatori. Ad un livello di
astrazione più alto troviamo perciò altri strumenti utilizzati per la gestione della
comunicazione tra le applicazioni. Vengono in particolare largamente utilizzati gli
Intent, ovvero dei messaggi che specificano una determinata azione da compiere
[16]. Permettono di invocare componenti esterne all’applicazione semplicemente
richiedendone l’esecuzione in maniera esplicita o implicita. Si parla di intent espli-
citi se utilizzati per far comunicare Activity della stessa applicazione. Il messaggio
seleziona in maniera precisa il componente candidato a compiere l’azione richie-
sta. Sono invece definiti intent impliciti i messaggi utilizzati per far comunicare
componenti di applicazioni diverse. L’intent in questo caso non specifica il com-
ponente di destinazione ma solo il tipo di azione da eseguire. Quando si fa uso
di un intent, è necessario che nel sistema sia installata un’applicazione che abbia
dichiarato nel proprio manifest la disponibilità a gestire quel determinato Intent.

3.4        Fasi di un pentesting in Android

Per un’applicazione Android, in accordo con il PTES, il processo di penetration
testing può essere diviso nei sette principali steps descritti precedentemente nel
paragrafo 2.3. Gli obiettivi finali delle diverse fasi non sono differenti da quelli
che vengono prefissati per un qualunque altro sistema non mobile; a cambiare
sono le metologie e gli strumenti utilizzati. Tuttavia, in Android, il susseguirsi
delle diverse fasi non è necessariamente lineare e le operazioni si possono alternare
ciclicamente.

Pre-Engagement Questa fase comprende la definizione degli obiettivi del test,
delle tempistiche e la documentazione di eventuali limiti o restrizioni. Lo scopo
  9
      Inter Process Communication

                                         23
Tecniche e strumenti di penetration
                                                         testing per Android Mobile apps

finale di questa fase è arrivare alla stipulazione di un contratto che specifichi tutti
questi dettagli.

OSINT Gathering È la fase di reconnaissment classica del pentesting. Su di-
spositivi Android è necessario profilare il target, ad esempio analizzando le funzio-
nalità, le descrizioni, dipendenze, proprietà, permessi e la cronologia delle versioni
di un componente o un’applicazione. Tutte queste informazioni di base sono forni-
te dal Google Play Store, o in generale reperite in rete sfruttando motori di ricerca
e consultando forum specializzati.

Threat Modeling In questa fase, è necessario riconoscere le minacce e l’impatto
che esse possono generare sul componente o sull’intera applicazione. Questa fase
dovrebbe includere la decompilazione dei binari compilati e lo studio dell’architet-
tura dell’applicazione per determinare i componenti e le relative funzionalità. Un
altro scopo di questa fase è determinare tutti i punti di accesso di un componente
Android, la cosiddetta superfice di attacco. Per un’applicazione, questi punti di
accesso sono definiti nell’Android Manifest; sono necessari dunque alcuni tool di
reverse engineering come APKTool per ricavare questo file.

Vulnerability Analysis È il processo mediante il quale si cerca di scoprire de-
bolezze e falle di sicurezza nei componenti Android, analizzando le informazioni
raccolte durante la fase precedente. Vengono eseguite, per ciascuno dei binari, sia
scansioni statiche che dinamiche per identificare problemi di compilazione, auto-
rizzazioni non necessarie, memorizzazione improprie dei dati locali, informazioni
non codificate.

Exploitation La fase di exploitation si concentra esclusivamente sullo stabilire
l’accesso ad un componente Android bypassando le misure di sicurezza. In que-
sta fase si tenterà di sfruttare tutte le vulnerabilità identificate. Ciò permette

                                          24
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

di valutare il reale livello di rischio associato ad una vulnerabilità sfruttata con
successo.

Post Exploitation Lo scopo di questa fase è determinare il livello di compro-
missione del dispositivo e di mantenere il controllo per usi successivi, ad esempio
installando una backdoor. Nel sistema Android, è possibile sfruttare le vulnerabili-
tà di un’applicazione installata per compromettere l’intero dispositivo ed effettuare
l’escalation dei privilegi.

Reporting Il report è una parte essenziale di un penetration testing. Que-
sto rapporto documenterà la metodologia e gli exploit utilizzati, le vulnerabilità
riscontrate ed eventuali consigli per eliminarle.

3.5      Strumenti per il pentesting in Android

In letteratura sono numerevoli e di diverse tipologie gli strumenti utilizzati per
effettuare un penetration testing su un dispositivo Android. La scelta dipende
dalle esigenze, dalle finalità del testing e dal tipo di applicazione da testare. Per
portare a termine un penetration testing con successo è sempre necessario utiliz-
zare differenti tools, ognuno dei quali può coprire una determinata fase del testing.
Per questo motivo sono nati alcuni framework o addirittura sistemi operativi in-
teramente dedicati al pentesting che, racchiudendo un insieme di strumenti in un
unico ambiente, mirano a semplificare e velocizzare il lavoro dei tester. Ognuno
di essi è tarato con determinate configurazioni e per questo non è detto che corri-
spondano in toto alle necessità del tester. Prima di intraprendere un penetration
testing è necessario dunque avere una visione generale di quelli che sono gli stru-
menti esistenti e di quali sono le loro potenzialità. Nella tabella che segue sono
elencati i più diffusi sistemi operativi, framework o tools utilizzati nell’ambito del
penetration testing di applicazioni Android, specificando per ognuno di essi quali

                                         25
Tecniche e strumenti di penetration
                                                            testing per Android Mobile apps

fasi del penetration testing mobile riescono a coprire. Sono state omesse le fa-
si di pre-engagement, information gathering e di reporting che non si avvalgono
dell’utilizzo di alcun tool.
                        Tipologia    Threat     Vulnerability Exploitation    Post
                                    Modeling      Analysis                 Exploitation
 [17]   Kali Linux          OS         X             –            X            X
 [18]   Pentoo              OS         X             –             –            –
 [19]   Andrax              OS         X             X            X             –
 [20]   Androl4b            OS         X             X             –            –
 [21]   Santoku             OS         X             X            X             –
 [22]   Vezir Project       OS         X             X             –            –
 [23]   BlackArch           OS         X             X            X             –
 [24]   Mobisec             OS         –             X            X             –
 [25]   Appie           framework      X             X            X             –
 [26]   AndroBugs       framework      –             X             –            –
 [27]   MARA            framework      X             X             –            –
 [28]   MobSF           framework      X             X             –            –
 [29]   Metasploit      framework      –             –            X            X

   Come è possibile notare, nessuno degli strumenti analizzati copre tutte le fasi
del penetration testing ed inoltre, molti di quelli analizzati includono funzionalità
superflue non dedicate ai dispositivi mobile. Di particolare rilevanza è il framework
’Appie’, completamente dedicato ad Android e che, al contrario di molti altri
framework, è pronto per l’uso, cioè non necessita di alcuna dipendenza esterna.

                                               26
Capitolo 4

Esempio di Pentesting: Appie

In letteratura esistono molti strumenti adoperati per un penetration testing su
Android. In questo lavoro di tesi si è fatto uso di un pacchetto software pre-
configurato denominato Appie (Android Pentesting Portable Integrated Environ-
ment). Esso è utilizzabile su qualunque macchina Windows-based senza la neces-
sità di installare una VM1 o utilizzare il DualBoot ed è completamente portable.
È uno strumento per le analisi di sicurezza su Android unico nel suo genere e
risulta essere una soluzione unica per operazioni di Security Assessment, Forensic
e analisi Malware.

4.1        Configurazione dell’ambiente

È necessaria una semplice installazione del pacchetto Appie su una macchina Win-
dows, dato che qualsiasi dipendenza di cui necessita è contenuta nello stesso pac-
chetto. Deve essere poi configurato un emulatore per device Android. In questo
lavoro è stato scelto il software Genymotion ed emulato un dispositivo ‘Google
Nexus 4’.
  1
      Virtual Machine

                                       27
Tecniche e strumenti di penetration
                                                         testing per Android Mobile apps

   Per avere la certezza che Appie abbia visibilità del device virtualizzato tramite
Genymotion, viene eseguito il seguente comando:

   Dopo aver configurato il dispositivo è necessario installare al suo interno un
server, il ‘Drozer Agent’ che, comunicando con un client preinstallato in Appie,
permette di effettuare diverse operazioni utili durante il testing.

   Una volta avviato, il Server, di default, si metterà in ascolto sulla porta ’31415’.
Per permettere la connessione tra Client e Server, si esegue il comando: ’adb
forward tcp:31415 tcp:31415’ nella console di Appie. Per avviare invece il Client
sul PC si esegue il comando ‘drozer.bat console connect’.

                                         28
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

4.2     Installazione delle app vulnerabili

Nell’ambito di questo lavoro sono state sottoposte al penetration testing delle
applicazioni che includono intenzionalmente alune vulnerabilità e falle di sicurezza:
FourGoats, HerdFinancial e Sieve. Di seguito, la procedura per installare una delle
applicazioni sul dispositivo target virtualizzato:

4.3     Treath Modeling

Drozer è uno strumento fondamentale nel testing di sicurezza per applicazioni
Android; esso permette di ridurre il tempo necessario per la valutazione delle vul-
nerabilità. Tramite questo tool è possibile ricavare prima di tutto l’identificativo
univoco dell’applicazione e poi altri dettagli come l’UserID, GID, i permessi del-
l’utente, la directory dei dati, il path del file apk, librerie condivise, versione e
nome dell’applicazione.

4.3.1    Superficie di attacco

È possibile richiedere a Drozer un report sulla superficie di attacco, cioè l’insieme
di tutti i componenti IPC che l’applicazione ha esportato per renderli disponibili

                                         29
Tecniche e strumenti di penetration
                                                         testing per Android Mobile apps

al sistema, all’utente o ad altre applicazioni.

   Il risultato mostra i potenziali vettori d’attacco ed inoltre evidenzia che i servizi
esportati sono debuggable, caratteristica che verrà approfondita in seguito.

Activity Scavando più a fondo nella superficie di attacco, utilizzando alcuni
moduli specifici di Drozer, è possibile ad esempio richiedere la lista di tutte le
activity, esportate e non, di un’applicazione.

Content Provider È possibile raccogliere ulteriori informazioni sui Content
Provider; utilizzando il modulo ’app.provider.finduri’ vengono trovati alcuni URI
relativi ai Content Provider esportati ai quali possono fare accesso le altre app
installate sul device.

                                          30
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

Services Per determinare quali sono nel dettaglio i servizi esportati si può
utilizzare ancora una volta il tool Drozer.

   Il servizio esportato non richiede alcun permesso. Questo significa che qualun-
que app malevola installata sullo stesso dispositivo può accedere a quel servizio e
in particolare alla locazione del dispositivo.

Broadcast Receiver Ancora un volta, utilizzando Drozer è possibile ricavare la
lista dei broadcast receiver esportati di un app. Nell’applicazione in esame viene
esportato un broadcast che permette di inviare SMS.

   Tutti questi componenti esportati formano di fatto la superficie di attacco del-
l’applicazione e sono potenziali punti di accesso per un utente malevolo. Verranno
successivamente sfruttati nella fase di Exploitation per accedere alle funzionalità
dell’applicazione tramite il client Drozer.

4.3.2     Reverse Engineering

Le applicazioni Android sono diffuse come file in formato ’.apk’ ; da essi è possibile
recuperare facilmente il codice sorgente utilizzando tecniche di reverse enginee-
ring. Questa vulnerabilità può essere sfruttata da un utente malevolo per analiz-
zare l’applicazione, determinare quali misure difensive siano state implementate e
per cercare quindi di bypassare tali meccanismi. Utilizzando lo strumento apktool
è possibile disassemblare il file APK per poi ispezionarlo. Tra gli altri file è sta-
to ricavato il file AndroidManifest.xml, essenziale per individuare altre eventuali
vulnerabilità.

                                         31
Tecniche e strumenti di penetration
                                                          testing per Android Mobile apps

   Altra tecnica che può essere utilizzata per decompilare il file apk è convertirlo
in formato jar tramite il tool dex2jar. Dopo aver ricostruito il codice sorgente il
file jar può essere ispezionato con il tool JD-GUI .

4.4     Vulnerability Analysis

Di particolare rilevanza, tra i tools inclusi nel pacchetto Appie, è AndroBugs.
AndroBugs è un efficiente scanner di vulnerabilità per Android, implementato
completamente in linguaggio python, che aiuta i tester a trovare potenziali falle
di sicurezza nelle applicazioni.

                                        32
Tecniche e strumenti di penetration
                                                          testing per Android Mobile apps

   Per l’applicazione in esame vengono rilevate molteplici vulnerabilità classificate
su diversi livelli di priorità tra cui: l’esistenza di componenti esportati (già rilevati
precedentemente tramite Drozer), l’utilizzo di intent impliciti, una verifica non
sicura dei certificati SSL, permessi per il sandboxing configurati scorrettamente,
abilitazione del debug mode, ecc.

4.5      Exploitation

Durante questa fase vengono sfruttate alcune delle vulnerabilità che sono state
rilevate nelle fasi precedenti.

4.5.1     Improper export of component

Durante la fase di ’Threat Modeling’ è stata ricavata una lista di tutti i componenti
che l’applicazione esporta e che possono essere lanciati da un altra applicazione
installata sul dispositivo. Ad esempio, si può aprire un’activity passando un intent
tramite Drozer senza disporre di particolari permessi e, in particolare, nell’esempio
mostrato, bypassare la procedura di autorizzazione.

   Per quanto riguarda i Content Provider esportati, è possibile interrogare alcuni
degli URI trovati precedentemente.

                                           33
Tecniche e strumenti di penetration
                                                       testing per Android Mobile apps

   Per accedere al primo è richiesto il permesso READ_KEYS ma per il secon-
do non è necessario alcun permesso. È possibile inoltre cambiare il valore della
password utilizzando il modulo ’app.provider.update’ di Drozer.

   Sfruttando invece uno tra i servizi esportati, denominato ’Location Service’, si
potrà avere accesso alla geolocalizzazione del dispositivo.

   Nelle precedenti fasi inoltre, era stato rilevato un broadcast receivere esporta-
to che permetteva di inviare un SMS. Ispezionando il sorgente dell’applicazione
con jd-gui si può ricavare la firma dell’intent da inviare per avviare il Broadcast
Receiver in questione.

                                        34
Tecniche e strumenti di penetration
                                                        testing per Android Mobile apps

4.5.2    Insecure data storage

Di default, i file creati da un’applicazione sono accessibili solo dalla stessa. Gli
sviluppatori, però spesso utilizzano i permessi MODE_WORLD_READABLE
e MODE_WORD_WRITEABLE per rendere questi file accessibili ad altre ap-
plicazioni. Ciò non limita in alcun modo un’applicazione malevola ad acceder-
vi. Nella directory ‘data/data/application’ di ogni applicazione c’è una cartella
‘shared_prefs’ e una cartella ‘database’. Con il comando ‘adb shell’ si apre una
shell remota sul dispositivo tramite la quale si può ispezionare il filesystem.

   Il problema principale è che all’interno di queste cartelle sono archiviati nume-
rosi file world_readble che possono essere letti da qualsiasi app e da cui è possibile
ricavare dati sensibili come ad esempio le password.

4.5.3    Insufficient transport layer protection

Quasi tutte le applicazioni Android trasmettono dati ad un server con paradig-
ma Client-Server e nella maggior parte dei casi viene creato un canale sicuro per
impedire lo sniffing dei dati. Il non raggiungimento di questa proprietà potrebbe
comportare gravi conseguenze per la sicurezza dei dati. Si può mostrare la pre-

                                         35
Puoi anche leggere