martedì 10 marzo 2026

Published marzo 10, 2026 by Django Faiola with 0 comment

Deep‑Dive Forense in Box per iOS

Indice dei contenuti

Introduzione

Box per iOS è un'applicazione gratuita sviluppata da Box, Inc., azienda statunitense specializzata in soluzioni di cloud content management e collaborazione aziendale. L’app consente di accedere, archiviare, condividere e gestire file direttamente da dispositivi iPhone e iPad, integrandosi con numerosi servizi di produttività e garantendo elevati standard di sicurezza e protezione dei dati.

Per una panoramica completa delle funzionalità dell’applicazione:
https://www.box.com

App Store:
https://apps.apple.com/it/app/box-the-power-of-content-ai/id290853822

Per lo studio di questa applicazione è stata adottata una metodologia comparativa, esaminando i dati provenienti da due scenari differenti: un'estrazione fisica di un iPhone 8 (iOS 16.7.12) con Box v5.34.1 e un backup iTunes cifrato di un iPhone SE (2nd gen) (iOS 18.5) con installata la versione più recente di Box (v5.54.0).

Percorsi

Per semplicità, nel documento verranno utilizzate le seguenti abbreviazioni:

<ADC>=/private/var/mobile/Containers/Data/Application/<UUID>/
<AGC>=/private/var/mobile/Containers/Shared/AppGroup/<UUID>/

Strutture di interesse forense:

Path File name File type
<AGC>/Library/Preferences/ group.net.box.BoxNet.plist Plist
<AGC>/Documents/db/ Item.db SQLite
<AGC>/File Provider Storage/boxpreview/<userID>/db/ PreviewItem.db SQLite
<AGC>/Documents/offlinefilesinfo/ itemIDs.plist Plist
<AGC>/Documents/offlinefilesinfo/ lastDownloadDates.plist Plist
<AGC>/File Provider Storage/boxpreview/<userID>/cache/files/<fileID>/ * Various

Profilo utente

La configurazione dell’account è memorizzata nel file di preferenze group.net.box.BoxNet.plist, situato nel percorso <AGC>/Library/Preferences/. All’interno del Plist è presente il dizionario lastUserJSON che contiene i metadati relativi all’ultimo utente autenticato sull’applicazione.

Per la visualizzazione del file è stato utilizzato dfDataViewer, il mio strumento (ancora in fase di sviluppo) per l'ispezione di formati strutturati quali Plist/BPlist, JSON/JSONB, XML/BXML, ASN.1, Protobuf e LevelDB.

Le proprietà più rilevanti presenti in lastUserJSON sono:

  • created_at2024-09-29T05:55:27-07:00 - data di creazione dell’account in ISO 8601 con fuso orario (29 settembre 2024 12:55:27).
  • logindj***@***.it - indirizzo email dell’utente.
  • namedj***@***.it - nome visualizzato.
  • has_custom_avatarFalse - indica se l’utente ha impostato un avatar personalizzato.
  • enterprisenull - tipo di account (null per account gratuito; { id: "11446498", type: "enterprise", name: "Acme Inc." }).
  • id36844*** - identificatore univoco dell’utente.
  • timezoneAmerica/Los_Angeles - fuso orario dell’account.
  • languageit - codice della lingua (ISO 639‑1).
  • max_upload_size262144000 - dimensione massima dei file caricabili in byte (262.14 MB).
  • space_amount10737418240 - quota totale in byte (10.74 GB).
  • space_used4268002649 - spazio usato in byte (4.27 GB).

Tutti i file

Il database SQLite Item.db, situato nel percorso <AGC>/Documents/db/, rappresenta l'archivio principale attraverso cui l’app Box gestisce la totalità degli elementi presenti nel cloud dell’utente. Al suo interno sono conservati i riferimenti a file e cartelle, la struttura logica che li collega e l’insieme dei metadati necessari alla sincronizzazione e alla rappresentazione dei contenuti.

