WhatsApp Forensics
Chi non conosce WhatsApp Messenger, l’applicazione di messaggistica istantanea multipiattaforma fondata da Jan Koum nel 2009 e più usata al mondo?
Sicuramente pochi, semmai ve ne siano. WhatsApp ha sicuramente rivoluzionato la cultura della comunicazione.
Dal 16 febbraio del 2014 fa parte del gruppo Facebook inc. ed è attualmente disponibile per IOS, Android e Windows Phone.
Il 1 febbraio del 2016 fu annunciato il raggiungimento di 1 miliardo di utenze.
Grazie alla sua stragrande popolarità, WhatsApp divenne rapidamente un bersaglio per spammer, truffatori e semplici criminali di tutti i tipi.
Il fatto stesso che l’app di messaggistica sia stata progettata per utilizzare comunicazioni end-to-end sicure, rende difficile per le forze dell’ordine indagare su casi che riguardano la messaggistica istantanea di WhatsApp.
WhatsApp è anche più sicuro degli SMS. A differenza del sistema di messaggi di testo e degli MMS messi a disposizione dal gestore di telefonia mobile, le comunicazioni di WhatsApp non possono essere intercettate o richieste al gestore stesso. A differenza di Apple iMessage, WhatsApp non è legato a una singola piattaforma, fungendo da perfetto sostituto di iMessage per le comunicazioni Android e iOS.
Dunque, non essendo memorizzato alcun dato dal gestore di telefonia mobile, non è possibile richiederne il dettaglio delle comunicazioni. L’unico modo per acquisire i dati di WhatsApp è quindi la copia forense dei dispositivi in possesso degli indagati oppure l’estrazione dei dati da backup locali o cloud. I backup su cloud sono comunque cifrati e quindi la loro acquisizione è tutt’altro che banale.
Infatti, tutte le versioni recenti di WhatsApp per Android cifrano i loro backup con una chiave unica per ogni account WhatsApp. Senza l’accesso a quella chiave, gli unici dati che potrebbero essere estratti dall’account Google dell’utente – per la precisione da Google Drive – si limiterebbero ai soli contatti e file multimediali inviati e ricevuti, dato che non vengono cifrati.
La cronologia delle comunicazioni principali è cifrata in modo sicuro con AES-256. Per rendere le cose ancora più complicate, le diverse build di WhatsApp utilizzavano diversi algoritmi di crittografia, rendendo complicato costruire un strumento univoco necessario alla decifrazione. La tecnologia peer-to-peer di scambio di messaggi cifrati, rende irrealizzabile anche l’attacco man-in-the-middle[1].
WhatsApp, come già detto, non conserva copia di quei messaggi sui propri server; il che esclude l’acquisizione diretta del cloud.
La chiave di cifratura viene generata dai server WhatsApp la prima volta che l’utente esegue un backup. La chiave non viene mai memorizzata nel cloud; è presente solo sul dispositivo dell’utente. La possibilità o meno di estrarre la chiave dal dispositivo dipende dalla versione di Android e dallo stato del dispositivo (permessi di root); tuttavia, è possibile generare quella chiave in base all’ID WhatsApp dell’utente (il loro numero di telefono). La chiave di cifratura così generata corrisponderà esattamente alla chiave utilizzata e renderà tutti i precedenti backup presenti sull’account Google decifrabili e leggibili. La stessa key verrà utilizzata per decifrare anche i futuri backup creati nell’account Google dell’utente.
In altre parole, è sufficiente generare una volta la chiave e utilizzarla a tempo indeterminato per decifrare i backup passati, presenti e futuri.
Uno strumento adatto allo scopo è costituito da un software sviluppato da Elcomsoft: Explorer per Whatsapp[2], il quale, tentando di registrarsi come un’applicazione WhatsApp, è in grado di inviare una richiesta di autenticazione al server ed ottenere il codice di verifica sul numero di telefono dell’utente registrato. Il codice ricevuto via SMS andrà inserito nell’applicazione Explorer per WhatsApp, consentendo così la generazione della key che rimarrà valida anche dopo nuova autenticazione su un dispositivo diverso, a condizione che vengano utilizzati lo stesso numero telefonico e lo stesso account Google.
Per quanto concerne iOS, tranne alcune differenze, valgono le considerazioni su esposte.
Nel dicembre 2016 WhatsApp veniva aggiornato alla versione 2.16.17. In questa build, la società iniziava a cifrare i backup archiviati in iCloud Drive, rendendo immediatamente inefficaci i metodi di estrazione esistenti. Prima della modifica era possibile, utilizzando degli opportuni software forensi, accedere correttamente agli archivi WhatsApp effettuando l’accesso all’account iCloud dell’utente e utilizzando le credenziali di autenticazione valide (login e password o i token di autenticazione binaria estratti dai computer dell’utente). La cifratura di WhatsApp poneva indubbiamente un significativo ostacolo all’estrazione, consentendola solo dai backup del sistema iOS (basati su iCloud e locali).
Dal 2016, quindi, sia i backup manuali che quelli giornalieri archiviati da WhatsApp in iCloud Drive vengono automaticamente crittografati. La chiave di cifratura, generata da WhatsApp quando l’utente effettua il backup per la prima volta, è univoca per ogni combinazione ID Apple e numero di telefono e ne vengono generate diverse qualora vi siano molteplici numeri di telefono afferenti allo stesso ID Apple.
Le chiavi vengono create e archiviate lato server da WhatsApp stesso; non vengono mai memorizzate in
iCloud e non possono essere estratte dal dispositivo.
Lo strumento già menzionato in precedenza è di ausilio anche in questo caso: Elcomsoft Explorer per WhatsApp è in grado di generare le chiavi di cifratura per i backup iCloud di WhatsApp, con lo stesso metodo descritto per Android; unica differenza è il necessario possesso delle credenziali utente (ID Apple e password, oppure il token di autenticazione binaria) per poter poi accedere al backup stesso.
WhatsApp è ormai un’applicazione universalmente utilizzata e implica che le persone, coinvolte in casi giudiziari, presentino i messaggi come prova per dimostrare come una conversazione possa aver avuto luogo, in termini concreti, tra alcuni interlocutori.
La Suprema Corte di Cassazione Penale, con sentenza n. 49016 del 25/10/2017 sez. V, ha analizzato con particolare attenzione la problematica attualissima inerente il valore probatorio delle comunicazioni svoltesi tramite WhatsApp che, come noto, è divenuto un elemento rilevante nel corso delle indagini giudiziarie.
Difatti, contrariamente a quanto ritenuto nel recente passato, la prova informatica prodotta in sede processuale dovrà indi possedere alcune imprescindibili caratteristiche; particolare rilevanza è rivestita dall’integrità.
Gli accorgimenti che dovranno essere adottati riguardano principalmente le fasi della raccolta e della loro conservazione e l’adozione di un sistema idoneo a garantirne l’integrità e la non alterabilità della prova stessa.
E’ appena il caso di ricordare che detti principi non sono nuovi ma rientrano nell’ambito del fondamento normativo della Digital Forensics espresso dall’art.8 della legge 48/2008.
Sempre la V sezione della Cassazione Penale, con sentenza n. 1822 del 16/01/2018 ha poi stabilito la natura documentale dei dati e dei messaggi acquisiti dai dispositivi informatici così come disposto dall’art. 234 del c.p.p e di conseguenza utilizzabili a tutti gli effetti in un giudizio di cognizione.
Perché gli artefatti di WhatsApp sono così importanti nell’ambito delle indagini sui dispositivi mobile?
Proprio come le altre applicazioni di chat installate su mobile, i contatti, i messaggi e gli allegati di WhatsApp possono essere preziosi per gli investigatori che cercano di recuperare le prove utilizzabili in una grande varietà di tipologia di indagini differenti.
Infatti questi artefatti possono contenere informazioni preziose e potrebbero essere determinanti alla risoluzione di molti casi giudiziari (stalking, violenza sessuale, estorsione, appropriazione indebita, pedofilia, etc.)
In questo articolo vedremo come individuare tra i dati già estratti da un dispositivo mobile quelli di interesse investigativo e come trattare le evidenze riscontrate nei due sistemi operativi più diffusi in ambito mobile: Android e IOS.
Un breve panoramica sul funzionamento dell’app di messaggistica istantanea più usata al mondo è d’obbligo ed è schematizzata in modo egregio nella figura in calce.
Architettura
Immagine gentilmente concessa da Fingent[3]
Dal punto di vista architetturale – inteso come aggregato delle sue parti costituenti e delle relazioni esistenti tra loro – WhatsApp utilizza lo stack LYME / LYCE[4].
I co-fondatori, Jan Koum and Brian Acton, hanno optato per FreeBSD su Linux, data la loro personale esperienza del sistema che già conoscevano e apprezzavano sia per le intrinseche qualità di robustezza che per la sicurezza, e che avevano già avuto modo di utilizzare nella loro precedente attività quali dipendenti della Yahoo Inc..
In calce l’architettura di base dell’app:
Sistema operativo: | FreeBSD[5] |
Linguaggio di programmazione: | Erlang[6] |
Macchina virtuale (per eseguire Erlang): | BEAM[7] |
Server: | Ejabberd[8], YAWS[9] |
Database: | Mnesia[10] |
Database locale: | SQLite[11] |
Erlang è il linguaggio di programmazione principale di WhatsApp, molto apprezzato per le sue prestazioni.
I principali vantaggi sono rappresentati dalla velocità e dalla scalabilità, oltre alla possibilità di aggiornare il codice “on fly”.
Ma ovviamente, Erlang non è l’unica opzione.
Altre app di chat, come Telegram o Kik, utilizzano Node.js, la scelta numero uno per le applicazioni che devono elaborare un volume elevato di messaggi brevi che richiedono una bassa latenza.
Le app di questo tipo, ovvero le applicazioni in tempo reale (RTA[12]), includono strumenti collaborativi come Slack[13], Trello[14] o Google Docs. La tecnologia è particolarmente apprezzata dagli sviluppatori di app live-chat e di messaggistica istantanea presentando dei vantaggi non indifferenti.
WhatsApp si avvale di Ejabberd, un server di messaggistica istantanea Jabber/XMPP open source scritto in Erlang. Adopera il protocollo XMPP (eXtensible Messaging and Presence Protocol) che gestisce un sistema di consegna dei messaggi.
Il server Ejabberd si basa su una serie di moduli collegabili (plugin) che abilitano funzioni come:
- Invio di messaggi “one to one”;
- Memorizza e inoltra (messaggi offline);
- Elenco contatti e presenza on line;
- Chat di gruppo – Multi User Chat (MUC);
- Gestione archivio messaggi (MAM);
- Protocollo evento personale (PEP);
- Impostazioni della privacy.
La società ha personalizzato la maggior parte di Ejabberd, passando da XMPP a un protocollo sviluppato internamente, ristrutturando il codice di base e riprogettando alcuni componenti principali, apportando molte modifiche importanti alla macchina virtuale Erlang per ottimizzare le prestazioni del server. WhatsApp memorizza i file multimediali di notevole dimensione sul server web YAWS.
Il server è una struttura determinante per le app di messaggistica istantanea: permette di conservare i messaggi destinati a utenti temporaneamente off-line in modo da poterli inoltrare successivamente.
Per tale scopo, si utilizza, infatti, una connessione asincrona. Il ridimensionamento orizzontale (che significa aggiungere più macchine, non più memoria) aiuta a far fronte ai picchi di traffico.
Esistono due modi per archiviare i messaggi: è possibile conservarli per sempre sui server oppure eliminarli non appena vengono consegnati per essere archiviati localmente – WhatsApp utilizza il motore di database SQLite per farlo -.
In tal caso, i messaggi vengono temporaneamente accodati sui server fino a quando il destinatario non è nuovamente on-line: il messaggio viene quindi consegnato e la coda cancellata.
Allo stesso modo, i riconoscimenti dei messaggi inviati, consegnati o letti verranno messi in coda sui server sotto forma di un particolare “ID message”. L’integrità della coda, – mantenendo pochi messaggi nella stessa -, verrà salvaguardata e i picchi di traffico, – ad esempio eventi legati a calamità naturali -, verranno gestiti con server aggiuntivi.
Come è facilmente deducibile, Ejabberd rappresenta un’ottima scelta per il supporto di applicazioni audio e video e il trasferimento di dati multimediali (i file di notevoli dimensione, come già accennato, vengono memorizzati su YAWS).
Analizzeremo ora le evidenze digitali rilevanti ai fini investigativi.
Android
WhatsApp memorizza tutti i dati in un database SQLite. Poiché si tratta di un’app multipiattaforma per dispositivi mobili, la posizione del database varia a seconda del sistema operativo in cui è installato.
Questa è la struttura della specifica cartella Android utilizzata per l’installazione dell’app[15]:
Di seguito la struttura della directory presente sulla SD:
I file di interesse investigativo – versione 2.17.79 -:
Contenuto | Directory | File |
---|---|---|
Database dei contatti | /data/data/com.whatsapp/databases | wa.db (SqLite) |
Database dei Messaggi | /data/data/com.whatsapp/databases | msgstore.db (SqlLite) |
Contiene i contatti (numero di telefono) con cui sono state effettuate le conversazioni | /data/data/com.whatsapp/databases | Axolotl.db (SqLite) |
Backup dei database messaggi | /SDCard/Whatsapp/Databases | msgstore-db.crypt* msgstore-(data).1.db.crypt* |
Avatars dei contatti | /data/data/com.whatsapp/files/Avatars | UID@s.whatsapp.net.j dove UID è l’identificativo del contatto |
Numero di telefono associato all’account | /data/data/com.whatsapp/files/ | me |
File di log dell’applicazione | /data/data/com.whatsapp/files/Logs
| whatsapp.log, whatsapp-<date>.log
|
Recupero ulteriore del numero telefonico associato all’account | /data/data/com.whatsapp/shared_prefs/ | registration.RegisterPhone.xml |
Mostra la data di verifica dell’account registrato e il primo utilizzo dell’applicazione. | /data/data/com.whatsapp/shared_prefs/ | registration.VerifySMS.xml. Esempio: <long name=”com.whatsapp.registration.VerifySms.call_countdown_end_time” value=”1488996158375″ /> mercoledì, 8 marzo 2017 19:02:38.375 GMT+01:00 |
Vari tipi di file multimediali | /SDCard/Whatsapp/Media | La scheda SD è una miniera di informazioni e dati WhatsApp. Contiene una cartella per ogni tipo di file multimediale (audio, documenti, immagini, video e note vocali). Tutti gli allegati ricevuti sono memorizzati, a seconda del tipo, nella root delle apposite cartelle. Tutti i file inviati sono contenuti invece in sottocartelle denominate “sent” e situate in ogni cartella menzionata. |
La directory dei database è una fonte di informazioni ancora più grande. WhatsApp fa un backup di
msgstore.db periodicamente e memorizza i backup /SDCard/Whatsapp/Databases.
Ciò consente di analizzare i dati storici memorizzati in date diverse.
L’unico problema è che questi backup sono crittografati!
Msgstore.db è un database SQLite formato da 14 tabelle – versione 2.17.79 di WhatsApp -, come evidenziato in calce:
La tabella dei messaggi contiene un elenco di tutte le comunicazioni inviate o ricevute dai suoi contatti.
WhatsApp utilizza il numero di telefono dell’utente come identificativo univoco sia per l’utente che per i suoi contatti. Questa tabella includerà il numero di telefono del contatto, il contenuto dei messaggi, lo stato dei messaggi, i timestamp e tutti i dettagli relativi agli allegati inclusi nel messaggio.
Gli allegati inviati tramite WhatsApp hanno una propria voce di tabella e il contenuto del messaggio conterrà una voce nulla con una miniatura e un collegamento alla foto/immagine condivisa. Gli allegati vengono referenziati in appositi campi della tabella messages – illustrati in seguito – contenuta nel db msgstore.db.
Inoltre, la tabella può contenere le coordinate di latitudine e longitudine per i messaggi inviati, consentendo all’investigatore di poter disporre di ulteriori evidenze da poter utilizzare nel corso delle indagini.
Tabella messages – Contiene tutti i messaggi (sia di gruppo che individuali):
Campo “status”.
Indica i valori dello stato del messaggio:
- 0 – messaggio ricevuto;
- 13 – messaggio inviato visualizzato (segno di spunta blu);
- 5 – messaggio inviato non visualizzato (doppio segno di spunta ma segno di spunta blu);
- 4 – inviato un messaggio al server Whatsapp, ma non ricevuto nell’app Whatsapp del destinatario (spunta singola);
- 6 – chiamate inviate / ricevute (il campo key_from_me specifica se la chiamata è inviata o ricevuta); può assumere i valori 0 o 1:
Valore 0 – dai contatti.
Valore 1 – dall’utente corrente di WhatsApp.
Campo “destinatario_count”.
Può assumere 2 valori:
- 0 per le singole chat oppure il numero dei membri che compongono il gruppo se il messaggio fa parte di un gruppo.
Campo “read_device_timestamp”.
Non contiene alcun valore se il messaggio non è stato letto da tutti nel gruppo.
Campo “media_name”.
Contiene il nome del file inviato e memorizzato nelle apposite cartelle WhatsApp a seconda della tipologia dello stesso e contenuta nel campo “media_mime_type”.
Campo “media_caption”.
Contiene la didascalia del file multimediale che abbiamo fornito durante l’invio.
Campo “media_url”.
Fornisce la posizione del file nel server WhatsApp. Es: https://mme.whatsapp.net/d/9w-Bu3sFaxMzaF6NIBkbuleaVIU/Asj6Kh-dOXv9tidYk-uBwe0Z78_lpmTC5Nm3U_ZmYbKg.enc.
Tabella chat_list – Contiene tutti i contatti (se il campo subject è vuoto) e i gruppi (se lo stesso campo subject assume un valore) con cui sono state effettuate tutte le comunicazioni inviate e ricevute (ma non esaustivo):
Nel caso di gruppo il campo “creation” mostra la data di creazione.
Il valore contenuto nel campo “message_table_id” corrisponde al valori del campo “docid“ della tabella “messages_fts_content “(contiene tutti i messaggi), ed indica l’ultimo messaggio inviato e/o ricevuto.
Il database denominato wa.db, contiene tutte le informazioni relative ai contatti dell’utente, è anch’esso un database SQLite formato da 7 tabelle – versione 2.17.79 di WhatsApp -, come evidenziato in calce:
Tabella wa_contacts – Contiene i nomi dei contatti, i numeri di telefono e il loro stato:
WhatsApp memorizza l’immagine del profilo nella posizione /data/data/com.whatsapp/files/Avatars con estensione [.j]. Questi file, estratti e rinominati con estensione [.jpg], potranno essere visualizzati quali immagini. I file sono identificati con i numeri telefonici relativi.
E’ chiaro che l’accesso a questi file è permesso solo dopo aver eseguito il rooting del dispositivo o effettuato un’acquisizione fisica con un software forense.
WhatsApp può memorizzare, inoltre, – in dipendenza dalla configurazione effettuata dall’utente – una copia di msgstore.db sulla scheda SD, che viene normalmente utilizzata per i backup e può essere rinvenuta nella directory:
/SDCard/WhatsApp/Databases/msgstore.db.crypt*
Come già evidenziato precedentemente, i file di backup presenti sono cifrati.
WhatsApp utilizza diversi tipi di crittografia a seconda della versione utilizzata e denomina i database con estensioni diverse (crypt5, crypt8,crypt12).
Questi possono essere decifrati solo con la key archiviata nella cartella /data/data/com.whatsapp/files.
Solitamente per estrarre la chiave di crittografia un informatico forense deve eseguire un’estrazione fisica dal dispositivo. Ma ciò non è sempre possibile a causa di problemi software e hardware di alcuni dispositivi mobili. Naturalmente, ci sono metodi di estrazione della chiave di crittografia da dispositivi “non-rooted”, ma queste tecniche possono essere applicate a un numero limitato di dispositivi.
Oggi esistono in commercio varie soluzioni che consentono, già durante l’estrazione, la decriptazione dei database di whatsapp: Cellebrite Ufed, Belkasoft Evidence Center, Magnet Axiom solo per citarne alcuni.
Recuperare i contatti, i messaggi e gli allegati di WhatsApp su Android è relativamente semplice una volta che hai accesso ai database appropriati.
Il processo è simile in iOS con alcune piccole differenze.
iOS
Anche qui, una breve premessa è d’obbligo.
A partire dalla versione 8 di iOS, i dati delle applicazioni sono stati separati dai loro bundle e la struttura della directory corrente è ora la seguente:
/private/var/mobile/Containers/Bundle/Application/, dove sono archiviati i componenti dell’applicazione;
/private/var/mobile/Containers/Data/Application/, dove è archiviata la maggior parte dei dati inerenti l’applicazione;
/private/var/mobile/Containers/Shared/AppGroup/, in cui le applicazioni possono memorizzare dati da condividere con altre app o estensioni.
Whatsapp memorizza i dati nella directory condivisa menzionata in precedenza in una sottocartella denominata 332A098D-368C-4378-A503-91BF33284D4B; il percorso completo
private/var/mobile/Containers/Shared/AppGroup/332A098D-368C-4378-A503-91BF33284D4B contiene
quanto riportato in calce:
- Axolotl.sqlite
- ChatSearch.sqlite
- ChatStorage.sqlite
- Contacts.sqlite.
ChatStorage.sqlite è il database che contiene le conversazioni di WhatsApp in iOS. Le tabelle di interesse per la raccolta di elementi probatori interessanti sono:
ZWAMESSAGE,ZWACHATSESSION, ZWAGROUPMEMBER, ZWAGROUPINFO and ZWAMEDIAITEM.
La più importante è ZWAMESSAGE, che contiene, tra l’altro, i messaggi scambiati, i timestamp e il nome dell’utente coinvolto nella chat.
Le altre tabelle che meritano di essere analizzate correlate tra loro sono: ZWACHATSESSION, ZWAGROUPMEMBER, ZWAGROUPINFO e ZWAMEDIAITEM, che memorizza i riferimenti ai file multimediali scambiati, l’indicazione degli utenti coinvolti, i timestamp e il percorso in cui è stato archiviato il file.
J. Zdziarski[16] evidenziò, a suo tempo, un’interessante “caratteristica” di Whatsapp: le chat cancellate non vengono effettivamente eliminate dal database.
Ciò è dovuto alla gestione che SQLite fa dei record cancellati; infatti, quando un record è cancellato, per motivi di prestazioni esso non viene in realtà eliminato dal database immediatamente, ma solo contrassegnato come libero ed eventualmente sovrascritto in seguito, se e quando lo spazio di archiviazione sarà necessario.
Pertanto, utilizzando semplicemente uno strumento come SQLite-parser[17][18] sarà possibile risalire ai record cancellati nel database di WhatsApp.
Oggi la condivisione della conoscenza che si ottiene attraverso l’apprendimento e l’esperienza è fondamentale per affrontare le sfide che ogni giorno un informatico forense si trova a fronteggiare.
Con poco sapere, ma di buona qualità, si produce di più che con moltissimo sapere di cattiva qualità.
Arthur Schopenhauer
Note
- [1] https://it.wikipedia.org/wiki/Attacco_man_in_the_middle
- [2] https://www.elcomsoft.it/exwa.html
- [3] https://www.fingent.com/
- [4] https://en.wikipedia.org/wiki/LYME_%28software_bundle%29
- [5] https://www.freebsd.org/
- [6] http://www.erlang.org/
- [7] www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
- [8] https://www.ejabberd.im/ https://www.process-one.net/en/ejabberd/
- [9] http://yaws.hyber.org/
- [10] https://en.wikipedia.org/wiki/Mnesia
- [11] https://www.sqlite.org/index.html
- [12] RTA (Real Time Application)
- [13] https://slack.com/
- [14] https://trello.com/
- [15] La directory è accessibile solo con i privilegi di root.
- [16] http://www.zdziarski.com/blog/?p=6143
- [17] http://az4n6.blogspot.it/2013/11/python-parser-to-recover-deleted-sqlite.html
- [18] https://github.com/mdegrazia/SQLite-Deleted-Records-Parser
A cura di: Cosimo de Pinto
Informatico Forense, socio IISFA, socio ONIF, certificato CIFI, è Perito e Consulente Tecnico presso il Tribunale Ordinario di Roma. Laureato in Beni Culturali, è stato un pioniere della Digital Forensics, espletando il suo primo incarico come ausiliario di P.G. presso la Procura di Bari nel lontano 1990.Titolare di uno studio professionale, presta la propria consulenza a studi legali, aziende, Procure e FF.OO., in materia di Digital Forensics e CyberCrime.