← Torna al blog

Anatomia di un record MFT: signature, header e attributi

· 4 min di lettura

Ogni entrata della Master File Table è di 1.024 byte disposti nello stesso modo: un header fisso, una piccola struttura di riparazione, poi un flusso di attributi tipizzati. Questo articolo è uno sguardo ravvicinato a quella disposizione — il tipo di dettaglio di cui avete bisogno quando state leggendo byte grezzi di $MFT in un editor esadecimale o state scrivendo il vostro parser.

La signature FILE

I primi quattro byte di ogni record sono la stringa ASCII FILE (46 49 4C 45). I parser la usano come àncora quando scansionano un volume grezzo alla ricerca di record orfani: ogni confine di 1.024 byte che inizia con FILE è un record MFT, anche se l'header della tabella stessa è illeggibile.

Un record il cui contenuto chkdsk non ha potuto riparare porta invece la signature BAAD (42 41 41 44). NTFS mantiene questi record in posizione invece di cancellarli — preservano il sequence number della slot — ma il resto dei byte non è da considerarsi affidabile.

L'header del record

I 56 byte dopo la signature descrivono che tipo di record sia e come leggerlo in sicurezza:

  • Offset dell'update sequence array (2 byte) e dimensione dell'array in word da 16 bit (2 byte). Insieme descrivono i dati di fixup; vedi sotto.
  • Sequence number di $LogFile (8 byte). Punta indietro al log delle transazioni per il recupero dopo un crash.
  • Sequence number (2 byte). Incrementato ogni volta che la slot del record viene riutilizzata.
  • Contatore hard link (2 byte). Uno per attributo $FILE_NAME.
  • Offset al primo attributo (2 byte).
  • Flag (2 byte). Il bit 0 è IN_USE; il bit 1 marca una directory.
  • Dimensione usata (4 byte) e dimensione allocata (4 byte) del record. L'allocata è sempre 1.024 sui volumi standard.
  • Base file record reference (8 byte). Non nullo sui record di estensione — slot extra usate quando gli attributi di un file traboccano da un singolo record.
  • Prossimo ID di attributo (2 byte). Usato per assegnare ID unici ai nuovi attributi.
  • Numero del record (4 byte, NTFS 3.1+). Auto-reference, utile per verificare la correttezza del parse.

Il sequence number è ciò che rende affidabile l'analisi dei file eliminati. Il numero di record da solo viene riutilizzato; la file reference a 64 bit (numero di record più sequence number) no. Una reference che non concorda con il sequence number attuale a quel numero di record è un puntatore a un occupante precedente — di solito un file eliminato.

Il fixup array

NTFS rileva le scritture interrotte con un piccolo trucco chiamato update sequence array (USA), o fixup array. Ogni record da 1.024 byte è anche suddiviso in due settori da 512 byte. NTFS:

  1. Sceglie un update sequence number (USN — non correlato all'USN di $UsnJrnl nonostante l'acronimo condiviso) a 16 bit.
  2. Sostituisce gli ultimi due byte di ogni settore da 512 byte con quell'USN prima di scrivere.
  3. Memorizza gli ultimi-due-byte originali di ogni settore nel fixup array, in ordine, subito dopo l'USN stesso.

In lettura, NTFS verifica che gli ultimi due byte di ogni settore corrispondano all'USN. Se sì, i settori sono stati scritti insieme; i byte originali sono recuperati dal fixup array e rimessi in posizione. Se la coda di un settore non corrisponde, la scrittura è stata interrotta e il record è sospetto.

Ciò significa che un parser che legge $MFT byte per byte senza applicare i fixup otterrà spazzatura agli offset 510 e 1022 di ogni record. Ogni parser MFT serio applica il fixup come primo passo dopo aver localizzato un record.

Il flusso di attributi

Dopo l'header (e il fixup array) vengono gli attributi del file. Ogni attributo inizia con il proprio piccolo header — codice di tipo, lunghezza, flag resident o non-resident, nome opzionale — seguito dai dati dell'attributo. Gli attributi sono allineati su 8 byte, scritti uno dietro l'altro e terminati da una sentinella 0xFFFFFFFF.

Un record minimo ne porta tre:

  • $STANDARD_INFORMATION (0x10) — timestamp e flag DOS.
  • $FILE_NAME (0x30) — nome, reference alla directory genitore e un secondo set di timestamp.
  • $DATA (0x80) — il contenuto del file, resident inline per file piccoli o una lista di cluster runs altrimenti.

I record possono portarne molti altri, incluso $ATTRIBUTE_LIST quando gli attributi del file superano una singola slot da 1.024 byte. La lista completa è nel riferimento della Master File Table.

Perché tutto ciò conta in forensica

La combinazione di una disposizione stabile da 1.024 byte e della signature FILE è ciò che rende possibile il carving di file NTFS eliminati. Anche se $MFT stessa è scomparsa, una scansione del volume grezzo alla ricerca di header FILE recupera la maggior parte dei record — inclusi i nomi, i timestamp e (per file piccoli) i dati delle entrate eliminate. Il meccanismo di fixup garantisce che i record così recuperati siano affidabili a patto che l'USA si verifichi.

Risorse esterne