L’interfaccia dell’applicazione mostra i file in una struttura ad albero, ma il database adotta un modello di archiviazione completamente flat. Ogni elemento è descritto da un record autonomo nella tabella items, mentre la gerarchia viene ricostruita tramite campi relazionali come parentID.

La figura seguente mostra la rappresentazione del campo jsonData relativo all’elemento Django.mp4, utile per comprendere la struttura interna con cui Box serializza i metadati dei singoli file.

I campi chiave di interesse sono:

  • modelID1659897439061 - identificatore univoco dell’elemento (chiave primaria).
  • type: file - tipo di elemento (file o folder).
  • name: Django.mp4 - nome del file o della cartella.
  • parentID: 286956667057 - identificatore della cartella genitore, modelID.
  • lastNetworkFetchedTimestamp: 1767015862.94753 - data e ora dell’ultima sincronizzazione con il server in Unix Epoch (29 dicembre 2025 13:44:22).
  • jsonData: struttura complessa in formato JSON utilizzata per incapsulare i metadati estesi.

All’interno di jsonData sono presenti ulteriori informazioni rilevanti quali:

  • created_at: 2024-09-29T22:05:44-07:00 - data e ora di creazione su Box in ISO 8601 con fuso orario (30 settembre 2024 05:05:44).
  • modified_at: 2024-09-29T22:05:44-07:00 - data e ora dell’ultima modifica su Box in ISO 8601 con fuso orario (30 settembre 2024 05:05:44).
  • content_created_at: 2024-06-14T01:34:17-07:00 - data e ora di creazione del documento in ISO 8601 con fuso orario (14 giugno 2024 08:34:17).
  • content_modified_at: 2024-06-14T01:34:17-07:00 - data e ora dell’ultima modifica del documento ISO 8601 con fuso orario (14 giugno 2024 08:34:17).
  • file_version.id: 1826012251061 - identificativo univoco della specifica revisione.
  • extension: mp4 - estensione del file.
  • size: 4913127 - dimensione del file in byte (4.7 MB).
  • owned_by: proprietario del file.
    • id: 36844*** - identificatore univoco del proprietario del documento.
    • login: dj***@***.it - indirizzo email dell’utente.
    • name: dj***@***.it - nome visualizzato.
  • modified_by: ultimo utente a modificare il file.
    • id: 36844*** - identificatore univoco dell'ultimo utente che ha modificato il documento.
    • login: dj***@***.it - indirizzo email dell’utente.
    • name: dj***@***.it - nome visualizzato.
  • permissions: { can_preview: 1, can_annotate: 0, can_download: 1, can_delete: 1, can_rename: 1, ..., can_share: 1, can_comment: 1} - permessi assegnati al file.
  • collections: {} - raccolte associate.
  • sha1: 33385923bb60acbc7d0bb8db96432543c2084ae7 - hash SHA1 del file.

La query seguente utilizza una CTE (Common Table Expression) ricorsiva per ricostruire l’intero albero delle directory e generare, per ogni elemento, il percorso assoluto nello spazio virtuale del cloud. Una volta ottenuti i path, la stessa query estrae dal campo jsonData tutti i metadati rilevanti, incluse estensioni, dimensioni, versioni, permessi, informazioni sul proprietario e sulle raccolte.

WITH
  RECURSIVE cte_paths(id, name, path) AS (
  SELECT
    modelID AS id,
    name,
    '/' || name AS path
  FROM items
  WHERE COALESCE(parentID, 0) = 0
  UNION ALL
  SELECT
    i.modelID AS id,
    i.name,
    p.path || '/' || i.name AS path
  FROM items AS i
  JOIN cte_paths AS p ON (i.parentID = p.id)
)

SELECT
  p.id AS "Item ID",
  i.type AS "Type",
  p.name AS "File/Folder Name",
  json_extract(i.jsonData, '$.extension') AS "Extension",
  p.path AS "Full Path",
  json_extract(i.jsonData, '$.shared_link.url') AS "Shared URL",
  json_extract(i.jsonData, '$.description') AS "Description",
  json_extract(i.jsonData, '$.size') AS "File/Folder Size",
  json_extract(i.jsonData, '$.file_version.id') AS "Version ID",
  json_extract(i.jsonData, '$.content_created_at') AS "Content Created At",
  json_extract(i.jsonData, '$.content_modified_at') AS "Content Modified At",
  json_extract(i.jsonData, '$.created_at') AS "Created At",
  json_extract(i.jsonData, '$.modified_at') AS "Modified At",
  i.lastNetworkFetchedTimestamp AS "Last Fetched At",
  CASE
    WHEN EXISTS (
      SELECT 1
      FROM json_each(i.jsonData, '$.collections')
      WHERE json_extract(json_each.value, '$.collection_type') = 'favorites'
    )
    THEN 'Yes'
    ELSE 'No'
  END AS "Favorites",
  (
    SELECT group_concat(json_extract(cn.value, '$.name'), ', ')
    FROM json_each(json_extract(i.jsonData, '$.collections')) AS cn
  ) AS "Collection Names",
  json_extract(i.jsonData, '$.owned_by.login') AS "Owner Login",
  json_extract(i.jsonData, '$.owned_by.name') AS "Owner Name",
  json_extract(i.jsonData, '$.owned_by.id') AS "Owner ID",
  json_extract(i.jsonData, '$.created_by.login') AS "Creator Login",
  json_extract(i.jsonData, '$.created_by.name') AS "Creator Name",
  json_extract(i.jsonData, '$.created_by.id') AS "Creator ID",
  json_extract(i.jsonData, '$.modified_by.login') AS "Modifier Login",
  json_extract(i.jsonData, '$.modified_by.name') AS "Modifier Name",
  json_extract(i.jsonData, '$.modified_by.id') AS "Modifier ID",
  i.SHA1,
  (
    SELECT group_concat(p.key || '=' || p.value, ', ')
    FROM json_each(json_extract(i.jsonData, '$.permissions')) AS p
  ) AS "Permissions"
FROM cte_paths AS p
LEFT JOIN items AS i ON (i.modelID = p.id)
ORDER BY i.type DESC, p.path ASC;

L’immagine seguente mostra il result set generato dalla query, con i percorsi completi ricostruiti tramite la CTE ricorsiva e i metadati estratti dal campo jsonData per ciascun elemento.

La schermata mostra i metadati del file Django.mp4 così come visualizzati nella sezione "Tutti i file" dell’area "Sfoglia" dell’app Box per iOS.

Elementi marcati offline

Gli elementi marcati come offline sono i file che l’utente ha scelto di rendere disponibili localmente sul dispositivo, così da poterli consultare anche in assenza di connettività. L’app Box per iOS non utilizza un flag esplicito nel database Item.db per indicare quali elementi siano stati resi disponibili offline. Un’analisi completa dei file potenzialmente coinvolti nella gestione di questo stato ha permesso di individuare due Plist all’interno dell’App Group Container, che risultano essere gli unici artefatti in grado di ricondurre ai file marcati come offline. I file si trovano nei seguenti percorsi:

  • <AGC>/Documents/offlinefilesinfo/itemIDs.plist
  • <AGC>/Documents/offlinefilesinfo/lastDownloadDates.plist

La figura mostra la struttura dei metadati salvati nei file itemIDs.plist e lastDownloadDates.plist, utilizzati dall’applicazione per tracciare gli elementi marcati come disponibili offline.

itemIDs.plist (a sinistra) contiene una lista di identificatori modelID che corrispondono agli elementi della tabella items marcati dall’utente come disponibili offline.

lastDownloadDates.plist (a destra) è invece strutturato come un dizionario in cui la chiave è il modelID, mentre il valore associato rappresenta il timestamp (data e ora) dell’ultimo download dell’elemento corrispondente.

