Recupero di dati cancellati da SQLite: Navigazione nella catena dei blocchi liberi

Introduzione

I database SQLite sono un tesoro di prove digitali che si trovano in molte applicazioni, dai messaggi di chat ai registri delle transazioni. Ma cosa succede quando i record vengono cancellati? Entrare blocchi liberi-Sezioni nascoste di spazio inutilizzato all'interno di pagine di database che conservano resti di dati eliminati. Questi blocchi liberi sono una miniera d'oro per gli investigatori forensi, in quanto consentono di recuperare record critici e di scoprire prove nascoste.

Questo blog demistifica i blocchi liberi di SQLite, spiegando come funzionano, come individuarli con strumenti come gli editor esadecimali e come recuperare i record cancellati. Che siate investigatori o appassionati di digital forensics, questa guida vi fornirà le tecniche essenziali per estrarre i dati nascosti.

Cosa sono i blocchi liberi in SQLite?

I freeblock sono sezioni di spazio inutilizzato all'interno di una pagina di database SQLite. Quando un record viene cancellato, lo spazio corrispondente non viene sovrascritto immediatamente, a meno che non sia abilitato un meccanismo di cancellazione sicura. Invece, viene contrassegnato come spazio blocco libero, disponibile per future scritture.

In questo processo:

  • Il puntatore al record cancellato viene rimosso.
  • L'intestazione della pagina viene aggiornata per riflettere la rimozione.
  • Se applicabile, viene regolato l'offset che punta al primo blocco libero.

 

Questi blocchi liberi spesso conservano resti dei dati originali, il che li rende un punto critico per gli investigatori forensi che mirano a recuperare i record cancellati.

Esempio:

Nella schermata seguente, esaminiamo un database SQLite utilizzando DB Browser. La tabella "messaggi" mostra due record attivi, ma gli indizi della scientifica suggeriscono la presenza di altri record eliminati.

Come si inseriscono i blocchi liberi nelle intestazioni di pagina di SQLite

Per individuare e analizzare i freeblock, occorre innanzitutto comprendere la struttura delle pagine del database SQLite. Ogni pagina contiene un'intestazione che fornisce metadati critici, compresi i puntatori ai freeblock.

La tabella seguente illustra la struttura dell'intestazione per un tipo di pagina 0D:

Offset Dimensione Descrizione
0 1 Byte Tipo di pagina
1 2 Byte Byte di offset al primo blocco libero
3 2 Byte Numero di celle nella pagina
5 2 Byte Offset al primo byte del contenuto della cella
7 1 Byte Numero di byte liberi frammentati nelle celle

Il risultato principale:

Il valore dell'offset 1 nell'intestazione della pagina indica il primo blocco libero. Se questo valore è 0x0000, non ci sono blocchi liberi nella pagina.

Usare gli editor esadecimali per analizzare i blocchi liberi

Per individuare il primo blocco libero, apriamo il database in un editor esadecimale. Il valore di due byte all'offset 1 dell'intestazione della pagina fornisce l'offset della posizione del blocco libero.

Nell'esempio seguente:

  • L'editor esadecimale evidenzia l'offset 0x03A9 (decimale 937) in rosso, che indica la posizione del primo blocco libero.

Navigando verso questo offset si scopre l'inizio del blocco libero. Di seguito, esaminiamo la cella situata all'offset 937.

Decodifica delle intestazioni Freeblock

Ogni blocco libero contiene un'intestazione di quattro byte che comprende:

  1. Primi 2 byte: Offset al blocco libero successivo (0x0000 se non esiste).
  2. Secondo 2 byte: Dimensione totale del blocco libero, compresa l'intestazione stessa.

Esempio:

All'offset 0x03A9, l'intestazione del blocco libero indica:

  • Il prossimo blocco libero si trova all'offset 0x03EA (decimale 1002).
  • La dimensione del blocco libero è 0x0024 (36 byte, compresa l'intestazione).

Recupero dei record cancellati usando i blocchi liberi

I freeblock spesso contengono resti di record eliminati, consentendo agli investigatori forensi di recuperare dati parziali o completi. Nell'immagine seguente, il payload di un record cancellato è intatto e recuperabile nonostante il suo puntatore sia stato rimosso.

Esempio:

  • Il record cancellato all'offset 0x03A9 contiene il messaggio: "Non molto. Come stai?"
  • I campi chiave rimangono intatti, compreso il contenuto del messaggio, anche se altri metadati sono stati sovrascritti.

Analizziamo i freeblock successivi per scoprire altri record cancellati. All'offset 0x03EA, la testata del blocco libero rivela:

  • La dimensione del blocco libero è 0x0016 (22 byte).
  • Questo è l'ultimo blocco libero della catena, come indicato da 0x0000 nel campo del puntatore al blocco libero successivo.

L'immagine seguente evidenzia l'intera area della cella del secondo blocco libero della catena in cui il messaggio cancellato era "Ciao Andy!".

Identificazione di ulteriori record eliminati

Ma si dà il caso che ci sia un altro record cancellato in questa pagina non referenziato dalla catena di freeblock. Guardando all'intestazione della pagina, c'erano solo 2 record in questa pagina, secondo il valore a due byte all'offset 3 (0x00002). Poiché ci sono solo due record, ci sono solo due puntatori nell'array di puntatori. Questi due puntatori puntano al record #2 - "Ehi, come va?" e al record #4 - "Ehi, mi chiedevo se hai degli Scooby snax". Si può notare che c'è un altro lungo messaggio situato più in alto nella pagina.

Il valore di due byte all'offset 5 nell'intestazione della pagina è l'offset dell'area del contenuto della cella, in pratica dove verrebbe scritto il record successivo, a meno che non possa essere inserito in uno dei blocchi liberi. Questo valore è 0x0363 che corrisponde all'offset decimale 867.

La freccia nella schermata precedente punta all'offset di pagina 867. Questo è l'inizio del contenuto della cella, il che significa che il record successivo verrà aggiunto appena sopra questo record. Il record cancellato sopra di esso contiene il messaggio "Mi è capitato di ricevere una nuova fornitura ieri sera. Siete fortunati. Di quanto hai bisogno?".

Il database considera questi dati come spazio non allocato. Potrebbe anche essere riempito con 0x00 poiché nell'array di puntatori non c'è alcun puntatore che lo indirizzi. 

Se un record troppo grande per rientrare nei due blocchi liberi della pagina viene aggiunto alla tabella a cui appartiene questa pagina, sovrascriverà il messaggio, che è il record #5. 

Vediamo come appare ora che abbiamo identificato i due freeblock e il terzo record cancellato che attende di essere sovrascritto:

Dopo aver analizzato il database nel suo formato grezzo, possiamo concludere che conteneva più dei 2 record "live" visualizzati dal visualizzatore del database. 

Il record #1 era probabilmente il messaggio "Ciao Andy!", mentre il record #3 era probabilmente il messaggio "Non molto. Come stai?". Il record #5 ha ancora il suo numero di record all'interno della cella identificata come il messaggio: "Ieri sera ho ricevuto una nuova fornitura. Sei fortunato. Quanto le serve?".

 

Conclusione

I blocchi liberi sono uno strumento potente nelle indagini forensi, in quanto offrono una finestra sui record cancellati e sui dati non allocati. Padroneggiando queste tecniche, gli investigatori possono scoprire le tracce digitali lasciate dai database.

Siete pronti a portare le vostre competenze forensi su SQLite al livello successivo? Esplorate i nostri programmi di formazione avanzata o contattateci per sapere come possiamo aiutarvi a diventare esperti forensi.

Facebook
Twitter
Email
Stampa

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *