File system · Lezione 2 di 8
Come i file system memorizzano i dati: cluster, allocazione, slack e spazio non allocato
12 min di lettura
Un file system trasforma i settori grezzi di un volume in file dotati di nome. Memorizza il contenuto in unità di dimensione fissa, registra quali unità sono in uso e conserva metadati e nomi in strutture separate, ciascuna delle quali può sopravvivere o essere cancellata indipendentemente dalle altre. Comprendere questo funzionamento consente a un esaminatore di spiegare perché un file eliminato è recuperabile, da dove proviene un vecchio frammento e che cosa tale frammento può e non può dimostrare. Le lezioni successive applicano questo modello a NTFS, FAT, ext4 e APFS.
Un quadro di ragionamento: le cinque categorie di Carrier
Brian Carrier (Analisi forense dei file system, 2005) suddivide i dati dei file system in cinque categorie. Il modello si applica a ogni file system e induce a chiedersi a quale categoria appartenga un elemento di prova.
| Categoria | Che cosa contiene | Esempi |
|---|---|---|
| File system | Organizzazione e dimensione del file system nel suo complesso | Settore di avvio NTFS, settore di avvio FAT (BPB), superblocco ext4 |
| Contenuto | Le unità di dati che contengono il contenuto dei file e il loro stato di allocazione | Cluster o blocchi, $Bitmap di NTFS, bitmap dei blocchi ext4 |
| Metadati | Dati che descrivono un file: dimensione, timestamp, proprietario, posizione in cui è memorizzato il contenuto | Record MFT di NTFS, inode ext4, campi dei metadati di una voce di directory FAT |
| Nome del file | Nomi e directory che associano i nomi ai metadati | Indici di directory $I30 di NTFS, voci di directory ext4, campi dei nomi FAT |
| Applicazione | Funzionalità di cui il file system non ha bisogno per memorizzare i file | $LogFile e $UsnJrnl di NTFS, journal ext4, quote disco |
Le categorie possono subire alterazioni indipendentemente le une dalle altre. Un nome può sopravvivere dopo che la relativa voce dei metadati è stata riutilizzata, una voce dei metadati può puntare a cluster che ora appartengono a un altro file e il contenuto può sopravvivere senza nome né metadati. Molti errori nelle relazioni derivano dal trattare le evidenze di una categoria come prova di qualcosa che riguarda un'altra categoria.
Cluster, blocchi e unità di allocazione
Un disco viene indirizzato per settori, solitamente di 512 byte (alcune unità utilizzano settori da 4.096 byte; le unità "512e" presentano settori logici da 512 byte su settori fisici da 4.096 byte). Un file system raggruppa un numero fisso di settori consecutivi in un cluster (FAT, exFAT e NTFS), un blocco (ext4) o, genericamente, un'unità di allocazione. La dimensione viene impostata al momento della formattazione e registrata nella categoria file system. In NTFS, il settore di avvio memorizza il numero di byte per settore all'offset 0x0B e il numero di settori per cluster all'offset 0x0D. I volumi NTFS utilizzano comunemente cluster da 4.096 byte ed ext4 utilizza comunemente blocchi da 4.096 byte.
Il cluster è l'unità più piccola che un file system può assegnare a un file, perché le strutture di allocazione registrano uno stato per ogni cluster; registrare lo stato di ciascun settore o byte le renderebbe molto più grandi e lente. Un file occupa quindi un numero intero di cluster, anche quando è lungo un solo byte. La sua dimensione logica è il numero di byte contenuti nel file. La sua dimensione fisica (allocata) è il numero di cluster × la dimensione del cluster. La differenza costituisce lo slack del file.
NTFS prevede un'eccezione. Un file molto piccolo può essere memorizzato come residente, all'interno del proprio record MFT, e in tal caso non utilizza alcun cluster. La lezione 1.3 tratta i dati residenti.
Strutture di allocazione
Ogni file system registra quali cluster sono in uso:
- NTFS utilizza
$Bitmap(record MFT 6), che contiene un bit per cluster (1 = allocato). L'utilizzo dei record MFT viene tracciato separatamente, nell'attributo$BITMAPdi$MFTe nel flag di utilizzo (0x0001) nell'intestazione di ciascun record. - FAT12/16/32 utilizzano la tabella di allocazione dei file, che contiene una voce per cluster. 0 significa libero; gli altri valori indicano il cluster successivo nella catena, la fine della catena o un cluster danneggiato. Le voci FAT32 sono larghe 32 bit e vengono utilizzati i 28 bit meno significativi. In FAT, la tabella funge sia da mappa di allocazione sia da registro della posizione in cui è memorizzato il contenuto di ciascun file.
- exFAT utilizza una bitmap di allocazione e impiega la FAT principalmente per i file frammentati.
- ext4 utilizza bitmap dei blocchi e bitmap degli inode per ciascun gruppo di blocchi.
Che cosa comporta solitamente l'"eliminazione" di un file
Nella maggior parte dei file system, eliminare un file modifica lo stato di allocazione. Non cancella il contenuto. Risultati tipici:
- NTFS: il flag di utilizzo nel record MFT viene azzerato, i bit del file in
$Bitmapvengono impostati a 0 e la voce viene rimossa dall'indice della directory padre. Il record conserva solitamente i propri attributi, timestamp e sequenze di dati fino al riutilizzo. - FAT: il primo byte della voce di directory viene impostato a 0xE5 e la catena del file nella FAT viene impostata a 0 (libera). La voce di directory conserva solitamente la dimensione e il cluster iniziale (in FAT32 alcune implementazioni ne azzerano i 16 bit più significativi), ma la catena che collega i cluster rimanenti va perduta.
- ext3/ext4: l'inode e i relativi blocchi vengono contrassegnati come liberi. In genere vengono cancellate anche le informazioni sulla posizione dei blocchi contenute nell'inode, rendendo più difficile il recupero tramite i metadati.
In ogni caso, il contenuto rimane nei cluster finché non viene sovrascritto. Nelle unità a stato solido, TRIM può far sì che i blocchi liberati restituiscano zeri in lettura anche se non vi è stato scritto nulla di nuovo. La lezione 1.8 confronta il recupero tramite i metadati con il file carving.
Frammentazione
Un file è frammentato quando i suoi cluster non sono contigui; NTFS registra le parti come sequenze di dati e FAT come collegamenti nella catena dei cluster. Con metadati integri questo non costituisce un problema, perché ogni sequenza è elencata. Senza metadati, invece, lo è: uno strumento di carving che presuppone la contiguità unirà al primo frammento cluster non correlati.
Slack del file: RAM slack e drive slack
Lo slack del file (detto anche slack del cluster) è lo spazio compreso tra la fine della dimensione logica di un file e la fine del suo ultimo cluster. È composto da due parti:
- Il RAM slack si estende dalla fine dei dati del file alla fine del settore che li contiene. Il disco scrive settori interi, quindi il sistema operativo deve fornire byte per riempirlo. Il nome deriva dai sistemi meno recenti, come MS-DOS e le prime versioni di Windows su FAT, che lo riempivano con qualsiasi dato fosse presente nel buffer di memoria. Le versioni attuali di Windows vi scrivono zeri; pertanto, su un volume NTFS scritto da un sistema Windows moderno, ci si deve aspettare che il RAM slack sia riempito di zeri. Se si rileva RAM slack diverso da zero, occorre spiegarne la presenza (un sistema operativo meno recente, un altro driver o strumento oppure un file system diverso da NTFS), anziché darla per scontata.
- Il drive slack, detto anche slack residuo, è costituito dai settori interi nell'ultimo cluster successivi al settore che contiene la fine del file. Questi settori non vengono scritti, quindi conservano ciò che contenevano in precedenza, spesso un residuo di un file precedente eliminato.
Se in seguito un file viene ridotto, il suo contenuto precedente oltre la nuova fine diventa slack.
Esempio svolto
Un file ha una dimensione logica di 10.000 byte. Si trova su un volume con cluster da 4.096 byte e settori da 512 byte (8 settori per cluster).
- Cluster necessari: 10.000 ÷ 4.096 = 2,44, arrotondato per eccesso a 3 cluster.
- Dimensione allocata: 3 × 4.096 = 12.288 byte.
- Slack del file: 12.288 − 10.000 = 2.288 byte.
- Dati nell'ultimo cluster: 10.000 − (2 × 4.096) = 10.000 − 8.192 = 1.808 byte.
- Settori utilizzati in quel cluster: 1.808 ÷ 512 = 3 con resto 272. Si tratta di tre settori interi, più 272 byte nel quarto settore.
- RAM slack: 512 − 272 = 240 byte, agli offset 1.808–2.047 all'interno del cluster.
- Drive slack: 8 − 4 = 4 settori interi, quindi 4 × 512 = 2.048 byte, agli offset 2.048–4.095.
- Verifica: 240 + 2.048 = 2.288, che corrisponde al passaggio 3.
Per individuare queste aree nell'immagine, si consideri un volume NTFS (il cluster 0 inizia al primo settore del volume) che inizia al settore 2.048, con l'ultimo cluster al numero 120.000:
| Elemento | Calcolo | Offset in byte nell'immagine |
|---|---|---|
| Inizio del volume | 2.048 × 512 | 1.048.576 |
| Inizio del cluster 120.000 | 1.048.576 + 120.000 × 4.096 | 492.568.576 |
| Inizio del RAM slack | 492.568.576 + 1.808 | 492.570.384 |
| Inizio del drive slack | 492.568.576 + 2.048 | 492.570.624 |
Slack del volume e spazi tra le partizioni
I dati possono trovarsi anche al di fuori di qualsiasi file system.
- Lo slack del volume è lo spazio tra la fine del file system e la fine del volume che lo contiene. Si verifica quando la dimensione del volume non è un multiplo esatto della dimensione del cluster, quando il file system è stato creato con una dimensione inferiore a quella della sua partizione oppure quando la partizione è stata successivamente ampliata.
- Gli spazi tra le partizioni sono settori che non rientrano in alcuna partizione. Ne sono esempi i settori tra la tabella delle partizioni e la prima partizione (i settori 1–2.047 su un disco MBR la cui prima partizione inizia al settore 2.048), lo spazio tra due partizioni e lo spazio dopo l'ultima partizione.
Queste aree contengono solitamente zeri o residui di un partizionamento precedente; la presenza di dati diversi da zero richiede una spiegazione, perché gli strumenti di occultamento le utilizzano. La lezione 1.1 mostra come individuarle.
Spazio non allocato e spazio libero a confronto
Lo spazio non allocato è l'insieme dei cluster che la struttura di allocazione contrassegna come non in uso. Si tratta di uno stato, non di una descrizione del contenuto. Lo spazio libero è la capacità che il sistema operativo indica come disponibile. Deriva dallo stesso stato, ma non dice nulla sul contenuto: "20 GB liberi" possono corrispondere a 20 GB di dati eliminati recuperabili. In una relazione, si utilizzi "non allocato", mai "vuoto". Lo spazio non partizionato è ancora diverso, perché si trova al di fuori di qualsiasi file system.
Che cosa può e non può dimostrare ciascuna area
| Area | Può mostrare | Non può mostrare da sola |
|---|---|---|
| File allocato | Contenuto collegato a un nome, a timestamp e a un proprietario | Chi ha creato il contenuto, salvo conferma da altre fonti |
| File eliminato, metadati integri | Nome precedente, dimensione, timestamp, posizione del contenuto | Che il contenuto sia ancora quello originale, poiché i cluster potrebbero essere stati riutilizzati |
| Slack del file | Che i dati erano nel cluster prima dell'ultima scrittura del file attuale, oppure che vi sono stati collocati deliberatamente | Quando sono stati scritti, a quale file appartenevano o quale utente li ha scritti |
| Spazio non allocato | Che i dati sono stati scritti su questo volume in un certo momento | Quando, da chi o con quale nome, a meno che il contenuto non disponga di metadati interni propri |
| Slack del volume, spazi tra le partizioni | Che esistono dati al di fuori del file system | Come o quando vi siano arrivati |
Il contenuto dello slack e dello spazio non allocato non dispone di metadati del file system. Qualsiasi data o autore deve essere ricavato dal contenuto stesso, ad esempio dai metadati interni di un documento o da un timestamp in una riga di log, e deve essere corroborato.
Come gli strumenti rendono accessibili queste aree
The Sleuth Kit dispone di comandi per ciascuna categoria. fls -d elenca i nomi dei file eliminati (aggiungere -r per la ricorsione, -p per i percorsi completi e -o per l'offset della partizione in settori). istat mostra una voce dei metadati. blkstat mostra se un cluster è allocato. ifind -d trova la voce dei metadati che punta a un determinato cluster. blkls estrae per impostazione predefinita le unità di dati non allocate (-A). Con -s estrae lo slack e con -e estrae tutte le unità. Quando viene trovata una corrispondenza per una parola chiave nell'output di blkls, blkcalc -u <unit> riconverte il numero dell'unità nell'indirizzo del cluster nel volume originale. Autopsy mostra le stesse aree sotto forma di viste dei file eliminati, file virtuali "Unalloc" e file -slack per ciascun file.
Focus sull'esame: Occorre saper calcolare la dimensione allocata, lo slack del file, il RAM slack e il drive slack a partire dalla dimensione di un file, dalla dimensione del cluster e dalla dimensione del settore, e saper convertire un numero di cluster in un offset in byte. Le domande possono anche riguardare le modifiche prodotte dall'eliminazione su un determinato file system e ciò che il contenuto dello slack o dello spazio non allocato può stabilire in merito al momento della scrittura e all'autore.
Punti chiave
- Le cinque categorie di Carrier (file system, contenuto, metadati, nome del file, applicazione) possono sopravvivere o andare perdute indipendentemente le une dalle altre; occorre quindi indicare la categoria di ogni elemento di prova.
- Il cluster è l'unità di allocazione più piccola. La dimensione allocata di un file è pari al suo numero di cluster × la dimensione del cluster, e la differenza rispetto alla sua dimensione logica costituisce lo slack del file.
- L'eliminazione modifica normalmente lo stato di allocazione e i metadati, mentre il contenuto rimane finché non viene sovrascritto o, sugli SSD, eventualmente sottoposto a TRIM.
- Il RAM slack sui sistemi Windows/NTFS moderni è normalmente riempito di zeri. Il drive slack è costituito da settori non scritti che possono contenere residui di un file precedente.
- Lo spazio non allocato è uno stato, non un'assenza di contenuto. Il contenuto rinvenuto al suo interno o nello slack non può essere datato né attribuito senza prove indipendenti.