2. Cos’è Telegram Messenger?
● Client ufficiale di Messaggistica istantanea
open source.
● Molto diffuso (200 000 000 utenti attivi al
mese).
3. Software per Analisi Forense
1. Cellebrite UFED
2. Micro Systemation
3. Oxygen Forensics
4. Compelson Labs
Questi software sono in grado di decodificare i
vari dati archiviati da Telegram ma non
forniscono alcuna spiegazione su come questa
decodifica viene eseguita.
4. Lo scopo del progetto
● Presentare una metodologia di analisi forense
per Telegram Messenger.
● Applicare la metodologia
● Confrontare i dati con quelli estratti dal
software Cellebrite UFED
NB: le debolezze presentate non riguardano il
protocollo Telegram, ma l’app client.
5. Cosa riusciamo a estrarre
● Dati dell’account utente
● L'elenco dei contatti
● La cronologia e il contenuto dei messaggi
scambiati dagli utenti
● Il contenuto dei file che sono stati inviati o ricevuti
● Le proprietà delle varie chat, gruppi e canali in cui
l'utente è stato coinvolto
● Il log delle chiamate vocali fatte o ricevute.
6. Informazioni di interesse investigativo
● Ogni utente è identificato da un id univoco (TID), un numero intero scelto dal server
Telegram associato a un numero di telefono.
○ Per ciascun contatto, l’app Telegram memorizza il suo TID, nome utente (se
impostato), il numero di telefono e la foto di profilo.
● La cronologia e il contenuto degli scambi i messaggi sono di evidente importanza
investigativa.
● Le proprietà del dialogo in cui l’utente è stato coinvolto(chat segrete, gruppi privati, ecc)
● La cronologia delle chiamate vocali (cioè, quando una chiamata è stata eseguita, con chi
e per quanto tempo) ha un evidente valore investigativo.
7. Dove prendere i dati di interesse
● Telegram Messenger memorizza vari dati all'interno della memoria del dispositivo, e in
particolare sia nelle cartelle del bundle privato dell’app che in quelle accessibili alle altra
app:
○ Nelle sottocartelle di data, che è inaccessibile alle altre app e agli utenti standard, ci
sono i dati delle chat e preferences
○ Nella cartella media, il cui accesso è invece non soggetto a restrizione, sono
presenti i files scambiati
■ immagini, audio, video e documents
Vediamo come sono strutturati i dati all’interno della cartella /data.
9. Dove prendere i dati di interesse
● L’analisi mostra che ce ne sono quattro principali dati che forniscono informazioni
rilevanti dal punto di vista forense, in particolare:
○ main database, un database SQLite denominato cache4.db che si trova nella
cartella del database e che contiene molte informazioni importanti, cioè l'elenco
dei contatti dell'utente, la cronologia degli scambi di messaggi, i contenuti dei
messaggi testuali, la posizione in memoria del dispositivo in cui sono memorizzati i
contenuti dei messaggi non testuali, e il log delle chiamate vocali;
○ user configuration file, un file XML denominato userconfing.xml collocato nella
cartella preferences, che memorizza i dettagli dell'account Telegram usato sul
dispositivo;
○ le foto del profilo dell'utente e dei suoi contatti, memorizzati nella cartella cache,
che può rivelare informazioni sulla reale identità di contatti dell'utente;
○ le copie dei file inviati o ricevuti dall'utente tramite Telegram Messenger, che sono
memorizzati nella cartella media.
10. Come ottenere i dati di interesse
● Telegram Messenger memorizza la maggior parte dei dati che genera in strutture dati
complesse, che chiamiamo Telegram Data Structures (TDS), archiviati in formato
binario serializzato.
● Pertanto, per recuperare le informazioni di un TDS, è necessario innanzitutto
deserializzare, cioè estrarre i vari campi dalla corrispondente sequenza binaria, e poi
decodificare.
● La documentazione ufficiale di Telegram fornisce le regole per deserializzare i tipi base.
(int, string, etc)
● Per i tipi compositi (strutture dati costituite da un insieme di attributi) la
documentazione di cui sopra è, al momento, obsoleta e incompleta.
● L'analisi del codice sorgente ha permesso di determinare la deserializzazione di un tipo
composito.
○ deserializzando ricorsivamente i suoi attributi (tipi base) si riesce a deserializzare il
tipo composito.
11. Identificazione dei dati dell’account
● Questa informazione è memorizzata nel configuration file
dell'utente, e in particolare in uno dei suoi attributi, che è
denominato user.
● Questo attributo memorizza un TDS di tipo User, la cui struttura è
riportata nella tabella successiva.
● TDS User utilizza altri TDS di tipo UserProfilePhoto e FileLocation.
● La struttura di questi TDS è riportata nella documentazione ufficiale.
13. Identificazione dei dati dell’account
● In questo esempio viene mostrato TDS user serializzato, memorizzato
nel campo user del user configuration file, e i suoi campi dopo che
sono stati deserializzati e decodificati.
14. Ricostruzione della lista dei contatti
● Telegram suddivide le informazioni relative a ciascun contatto su
due tabelle del main database:
○ i contatti effettivi
○ gli utenti di Telegram che sono noti all’utente locale (ad esempio, quelli che hanno
pubblicato un messaggio in un gruppo comune) anche se non appartengono
all'elenco dei contatti.
15. Ricostruzione della lista dei contatti
● Ogni record nella tabella contacts memorizza il TID del contatto corrispondente (campo
uid) e un valore booleano (campo mutual) che indica se l'utente locale è anche nella
lista dei contatti di quel contatto.
16. Ricostruzione della lista dei contatti
● L'elenco dei contatti dell'utente può essere ricostruito selezionando i record nella tabelle
users che hanno un record corrispondente nella tabella contacts, come fatto dalla
seguente query SQL:
○ SELECT ∗ FROM users WHERE uid IN (SELECT uid FROM contacts)
17. Ricostruzione della lista dei contatti
● Questo esempio mostra come un record nella tabella contacts è collegato al record
corrispondente nella tabella users, insieme ad altri due record di quest’ultima tabella
che non corrispondono a un contatto.
18. Identificazione dei contatti bloccati
● Telegram consente a un utente di bloccare un contatto. Quando
l'utente blocca un contatto, Telegram Messenger aggiunge un
record alla tabella blocked_users del main database, che contiene
solo un campo (denominato uid), che memorizza il TID dei contatti
bloccati.
● Pertanto, la serie di utenti bloccati può essere ricostruita
selezionando tali record nella tabella contacts i cui TID sono
memorizzati anche nella tabella blocked_users, come è fatto dalla
seguente query SQL:
○ SELECT ∗ FROM contacts WHERE uid IN (SELECT uid FROM blocked_users)
19. Ricostruzione degli scambi di messaggi
● Telegram organizza i messaggi scambiati dall'utente in finestre di dialogo, ognuna
corrispondente a una specifica chat, (super) gruppo o canale.
● Le informazioni relative alle finestre di dialogo con cui l'utente è stato coinvolto vengono
memorizzate nella tabella dialogs.
○ Ogni record memorizza l'ID della finestra di dialogo (DID), l'ora e la data
dell'ultima operazione eseguita nella finestra di dialogo, il numero di messaggi che
devono ancora essere letti, se la finestra di dialogo è stata bloccata e altre
informazioni meno rilevanti.
● Telegram memorizza un record per ogni messaggio nella tabella messages, è presente
un campo UID dove viene memorizzato DID della finestra di dialogo.
● Pertanto, i messaggi scambiati in una finestra di dialogo con DID xxxx possono essere
identificati selezionando tali record nella tabella messages il cui campo UID contiene il
valore xxxx, come fatto dalla seguente query SQL:
○ SELECT ∗ FROM messages WHERE uid=xxxx
20. Ricostruzione degli scambi di messaggi
● Questo esempio mostra due finestre di dialogo, corrispondenti ai
DID 77000 e 278291552, e i relativi messaggi.
21. Identificazione di chat segrete
● Telegram permette di creare chat segrete (end-to-end encrypted).
● Per ogni chat segreta, Telegram memorizza un record nella tabella enc_chats.
○ vengono memorizzate informazioni del tipo: id della chat(campo uid), il suo nome
(campo name) e il TID del partner di chat (campo user).
○ altre informazioni sono codificate nel TDS EncryptedChat memorizzato nel campo
data.
22. Identificazione di chat segrete
● Per identificare i messaggi scambiati in una determinata chat segreta, è necessario
identificare il record nella tabella dialogs, per poter poi trovare il record corrispondente
nella tabella messages.
● L’analisi ha mostrato che, per questi record, abbiamo dialogs.did = enc_chats.uid << 32,
dove << indica l'operatore di spostamento a sinistra.
● Quindi, i dialoghi corrispondenti alle chat segrete possono essere identificati dalla
seguente query SQL:
○ SELECT ∗ FROM dialogs WHERE did IN (SELECT uid <<32 FROM enc_chats)
23. Identificazione di chat segrete
● Vediamo un esempio, dove mostriamo un record nelle tabelle enc_chats e il record
corrispondente nella tabella dialogs (notare che 1952104764 << 32 =
8384226119745798144). Decodificando i campi del record enc_chats vediamo che la chat
segreta è stata creata dall'utente il cui TID è 247533163, è stata creato il 24 novembre
2016 ed è stato aggiunto l'utente il cui TID è 281235098.
●
24. Identificazione di gruppi, supergruppi e canali
● Per ogni gruppo, supergruppo o canale, Telegram memorizza un record nella tabella
chats e un record nella tabella dialogs.
● I record di queste tabelle che corrispondono alla stessa finestra di dialogo sono collegati
tra loro tramite i valori memorizzati nei campi uid e did. In particolare, abbiamo
dialogs.did = -chats.uid. Pertanto, le finestre di dialogo corrispondenti ad un (super)
gruppo o canale possono essere identificati dalla seguente query SQL:
○ SELECT ∗ FROM dialogs WHERE did IN (SELECT −uid FROM chats)
● La tabella chats memorizza l'id di (super) gruppo (campo uid) e il suo nome (campo
name). Ulteriori informazioni sono invece codificate nel TDS di tipo Chat memorizzato
nel campo data(vedere successiva slide). I dati memorizzati in questo TDS consentono di
determinare molte proprietà della finestra di dialogo. In particolare, un dialogo privato
ha username = null, invece il tipo di dialogo può essere determinato correlando i valori
memorizzati nel campo version e nel megagroup come segue:
○ se version=1, allora dialog è un gruppo;
○ se version=0 e megagroup=True, allora dialog è un supergroup;
○ se version=0 and megagroup=False, allora dialog è un canale.
26. Identificazione di gruppi, supergruppi e canali
● La figura rappresenta un estratto
della tabella chats che contiene
quattro record, ognuno
corrispondente a un diverso
(super) gruppo / canale
● Record n. 1 corrisponde a un
gruppo privato (username = null)
(version = 1), che è stato creato
dall'utente locale (creator = True)
il 9 aprile 2017 alle 11:42:15 UTC
(date = 1491738135), e di cui il
titolo è "GroupTest". L'utente è
ancora membro del gruppo (left
= Falso), che ha due partecipanti
(participants_count = 2).
27. Identificazione di gruppi, supergruppi e canali
● Record n. 2 corrisponde a un
supergruppo pubblico (username =
PublicTestGroup) (version = 0 e
megagroup = True), il cui titolo è
'Telegram Party', l'utente locale ha
aderito (creator = False) il 14 aprile 2017
alle 8:01: 23 UTC (date = 1492156883), e
successivamente ha lasciato (left = True).
Questo supergruppo è associato a una
foto del profilo, memorizzata nel file
421206657 74766.jpg (dimensioni ridotte)
e 421206657 74768.jpg (dimensioni
maggiori), entrambi memorizzati nella
directory cache.
● ...
28. Ricostruzione della cronologia e del contenuto dei msg
● Le informazioni relative ai messaggi scambiati nelle varie chat, comprese le chat segrete,
sono memorizzate nella tabella messages. Ogni record memorizza il Message Identifier
(MID) univoco e il DID della finestra di dialogo, se il messaggio è stato inviato o meno
(campo send_state), se è stato letto o meno (campo read_state), sia che si tratti di un
messaggio in arrivo o in uscita (campo out), la data dell'ultima modifica del suo stato (campo
date), e il suo contenuto codificato in un TDS di tipo Message memorizzato nel campo data.
29. Ricostruzione della cronologia e del contenuto dei msg
● I contenuti di tutti i tipi di messaggi vengono codificati nel TDS Message, vale la pena
sottolineare che anche i messaggi che appartengono alle chat segrete vengono
memorizzati nel main database senza essere cifrati.
● La struttura del TDS Message è fatta come segue:
30. Ricostruzione della cronologia e del contenuto dei msg
● Mentre la decodifica del contenuto di un messaggio testuale è semplice, poiché è
memorizzata come stringa UTF-8 nel campo message, per quelli non testuali la situazione è
più elaborata. In particolare, il TDS MessageMedia, memorizzato nel campo media, viene
istanziato a un TDS diverso in base al suo tipo di contenuto.
● Di seguito, è mostrata l’elenco di tutti i TDS utilizzati per memorizzare i dettagli relativi ai
contenuti non testuali.
31. Ricostruzione della cronologia e del contenuto dei msg
● Quando un file contenente un'immagine viene inviato o ricevuto, Telegram crea diverse
copie di esso, che differiscono l'una dall'altra nelle loro dimensioni, e le memorizza nella
sottocartella Telegram Images della cartella media o nella cartella cache.
● I dettagli di questi file sono memorizzati nel TDS messageMediaPhoto e in particolare nel
campo sizes, che contiene un elenco di TDS di tipo PhotoSize.
32. Ricostruzione della cronologia e del contenuto dei msg
● Nel database del mittente, attributo attach_path del TDS Message contiene la path dove è
memorizzato il file che è stato inviato.
● Nell’esempio viene mostrato come decodificare il campo data di un record nella tabella
Messages corrispondente a un'immagine che è stata inviata, insieme alle copie di questo file
che sono state salvate nelle cartelle Telegram Image e cache.
33. Ricostruzione della cronologia e del contenuto dei msg
● Per i file diversi dalle immagini, Telegram memorizza solo una copia in una delle
sottocartelle della cartella media, in base al suo tipo specifico. In particolare, i file audio, video
e generici vengono memorizzati rispettivamente nella cartella Telegram Audio, Telegram
Video e Telegram Documents.
● Le informazioni relative a questi file sono memorizzate nel TDS messageMediaDocument.
34. Ricostruzione della cronologia e del contenuto dei msg
● Viene mostrato un esempio su come interpretare le informazioni memorizzate nel TDS
messageMediaDocument di tre record della tabella messages, corrispondenti a un video,
un audio e un file PDF inviato dall’utente.
35. Ricostruzione della cronologia e del contenuto dei msg
● Oltre ai file, Telegram consente agli utenti di scambiarsi informazioni sui contatti usando
messaggi non testuali. Per questo tipo di messaggi non testuali Telegram utilizza il TDS
messageMediaContact per memorizzare i dettagli relativi al contatto che è stato scambiato.
● Un esempio è mostrato nella Fig. seguente, dove record con mid = 9 corrisponde all'invio di
un contatto il cui numero di telefono è 111222333, e il cui nome e cognome sono
rispettivamente Fake e Contact.
36. Ricostruzione della cronologia e del contenuto dei msg
● L'ultimo tipo di messaggio non testuale consentito dai trasferimenti di Telegram è
l'informazione di geolocalizzazione.
● Per questo tipo di messaggi non testuali Telegram utilizza un TDS messageMediaVenue o un
TDS messageMediaGeo.
● MessageMediaGeo ha solo un campo geo e viene utilizzato quando vengono inviate solo le
coordinate geografiche, mentre messageMediaVenue ha anche campi title, address,
provider e venue_id e viene utilizzato quando viene trasferita anche una mappa .
37. Ricostruzione del registro delle chiamate vocali
● L'analisi dei risultati raccolti durante questi esperimenti mostra che i dati memorizzati nel
main database consentono di ricostruire il log delle chiamate vocali in cui l'utente è stato
coinvolto.
● Telegram memorizza un record nella tabella messages, che a sua volta memorizza nel campo
action il TDS messageActionPhoneCall contenente le identità delle parti coinvolte, la durata
della chiamata e, per le chiamate non riuscite, il motivo dell'errore.
● Come si può osservare dalla Tabella seguente, questo TDS memorizza l'identificativo della
chiamata (campo call_id), la sua durata (campo duration) e il motivo della sua cessazione
(campo reason). I TID dei partner coinvolti nella chiamata vengono invece memorizzati nei
campi from_id e to_id del TDS Message per le chiamate in uscita, mentre per le chiamate in
arrivo entrambi questi campi memorizzano il valore del chiamante (poiché il chiamante è
l'utente locale).
38. Ricostruzione del registro delle chiamate vocali
● Un esempio è mostrato in Fig. seguente, dove mostriamo i record della tabella messages
corrispondenti a quattro chiamate vocali distinte, insieme alle informazioni recuperate dai vari
campi rilevanti del TDS memorizzati nei campi data. Dai dati mostrati in Fig., è facile vedere
che i primi due record corrispondono alle chiamate in uscita verso l'utente il cui TID è
264990279, mentre gli ultimi due corrispondono alle chiamate in arrivo provenienti da
quell'utente.
39. Trattare con la cancellazione
● Nel tentativo di nascondere le interazioni fatte, l'utente può cancellare varie informazioni dal
main database.
● Nei database SQLite i record eliminati vengono mantenuti nelle cosiddette celle non allocate,
ovvero, lo spazio allocato memorizzato nel file corrispondente al database, da cui in alcuni casi
(in particolare, se SQLite Engine non ha ancora cancellato le tabelle coinvolti), possono essere
recuperati.
● Tuttavia, in generale, il tempo di persistenza di questi record è imprevedibile, in quanto
vengono eliminati in modo permanente quando il database viene sottoposto all’eliminazione,
un'operazione sotto il controllo completo di SQLite engine.
● Pertanto, sebbene la possibilità di recuperare informazioni cancellate esista in teoria, non si
può presumere che - in generale - tale recupero sia possibile per il caso specifico in questione.
40. Conclusioni
● Il paper dimostra che si è in grado estrarre tutte le informazioni sensibili
lasciate da Telegram Messenger su smartphone Android
○ Se si ha accesso alla device
○ La device con permessi root
○ oppure, senza avere permessi root, se la device ha attivato l’opzione debug USB
● Telegram concentra molta attenzione sulla sicurezza del protocollo,
ma nulla sul client
○ nessuna protezione, i dati sono in chiaro
41. Grazie per l’attenzione!
Riferimenti: Cosimo Anglano, Massimo Canonico, Marco Guazzone, “Forensic Analysis of Telegram Messenger on Android Smartphones,”
Digital Investigation, Volume 23, December 2017, Pages 31–49.