L'analisi cross-artifact permette di correlare il modelID 1659897439061 presente nei Plist con l'elemento Django.mp4 identificato precedentemente in Item.db, confermandone lo stato di persistenza locale:

  • itemIDs.plist[0]: 1659897439061 - identificatore dell’elemento marcato offline.
  • lastDownloadDates.plist[1659897439061]: 30/09/2024 05:05:44 - data e ora (UTC) dell’ultimo download.

La schermata mostra la sezione "Offline" dell’area "Sfoglia", con l’elenco degli elementi che l’utente ha reso disponibili localmente sul dispositivo.

Questi artefatti sono esclusi dai backup standard di iOS e possono essere acquisiti esclusivamente tramite estrazioni di tipo Full File System.

Raccolte e preferiti

L'area "Raccolte" introduce un layer di organizzazione logica basato su tag, ortogonale alla gerarchia delle directory. Questa struttura riflette un'intenzionalità dell'utente che trascende la posizione fisica dei file, fornendo preziosi indizi sulle priorità operative del soggetto analizzato.

A differenza dei metadati strutturali, queste informazioni non risiedono in colonne dedicate della tabella items. L’app Box per iOS utilizza la lista collections, incapsulata all’interno del campo jsonData, per descrivere l’appartenenza di un elemento a uno o più raggruppamenti.

Le tipologie principali sono due:

  • "Le mie raccolte": raggruppamenti personalizzati creati dall'utente, identificati dalla chiave collection_type con valore personal.
  • "Preferiti": risorse contrassegnate come rilevanti, identificate dalla chiave collection_type con valore favorites.

La struttura di un record di collections marcato come preferito è la seguente:

  • collection_type: favorites - tipo di raccolta (Preferiti).
  • id: 24319741806 - identificatore univoco della raccolta.
  • name: Favorites - etichetta visualizzata nell'interfaccia.

Nella query utilizzata per l'estrazione di "Tutti i file" è già integrata una logica che separa le raccolte: viene generato un elenco delle etichette associate e una colonna Favorites valorizzata a Yes quando l’elemento risulta aggiunto ai Preferiti.

Commenti e annotazioni

L’analisi delle interazioni collaborative si è focalizzata sul database SQLite annotations.db,  memorizzato nel percorso <AGC>/Documents/db/.

Questo archivio gestisce due categorie principali di artefatti:

  • commenti, rappresentati come contenuti testuali associati a un file;
  • annotazioni, che includono evidenziazioni, marcature grafiche e note applicate ai documenti.

Ogni record della tabella comments rappresenta un’interazione associata a una specifica risorsa e la figura che segue mostra la rappresentazione del campo jsonData con i metadati del commento.

I campi di maggiore interesse includono:

  • id692189957 - identificatore del commento (chiave primaria).
  • fileID1659918589799 - identificatore del file o della cartella (chiave esterna), corrispondente a modelID della tabella items in Item.db.
  • createdAt1766907068 - data e ora di creazione in Unix Epoch (28 dicembre 2025 07:31:08).
  • networkFetchedAt1766909060.58597 - data e ora dell’ultima sincronizzazione con il server in Unix Epoch (28 dicembre 2025 08:04:20).
  • jsonData: struttura JSON contenente i metadati principali.
    • modified_at: 2025-12-28T07:31:08Z - data e ora dell’ultima modifica in ISO 8601 Zulu (28 dicembre 2025 07:31:08).
    • message: Week 29 - 2025 - This Week In 4n6 - testo del commento.
    • created_by: metadati dell'autore del commento.
      • id36844*** - identificatore univoco.
      • logindj***@***.it - login
      • namedj***@***.it - nome visualizzato.
    • tagged_message: null - stringa contenente le eventuali menzioni; le @mention sono formattate come @[id:username].

