giovedì 8 febbraio 2024

Published febbraio 08, 2024 by Django Faiola with 0 comment

iOS WAZE

Introduzione

Waze è un’applicazione mobile di navigazione stradale gratuita per iOS e Android basata sul concetto di crowdsourcing, inizialmente sviluppata dalla start-up israeliana Waze Mobile e dal 2013 proprietà di Google. Grazie agli utenti, Waze è in grado di fornire aggiornamenti sul traffico o altri avvenimenti in tempo reale. Per maggiori dettagli sulle funzionalità dell'app consulta https://www.waze.comDal punto di vista forense l'app conserva una buona quantità di dati che possono essere utilizzati come prova.

App Store: https://apps.apple.com/it/app/waze-gps-e-traffico-live/id323229106

Percorsi

Di seguito lo stralcio di Waze del poster della SANS “iOS Third-Party Apps Forensics Reference Guide Poster” con le informazioni più rilevanti per l’analisi dell’app.


Analisi degli artefatti

Per lo studio di questa app ho utilizzato una delle immagini pubbliche di iOS note nel settore e in particolare quella di Josh Hickman iOS 15.3.1 disponibile su DigitalCorporaLa versione di Waze è 4.94.0.3.

Tutti i valori data e ora (timestamp) sono riferiti al tempo UTC e nel formato Unix Epoch che conta il numero di secondi dal 1 gennaio del 1970. Le coordinate sono registrate come valori interi longitudine,latitudinePer esempio la coordinata -78828778,35658493 rappresenta:

  • -78828778 / 100000 = -78.828778 (longitudine)
  • 35658493 / 100000 = 35.658493 (latitudine)

La coordinata finale nel formato latitudine,longitudine è 35.658493,-78.828778.

Alcuni dati mostrati di seguito non contengono i valori originali presenti nei file dell'immagine, sono stati modificati con valori fittizi per una questione di privacy. 

user è un file di testo che contiene le informazioni dell'utente come username, nome, cognome, data e ora del primo avvio, ultima versione aggiornata etc. Le righe sono scritte nel formato "categoria.campo: valore"  senza doppi apici (es: General.First use: 1684547054).

Identificazione dell'account:

  • Realtime.Nickname: dj (nickname);
  • Realtime.Nameusa_df02qthz (username);
  • Realtime.FirstNameDjango (nome);
  • Realtime.LastNameFaiola (cognome);
  • Realtime.PersistentId1|global|1780009754 (identificatore);
  • General.First use1684547054 (primo utilizzo: 20 maggio 2023 01:44:14).

session è un file di testo dove le righe hanno lo stesso formato appena descritto. Questo file contiene le informazioni relative all'ultima sessione attiva: data e ora dell'ultima sincronizzazione, coordinate dell'ultima posizione e le coordinate e indirizzo dell'ultima destinazione.

  • Config.Last synced1684603053991 (ultima sincronizzazione in millisecondi: 20 maggio 2023 17:17:33);
  • GPS.Position-78828778,35658493 (ultima posizione: latitudine=35.658493, longitudine=-78.828778);
  • Navigation.Last position-78829105,35657631 (ultima posizione di navigazione: latitudine=35.657631, longitudine=-78.829105);
  • Navigation.Last dest nameJones Park (destinazione);
  • Navigation.Last dest stateNorth Carolina (regione/stato);
  • Navigation.Last dest citySchool Days Ln (città);
  • Navigation.Last dest streetSchool Days Ln (via);
  • Navigation.Last dest number405 (numero civico).

user.db è il database principale che contiene le tabelle con i luoghi ricercati, preferiti, condivisi e recenti.

Di seguito un dettaglio non esaustivo delle tabelle di interesse:

PLACES (ricercati)

  • id: chiave primaria;
  • name: nome;
  • street: via;
  • city: città;
  • state: regione/stato;
  • country: codice paese;
  • house: numero civico;
  • longitude: longitudine;
  • latitude: latitudine;
  • created_time: data e ora di creazione.

RECENTS (recenti)
  • id: chiave primaria;
  • place_id: chiave esterna del luogo (id della tabella PLACES);
  • name: nome del luogo;
  • created_time: data e ora di creazione;
  • access_time: data e ora dell'ultimo accesso.

FAVORITES (preferiti)

  • id: chiave primaria;
  • place_id: chiave esterna del luogo (id della tabella PLACES);
  • name: nome del luogo;
  • created_time: data e ora di creazione;
  • modified_time: data e ora dell'ultima modifica;
  • access_time: data e ora dell'ultimo accesso.

SHARED_PLACES (condivisi)

  • id: chiave primaria;
  • place_id: chiave esterna del luogo (id della tabella PLACES);
  • name: nome del luogo;
  • created_time: data e ora di creazione;
  • access_time: data e ora dell'ultimo accesso;
  • share_time: data e ora di condivisione;
  • modified_time: data e ora dell'ultima modifica.

spdlog.*logdata

Questi file sono presenti in Internal App Path "/Documents/" e contengono un enorme quantità di informazioni, utili? dipende. Nella versione 4.75.0.0 di Waze questi log non sono presenti.

Dalla prima riga del log

[13:17:22.381 (none) (0x0000000) 592256 2614 warning] *** 4.94.0.3 (-) Starting at 20/05/2023 13:17 ***

è possibile estrapolare sia la versione dell'app "4.94.0.3" che la data e ora di inizio "20/05/2023 13:17" del log stesso.

Ispezionando questi log alla ricerca di potenziali tracce sulle posizioni in tempo reale, la mia attenzione è stata catturata dall'evento GPS_QUALITY della funzione (track_gps_quality).

