Analisi della sequenza temporale · Lezione 2 di 5
MACB su NTFS: $SI e $FN a confronto
12 min di lettura
Ogni file su un volume NTFS contiene almeno otto timestamp e l'affidabilità di una timeline dipende dalla conoscenza, da parte dell'esaminatore, di ciò che modifica ciascuno di essi. Questa lezione illustra la notazione MACB utilizzata nelle timeline, dove si trovano gli otto valori, quale componente li aggiorna, come le normali operazioni quali copia, ridenominazione e modifica li cambiano e come riconoscere i valori che non corrispondono a tali schemi. Il Modulo 7 tratta il timestomping come tecnica antiforense; qui l'obiettivo è leggere correttamente una timeline.
Notazione MACB
Le timeline identificano ogni timestamp del file system con una delle seguenti quattro lettere:
| Lettera | Significato su NTFS | Causa tipica |
|---|---|---|
| M | Modified: ultima scrittura del contenuto | Scrittura di dati nel $DATA del file |
| A | Accessed: ultimo accesso | Lettura o esecuzione, se gli aggiornamenti sono abilitati |
| C | Changed: ultima modifica della voce MFT | Qualsiasi modifica dei metadati: ridenominazione, attributi, sicurezza, dimensione |
| B | Born: creazione | Creazione del file su questo volume |
C è l'insidia: su NTFS significa che la voce MFT (i metadati) è stata modificata, non «creato». Esplora file di Windows non la mostra affatto.
Gli strumenti di timeline raggruppano i valori identici in un'unica riga e mostrano le lettere come un codice a quattro posizioni, con punti per quelle non applicabili. Nell'output di mactime di The Sleuth Kit, m.c. indica che l'orario corrisponde sia alla modifica del contenuto sia alla modifica della voce MFT, .a.. indica soltanto un accesso e macb indica che tutti e quattro i valori sono uguali, situazione normale al momento della creazione. Il bodyfile di TSK (fls -m) elenca i valori $FN come una voce separata il cui nome termina con ($FILE_NAME), quindi un file può generare righe per entrambi gli insiemi. L'output l2tcsv di Plaso contiene una colonna MACB con le stesse lettere in maiuscolo (Lezione 3.3).
Dove si trovano gli otto timestamp
La Lezione 1.3 ha introdotto i due attributi. I loro timestamp si trovano ai seguenti offset all'interno del contenuto dell'attributo:
| Valore | $STANDARD_INFORMATION (0x10) | $FILE_NAME (0x30) |
|---|---|---|
| B, creazione | 0x00 | 0x08 |
| M, modifica | 0x08 | 0x10 |
| C, modifica della voce MFT | 0x10 | 0x18 |
| A, accesso | 0x18 | 0x20 |
$FN inizia con il riferimento alla directory padre di 8 byte, motivo per cui i suoi timestamp iniziano a 0x08. Tutti e otto sono valori FILETIME: conteggi a 64 bit di intervalli di 100 nanosecondi trascorsi da 1601-01-01 00:00:00 UTC (Lezione 3.1). Sono memorizzati in UTC, indipendentemente dal fuso orario del sistema.
Un file ha un solo $SI ma un $FN per ciascun nome. Con i nomi brevi 8.3 abilitati, Quarterly Report.xlsx ha un $FN Win32 e un $FN DOS (QUARTE~1.XLS), ciascuno dei quali contiene i propri quattro timestamp, solitamente identici. I collegamenti fisici aggiungono ulteriori attributi $FN. La voce dell'indice $I30 della directory padre contiene un'altra copia di $FN, inclusi i timestamp, che può differire dal record; le voci rimaste nello spazio slack dell'indice possono conservare gli orari di file eliminati o rinominati.
Chi li aggiorna
$SI è gestito da NTFS durante le normali operazioni sui file e può anche essere impostato in modalità utente da qualsiasi processo con diritto di scrittura degli attributi del file. SetFileTime imposta gli orari di creazione, accesso e modifica; la chiamata nativa NtSetInformationFile con la classe FileBasicInformation (e SetFileInformationByHandle) può impostarli tutti e quattro, incluso l'orario di modifica della voce MFT. Non sono necessari diritti di amministratore. I software legittimi utilizzano continuamente queste chiamate: programmi di archiviazione, strumenti di copia e backup, programmi di installazione e client di sincronizzazione cloud ripristinano intenzionalmente gli orari.
$FN viene scritto dal driver NTFS nel kernel quando viene creato un nome, principalmente durante le operazioni di creazione, ridenominazione e spostamento. Non esiste un'API documentata per impostare direttamente $FN. Per questo $FN è più difficile da falsificare ed è utile confrontarlo con $SI. Più difficile non significa impossibile: poiché una ridenominazione o uno spostamento copia generalmente i valori $SI nel nuovo $FN, qualcuno può impostare $SI e poi spostare il file; inoltre, le scritture dirette sul disco possono modificare qualsiasi cosa (Modulo 7).
L'ultimo accesso è un elemento probatorio debole
Il valore del registro NtfsDisableLastAccessUpdate in HKLM\SYSTEM\CurrentControlSet\Control\FileSystem controlla gli aggiornamenti di A. Da Windows Vista sono disabilitati per impostazione predefinita. A partire da Windows 10 versione 1803, il valore può essere compreso tra 0x80000000 e 0x80000003: il bit 0x2 impostato significa «Gestito dal sistema», nel qual caso Windows decide in base alla dimensione del volume di avvio (128 GB o meno prima di Windows 10 versione 2004; da allora la soglia è in NtfsLastAccessUpdatePolicyVolumeSizeThreshold), mentre il bit 0x1 impostato significa disabilitato. fsutil behavior query disablelastaccess mostra l'impostazione su un sistema in esecuzione. L'aggiornamento di A dipende quindi dalla versione e dal volume: non dare mai per scontato né che avvenga né che non avvenga. Anche quando è abilitato, NTFS ritarda la scrittura su disco di un nuovo orario di accesso fino a un'ora. Considerare A un elemento probatorio debole: un valore A vecchio non dimostra che il file non sia stato aperto e un valore A recente può derivare da una scansione antivirus, dall'indicizzazione o da un backup. Utilizzare Prefetch, file LNK e Jump List per dimostrare che un file o un programma è stato aperto (Modulo 2).
Regole pratiche su Windows 10 e 11
Le ricerche su NTFS in Windows 10 e 11 hanno raccolto in tabelle il modo in cui le operazioni comuni modificano gli otto valori. La tabella mostra il risultato tipico; il comportamento varia in base alla build di Windows e al programma che esegue l'operazione, quindi effettuare prove sulla stessa versione prima di basarsi su una regola in una relazione.
| Operazione | $SI M | $SI A | $SI C | $SI B | $FN M | $FN A | $FN C | $FN B |
|---|---|---|---|---|---|---|---|---|
| Creazione | Nuovo | Nuovo | Nuovo | Nuovo | Nuovo | Nuovo | Nuovo | Nuovo |
| Modifica del contenuto | Nuovo | Se abilitato | Nuovo | – | – | – | – | – |
| Lettura (accesso) | – | Se abilitato | – | – | – | – | – | – |
| Ridenominazione, stesso volume | – | – | Nuovo | – | Da $SI | Da $SI | Da $SI | Da $SI |
| Spostamento, stesso volume | – | – | Nuovo | – | Da $SI | Da $SI | Da $SI | Da $SI |
| Copia (nuovo file) | Origine | Nuovo | Nuovo | Nuovo | Nuovo | Nuovo | Nuovo | Nuovo |
| Spostamento su un altro volume | Origine | Nuovo | Nuovo | Origine | Nuovo | Nuovo | Nuovo | Nuovo |
«Nuovo» indica l'orario dell'operazione, «–» un valore invariato, «Origine» un valore ereditato dal file originale e «Da $SI» significa che il nuovo $FN assume i valori $SI presenti immediatamente prima dell'operazione. Uno spostamento su un altro volume è una copia seguita da un'eliminazione: il nuovo record riceve nuovi orari $FN come una copia, ma un'operazione di taglia e incolla in Esplora file conserva anche il valore $SI B dell'origine, quindi sia M sia B appaiono vecchi.
Tre conseguenze sono particolarmente importanti:
- Indicatore di copia. Una copia conserva il valore M dell'origine ma riceve un nuovo B, quindi M precedente a B è il normale segno di un file copiato, non di una manipolazione.
- Archivi e download. Gli strumenti di estrazione impostano solitamente M in base all'orario memorizzato nell'archivio e alcuni ripristinano anche B e A, quindi i file estratti possono sembrare vecchi di anni. Un download tramite browser riceve normalmente B quando il file viene creato per la prima volta e M quando termina la scrittura; alcuni strumenti di download impostano M in base all'intestazione Last-Modified del server. Un flusso di dati alternativo
Zone.Identifieraiuta a identificare i download. - Applicazioni con salvataggio sicuro. Molti editor, incluse le suite per ufficio, salvano scrivendo un file temporaneo e rinominandolo in modo da sostituire l'originale. Il file si trova quindi in un nuovo record MFT, mentre il tunneling NTFS (una cache, con durata predefinita di 15 secondi e basata sul nome) assegna al nuovo file il vecchio orario di creazione $SI. Un valore B stabile non dimostra che il record sia lo stesso.
Esempio svolto: budget-q3.xlsx
(a) Copiato da un'unità USB. L'unità FAT32 conteneva budget-q3.xlsx, la cui ultima modifica risaliva a 2026-07-28T16:42:10Z. È stato copiato in C:\Users\ana\Documents\. Il record (ad esempio nell'output di istat) mostra:
| Valore | $SI (0x10) | $FN (0x30) |
|---|---|---|
| Creazione | 2026-08-03T09:15:42.6183420Z | 2026-08-03T09:15:42.6183420Z |
| Modifica | 2026-07-28T16:42:10.0000000Z | 2026-08-03T09:15:42.6183420Z |
| Modifica MFT | 2026-08-03T09:15:42.7401138Z | 2026-08-03T09:15:42.6183420Z |
| Accesso | 2026-08-03T09:15:42.6183420Z | 2026-08-03T09:15:42.6183420Z |
Ragionamento: $SI M precede $SI B di 5 giorni, 16 ore e 33 minuti, il che corrisponde allo schema di copia (la colonna Copied di MFTECmd lo segnala). $SI B è uguale a $FN B, quindi nulla suggerisce una retrodatazione. $SI M ha una parte frazionaria dei secondi nulla perché FAT32 memorizza gli orari di modifica a intervalli di 2 secondi e la copia l'ha conservata; 16:42:10 è un secondo pari. FAT memorizza l'ora locale, quindi la conversione in UTC ha utilizzato il fuso orario del sistema che ha eseguito la copia (Lezione 3.5). Il file è arrivato alle 09:15:42Z; corroborare l'identificazione del dispositivo USB con gli artefatti della Lezione 2.6.
(b) Modificato e salvato sul posto il 2026-08-04T22:31:07.4410023Z. $SI M e $SI C diventano 2026-08-04T22:31:07.4410023Z. $SI B rimane 09:15:42.6183420Z e $SI A resta invariato perché gli aggiornamenti dell'ultimo accesso sono disabilitati. Tutti e quattro i valori $FN rimangono a 2026-08-03T09:15:42.6183420Z. Ora M è successivo a B, quindi l'indicatore di copia è scomparso da $SI; l'orario di arrivo sopravvive in $SI B e in tutti e quattro i valori $FN. Se fosse stato utilizzato un editor con salvataggio sicuro, verificare il numero del record confrontandolo con gli artefatti precedenti prima di presumere che si tratti dello stesso record.
Interpretare le anomalie
Gli schemi che non corrispondono alla tabella meritano un esame più approfondito:
- $SI B precedente a $FN B. Dopo creazione, copia, ridenominazione e spostamento sullo stesso volume, $SI B è uguale a $FN B. Anche un'operazione di taglia e incolla da un altro volume e alcune estrazioni di archivi producono un $SI B più vecchio, ma lasciano $SI C all'orario dell'operazione.
- Valori frazionari dei secondi azzerati. Un FILETIME la cui parte in intervalli di 100 nanosecondi è 0000000. NTFS registra la precisione completa, mentre molti strumenti che impostano gli orari utilizzano secondi interi.
- Date $SI precedenti all'installazione del sistema operativo, utilizzando
InstallDate(secondi Unix) inHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion. Gli aggiornamenti delle funzionalità reimpostano tale valore, quindi effettuare il confronto con cautela.
Ciascuno ha cause innocue: estrazione di archivi, programmi di installazione, client di sincronizzazione e file provenienti da supporti FAT. Considerarli piste investigative, non risultati accertati, e confermarli con $UsnJrnl (un motivo BASIC_INFO_CHANGE al momento dell'impostazione dei valori) e $LogFile (Lezione 1.4 e Modulo 7). MFTECmd, ad esempio, scrive gli otto valori come Created0x10, Created0x30, LastModified0x10, LastModified0x30, LastRecordChange0x10, LastRecordChange0x30, LastAccess0x10 e LastAccess0x30 (0x10 è $SI, 0x30 è $FN) e contrassegna i record con SI<FN (un orario $SI precedente all'orario $FN), uSecZeros (valori frazionari dei secondi nulli) e Copied. Alcuni strumenti lasciano vuote le colonne $FN quando i valori sono uguali a quelli $SI, quindi verificare come lo strumento utilizzato li visualizza.
Esempio svolto: un file sottoposto a timestomping
C:\ProgramData\Intel\igfxupd.exe mostra tutti e quattro i valori $SI come 2019-03-19T04:12:00.0000000Z e tutti e quattro i valori $FN come 2026-08-05T02:14:48.9917304Z. InstallDate è 1.676.037.931, che corrisponde a 2023-02-10T14:05:31Z.
Il valore grezzo di creazione $SI è costituito dagli 8 byte 00 E8 45 E6 09 DE D4 01, letti in little-endian come 0x01D4DE09E645E800 = 131.974.423.200.000.000. Diviso per 10.000.000, equivale a 13.197.442.320 secondi con resto 0: nessuna parte frazionaria dei secondi. Il valore $FN 134.303.696.889.917.304 lascia un resto di 9.917.304, ossia 0,9917304 s.
Ragionamento: $SI B precede $FN B di sette anni; la parte frazionaria dei secondi di $SI è azzerata, mentre quella di $FN non lo è; $SI precede l'installazione; inoltre è stato impostato anche $SI C, cosa che SetFileTime da solo non può fare. Una copia normale assegnerebbe un nuovo $SI B e uno spostamento da un altro volume o un'estrazione che ripristina B lascerebbe comunque $SI C all'orario dell'operazione. L'affermazione sostenibile è che il nome del file è stato creato su questo volume il 2026-08-05T02:14:48Z e che i suoi valori $SI sono stati probabilmente impostati in seguito, in attesa di conferma da $UsnJrnl.
Focus sull'esame: Prepararsi a identificare quali degli otto timestamp vengono modificati da un'operazione, a riconoscere M precedente a B come indicatore di copia e a scegliere $FN anziché $SI quando $SI appare manipolato. Le domande possono chiedere l'orario di arrivo di un file su un volume, che si ricava da B ed è espresso in UTC. Le domande sull'ultimo accesso verificano se si sa che è solitamente disabilitato e quindi debole come elemento probatorio.
Punti chiave
- MACB significa Modified (modifica), Accessed (accesso), MFT entry Changed (modifica della voce MFT) e Born (creazione); su NTFS C indica la modifica dei metadati, non la creazione.
- $SI e ciascun $FN contengono quattro valori FILETIME in UTC; un file ha un solo $SI ma un $FN per ciascun nome, oltre a una copia nell'indice $I30 della directory padre.
- $SI può essere impostato in modalità utente da qualsiasi processo con diritto di scrittura degli attributi; $FN viene scritto dal kernel durante creazione, ridenominazione e spostamento, quindi è più difficile da falsificare.
- Una copia conserva il valore M dell'origine e riceve un nuovo B, quindi M precedente a B è normale per i file copiati.
- L'aggiornamento dell'ultimo accesso dipende dalla versione e dal volume; considerare A un elemento probatorio debole.
- $SI B precedente a $FN B, parti frazionarie dei secondi azzerate e date precedenti all'installazione sono piste investigative da confermare con $UsnJrnl e $LogFile.