Oltre ai commenti testuali, Box gestisce le annotazioni grafiche come entità distinte nella tabella annotations. I campi principali includono:  

  • id28238507280 - identificatore dell'annotazione (chiave primaria).
  • createdAt1766909509 - data e ora di creazione in Unix Epoch (28 dicembre 2025 08:11:49).
  • modifiedAt1766909509 - data e ora dell'ultima modifica in Unix Epoch (28 dicembre 2025 08:11:49).
  • networkFetchedAt1769438782.542 - data e ora dell’ultima sincronizzazione con il server in Unix Epoch (26 gennaio 2026 14:46:22).
  • createdByJSONData: struttura JSON con i metadati dell'autore.
    • id: 36844*** - identificatore univoco dell'autore.
    • login: dj***@***.it - login.
    • name: dj***@***.it - nome visualizzato.
  • modifiedByJSONData: struttura JSON con i metadati dell'ultimo utente a modificare l'annotazione.
    • id36844*** - identificatore univoco dell'utente.
    • logindj***@***.it - login.
    • namedj***@***.it - nome visualizzato.
  • descriptionJSONData: struttura JSON con i metadati dell'annotazione.
    • messagela 0.3.5 è vecchia, la versione corrente è la 0.4.1 - testo dell'annotazione.

Entrambe le tipologie vengono aggregate tramite una tabella di raccordo denominata fileActivity che centralizza le informazioni relative a commenti e annotazioni associate ai singoli file.

I campi del database sono i seguenti:

  • createdAt1766909509 - data e ora di creazione dell'attività in Unix Epoch (28 dicembre 2025 08:11:49).
  • id28238507280 - identificativo univoco dell'attività.
  • typeannotation - tipo di attività (comment o annotation).
  • fileId1659918589799identificatore del file o della cartella corrispondente a modelID della tabella items in Item.db.

La seguente query consente di aggregare in un’unica vista le attività associate ai file, includendo sia commenti sia annotazioni grafiche, sfruttando la tabella di raccordo fileActivity.

SELECT
  datetime(fa.createdAt, 'unixepoch') AS "Created At",
  fa.id,
  fa.type,
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.modified_at')
    WHEN fa.type = 'annotation' THEN datetime(a.modifiedAt, 'unixepoch')
    ELSE NULL
  END AS "Modified At",
  fa.fileID,
  i.name,
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.message')
    WHEN fa.type = 'annotation' THEN json_extract(a.descriptionJSONData, '$.message')
    ELSE NULL
  END AS "Message",
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.tagged_message')
    ELSE ''
  END AS "Tagged Message",
  CASE
    WHEN fa.type = 'comment' THEN c.isReply
    ELSE NULL
  END AS "isReply",
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.created_by.login')
    WHEN fa.type = 'annotation' THEN json_extract(a.createdByJSONData, '$.login')
    ELSE NULL
  END AS "Creator Login",
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.created_by.name')
    WHEN fa.type = 'annotation' THEN json_extract(a.createdByJSONData, '$.name')
    ELSE NULL
  END AS "Creator Name",
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.created_by.id')
    WHEN fa.type = 'annotation' THEN json_extract(a.createdByJSONData, '$.id')
    ELSE NULL
  END AS "Creator ID",
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.modified_by.login')
    WHEN fa.type = 'annotation' THEN json_extract(a.modifiedByJSONData,'$.login')
    ELSE NULL
  END AS "Modifier Login",
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.modified_by.name')
    WHEN fa.type = 'annotation' THEN json_extract(a.modifiedByJSONData, '$.name')
    ELSE NULL
  END AS "Modifier Name",
  CASE
    WHEN fa.type = 'comment' THEN json_extract(c.jsonData, '$.modified_by.id')
    WHEN fa.type = 'annotation' THEN json_extract(a.modifiedByJSONData, '$.id')
    ELSE NULL
  END AS "Modifier ID",
  datetime(fa.networkFetchedAt, 'unixepoch') AS "Fetched At"
FROM fileActivity AS fa
LEFT JOIN comments AS c ON (fa.id = c.id)
LEFT JOIN annotations AS a ON (fa.id = a.id)
LEFT JOIN items AS i ON (fa.fileID = i.modelID)
ORDER BY i.name, fa.createdAt