[13:19:34.181 (usa_df02qthz) (0x0000000) 592256 2614 warning] STAT(buffer#1) GPS_QUALITY {LAT=35656548}{LON=-78834964}{SAMPLE_COUNT=121}{BAD_SAMPLE_COUNT=0}{ACC_AVG=8}{ACC_MIN=6}{ACC_MAX=32}{PROVIDER=GPS}{TIMESTAMP_MS=1684603174181}{TIMESTAMP=1684603174}

[location.cc:459 (track_gps_quality)]

L'orario del TIMESTAMP_MS=1684603174181 (20 maggio 2023 17:19:34.181) è diverso da quello della riga 13:19:34.181, c'è un offset di -4 ore rispetto al tempo UTC, quindi i log sono scritti in ora locale.

Questa "STAT(buffer#1) GPS_QUALITY" è una diagnostica della qualità della posizione GPS e ha una frequenza di circa 2 minuti. Su questi campioni {SAMPLE_COUNT=121} è calcolata l'accuratezza media della posizione {ACC_AVG=8} con un intervallo di {ACC_MIN=6} - {ACC_MAX=32} e dati provenienti dal fornitore {PROVIDER=GPS}. Inoltre ho una latitudine {LAT=35656548} e una longitudine {LON=-78834964} al tempo UTC in millisecondi {TIMESTAMP_MS=1684603174181}.

Ora la domanda è, quando inizia questo tracciamento? Sempre da un'ispezione visiva dei log è possibile verificare che questo evento è conseguenziale a quello del NAVIGATE, ovvero poco dopo l'avvio della navigazione. 

Dalla documentazione dell'immagine iOS 15 di Josh Hickman si può vedere che sono state impostate tre navigazioni:

  1. Holly Springs: inizio alle 11:43 e fine alle 11:51
  2. Wallgreens: inizio alle 13:04  e fine alle 13:11
  3. Jones Park: inizio alle 13:18 e fine alle 13:22

spdlog.3.logdata (Holly Springs)

riga 875 (inizio navigazione): [11:42:04.504 (usa_df02qthz) (0x0000000) 572598 2484 warning] STAT(buffer#1) NAVIGATE {SOURCE=MAP}{TIMESTAMP_MS=1684597324504}{TIMESTAMP=1684597324}

riga 1164 (il primo GPS_QUALITY): [11:43:07.178 (usa_df02qthz) (0x0000000) 572598 2484 warning] STAT(buffer#1) GPS_QUALITY {LAT=35665692}{LON=-78835049}{SAMPLE_COUNT=120}{BAD_SAMPLE_COUNT=0}{ACC_AVG=30}{ACC_MIN=12}{ACC_MAX=48}{PROVIDER=GPS}{TIMESTAMP_MS=1684597387178}{TIMESTAMP=1684597387}

spdlog.2.logdata (Wallgreens)

riga 7049 (inizio navigazione): [13:04:02.991 (usa_df02qthz) (0x0000000) 586193 2557 warning] STAT(buffer#1) NAVIGATE {SOURCE=MAP}{TIMESTAMP_MS=1684602242991}{TIMESTAMP=1684602242}

riga 7168 (GPS_QUALITY): [13:05:15.182 (usa_df02qthz) (0x0000000) 586193 2557 warning] STAT(buffer#1) GPS_QUALITY {LAT=35660814}{LON=-78869167}{SAMPLE_COUNT=121}{BAD_SAMPLE_COUNT=0}{ACC_AVG=9}{ACC_MIN=6}{ACC_MAX=12}{PROVIDER=GPS}{TIMESTAMP_MS=1684602315182}{TIMESTAMP=1684602315}

spdlog.1.logdata (Jones Park)

riga 7101 (inizio navigazione): [13:18:19.683 (usa_df02qthz) (0x0000000) 592256 2614 warning] STAT(buffer#1) NAVIGATE {SOURCE=MAP}{TIMESTAMP_MS=1684603099683}{TIMESTAMP=1684603099}

riga 7353 (GPS_QUALITY): [13:19:34.181 (usa_df02qthz) (0x0000000) 592256 2614 warning] STAT(buffer#1) GPS_QUALITY {LAT=35656548}{LON=-78834964}{SAMPLE_COUNT=121}{BAD_SAMPLE_COUNT=0}{ACC_AVG=8}{ACC_MIN=6}{ACC_MAX=32}{PROVIDER=GPS}{TIMESTAMP_MS=1684603174181}{TIMESTAMP=1684603174}

Queste posizioni possono rappresentare un potenziale tracciato della navigazione. Utilizzando i dati presenti nel database tts.db (Text-To-Speech) che contiene le indicazioni stradali delle navigazioni è possibile ricostruire un percorso più dettagliato cercando di colmare le lacune dei 2 minuti.

tts.db (Text-To-Speech)

Questo database tts.db si trova in Internal App Path "/Library/Caches/tts/" e contiene la trascrizione dell'assistente vocale durante la navigazione con i relativi timestamp. Per ogni voce esiste una tabella con il relativo nome (es: Jane, Ben, Sarah, etc.).

  • text: testo dell'assistente vocale;
  • data: blob con audio; 
  • path: percorso locale (device) del file audio;
  • storage_type: 0=none, 1=blob, 2=file, 3=blob e file;
  • text_type: 0=default, 1=in viaggio?, 2=partenza?, 3=arrivo?;
  • update_time: data e ora dell'aggiornamento.

Plugin per iLEAPP

Al fine di facilitare l'analisi di Waze per iOS ho sviluppato un plugin per iLEAPP (iOS Logs, Events, And Plists Parser) di Alexis Brignoni. Alla data di pubblicazione il plugin è in “pull request” e comunque disponibile sul mio GitHub.

Di seguito alcuni screenshot del report di Waze:


0 comments:

Posta un commento