La query di aggregazione produce un result set unificato che include tutte le attività associate ai file, siano esse commenti o annotazioni grafiche.

L'analisi di annotations.db permette di ricostruire non solo la cronologia delle modifiche, ma il vero e proprio flusso comunicativo tra gli utenti. La capacità di correlare annotazioni grafiche e commenti testuali a uno specifico modelID fornisce un quadro completo della collaborazione su ogni singolo asset digitale.

Lo screenshot dell’interfaccia mostra la sezione "Attività" relativa al file selezionato. I commenti sono evidenziati da un bordo giallo, mentre le annotazioni sono contrassegnate da un bordo rosso.

Anteprime e originali

Box non genera una singola miniatura per ciascun file, ma mantiene più rappresentazioni in formati e dimensioni differenti, ottimizzate per le varie esigenze dell’interfaccia (anteprima rapida, vista elenco, griglia, dettaglio del file, ecc.). La gestione di queste rappresentazioni è affidata al database SQLite PreviewItem.db memorizzato nel percorso <AGC>/File Provider Storage/ boxpreview/<userID>/db/. Questo archivio contiene i metadati relativi alle miniature e alle anteprime incluse le informazioni sulle versioni, sulle dimensioni disponibili e sui riferimenti ai file locali utilizzati dall’app per la visualizzazione.

La figura che segue mostra una tipica rappresentazione del campo representations, nello specifico quella relativa all'elemento Django.mp4.

I campi di interesse sono presenti nella tabella previewItems:

  • fileID1659897439061 - identificatore dell'elemento (chiave esterna), corrispondente a modelID della tabella items in Item.db.
  • name: Django.mp4 - nome del file.
  • dataDictionary: <plist> - i metadati in formato Plist.
  • lastAccessedDate1768715535.43314 - data e ora dell’ultima apertura o visualizzazione in Unix Epoch (18 gennaio 2026 05:52:15).
  • sha133385923bb60acbc7d0bb8db96432543c2084ae7 - hash SHA1 del file.
  • representations: struttura JSON che definisce le diverse varianti dell'asset.
    • properties.dimensions: 320x320 - indica la risoluzione dell’asset generato.
    • properties.paged: false - specifica se l’anteprima si riferisce a un documento multipagina (PDF/Word) o a un file singolo (immagini/video).
    • representation: jpg - indica il tipo di file.
    • content.url_template: https://public.boxcloud.com/api/2.0/internal_files/1659897439061/versions/1826012251061/representations/jpg_320x320/ content/{+asset_path} - definisce l'endpoint remoto per il download della risorsa. La struttura della stringa include il parametro versions/1826012251061; identificatore univoco della versione del documento scaricata e consultata.
La query di seguito mostra come estrarre tutte le rappresentazioni di un file insieme ai relativi metadati, come dimensioni, tipo, versione, data dell’ultimo accesso e hash del file originale.
SELECT
  p.fileID AS "Item ID",
  p.name AS "File Name",
  json_extract(e.value, '$.properties.dimensions') AS "Preview Dimensions",
  LOWER(json_extract(e.value, '$.representation')) AS "Preview Extension",
  TRIM(
    SUBSTR(
      json_extract(e.value, '$.info.url'),
      INSTR(json_extract(e.value, '$.info.url'), 'versions/') + 9,
      INSTR(SUBSTR(json_extract(e.value, '$.info.url'), INSTR(json_extract(e.value, '$.info.url'), 'versions/') + 9), '/') - 1
    )
  ) AS "Version ID",
  datetime(p.lastAccessedDate, 'unixepoch') AS "Last Accessed At",
  p.sha1 AS "Original SHA1"
FROM previewItems AS p
JOIN json_each(p.representations, '$.entries') AS e
ORDER BY p.lastAccessedDate DESC, p.fileID, LENGTH("Preview Dimensions") DESC, "Preview Dimensions" DESC

L'immagine che segue mostra il result set con i dati estratti dalla query sulle rappresentazioni dei file. Si osservano chiaramente diverse dimensioni delle anteprime, il tipo di file (estensione), l'identificativo della versione, la data dell'ultimo accesso e l'hash SHA1 originale associato a ciascun elemento. 

L'archiviazione fisica delle anteprime non risiede nel database ma è organizzata in file distribuiti nei percorsi:
<AGC>/File Provider Storage/boxpreview/<userID>/cache/files/<fileID>/

Come evidenziato dalla struttura del percorso, <userID> identifica l’account dell’utente, mentre <fileID> corrisponde all’identificativo univoco del file, equivalente al valore modelID presente nella tabella items del database Item.db.

All'interno della directory <fileID> si distinguono due tipi di contenuto:

  • File originali: situati nella sottocartella "original/", mantengono nome ed estensione originali.
  • Anteprime e miniature: organizzate in cartelle denominate secondo il formato e la risoluzione "<extension>_<dimensions>/" (es. jpg_1024x1024/).

Le ricostruzioni dei percorsi relativi alla miniatura (riga 25 nei risultati della query) e al file originale del video Django.mp4 sono ottenute a partire dalla directory:
<AGC>/File Provider Storage/boxpreview/36844***/cache/files/1659897439061/

I due riferimenti risultanti sono:

  • jpg_1024x1024/Django.mp4
  • original/Django.mp4

Si osserva che, nel caso della miniatura, il nome del file non presenta l’estensione .jpg, pur essendo un’immagine generata dal sistema. 

L'immagine che segue mostra la rappresentazione della miniatura oggetto dell’analisi generata automaticamente dal sistema e archiviata nella cartella delle anteprime.

Recenti

La ricostruzione delle attività utente nell’app Box per iOS si basa sull’analisi del database SQLite Recents.db, localizzato nell'App Group Container in "/Documents/db/". Questo archivio registra le interazioni effettive dell’utente, tra cui visualizzazioni, modifiche e caricamenti, seguendo la struttura dell’endpoint Recent Items.

Ogni record della tabella recents rappresenta un’interazione e include i seguenti campi di interesse:

  • itemID1659897439061 - identificatore dell’interazione (chiave esterna), corrispondente a modelID della tabella items in Item.db.
  • interactionTimeStamp1766557059 - data e ora dell’ultima apertura o visualizzazione in Unix Epoch (24 dicembre 2025 06:17:39).
  • itemTypefile - tipo di elemento (file o folder).
  • interactionTypeitem_preview - tipo di interazione dell’utente (es. item_preview, item_upload, item_comment e item_open).
  • interaction_shared_linknull - se l’elemento è stato visualizzato tramite un collegamento condiviso contiene il link.
SELECT
  datetime(r.interactionTimeStamp, 'unixepoch') AS "Interaction Timestamp",
  r.itemType,
  i.name AS "File name",
  json_extract(i.jsonData, '$.size') AS "File Size",
  r.interactionType AS "Interaction Type",
  r.sharedLinkURL AS "Shared Link URL",
  r.itemID
FROM recents AS r
LEFT JOIN items AS i ON (r.itemID = i.modelID)

Lo screenshot dell’interfaccia mostra la sezione Recenti dell'area Sfoglia.

iLEAPP 💖

Come di consueto, a supporto del progetto iLEAPP (iOS Logs, Events, And Plists Parser) di Alexis Brignoni, ho sviluppato il plugin box.py. Il modulo automatizza l'estrazione e la correlazione di tutti i database e i plist analizzati in questo articolo, normalizzando i dati in un formato pronto per l'analisi forense.

Il plugin è attualmente in fase di "pull request" e comunque disponibile per il download e il testing sul mio GitHub.

Di seguito, alcuni screenshot dell'output generato dal report di Box:







0 comments:

Posta un commento