Se passi del tempo nella forense di Windows, il bitmask di razionale USN diventa presto memoria muscolare. È un campo a 32 bit che NTFS imposta su ogni record del journal per riassumere cosa è appena cambiato in un file. I bit non ti dicono tutto — sono additivi, non esclusivi — ma letti insieme dipingono un quadro notevolmente preciso del ciclo di vita.
I bit
| Flag | Hex | Cosa significa in pratica |
|---|---|---|
DataOverwrite | 0x00000001 | Una regione del flusso di dati principale è stata sovrascritta |
DataExtend | 0x00000002 | Il flusso di dati principale è cresciuto |
DataTruncation | 0x00000004 | Il flusso di dati principale si è ridotto |
NamedDataOverwrite / Extend / Truncation | 0x10 / 0x20 / 0x40 | Idem, ma su un flusso alternativo |
FileCreate | 0x00000100 | Creato un nuovo file o directory |
FileDelete | 0x00000200 | Il file è uscito dallo spazio dei nomi |
EaChange | 0x00000400 | Attributi estesi modificati |
SecurityChange | 0x00000800 | ACL/proprietario modificati |
RenameOldName | 0x00001000 | Metà «prima» di un rename |
RenameNewName | 0x00002000 | Metà «dopo» di un rename |
IndexableChange | 0x00004000 | Flag indicizzabile commutato |
BasicInfoChange | 0x00008000 | Timestamp, attributi o compressione modificati |
HardLinkChange | 0x00010000 | Hard link aggiunto o rimosso |
CompressionChange | 0x00020000 | Compressione NTFS commutata |
EncryptionChange | 0x00040000 | Stato EFS modificato |
ObjectIdChange | 0x00080000 | Object ID impostato o pulito |
ReparsePointChange | 0x00100000 | Reparse point modificato |
StreamChange | 0x00200000 | Flusso alternativo aggiunto/rinominato/eliminato |
Close | 0x80000000 | L'handle che ha prodotto il cambiamento è stato chiuso |
Close è speciale: NTFS raggruppa operazioni successive sotto lo stesso handle ed emette il record finale con Close solo quando l'handle è andato. Un record senza Close è il sistema che svuota stato intermedio — utile, ma il record con Close è il riassunto autoritativo.
Pattern che vedrai in natura
Alcuni pattern ricorrono così spesso da meritare un riconoscimento istantaneo:
- Nuovo file scritto da un'applicazione.
FileCreate | DataExtend→DataExtend | Close→BasicInfoChange | Close. L'ultimo è il file che riceve il suo mtime alla chiusura. - Rinomina tra directory. Due record sullo stesso
FileReferenceNumber:RenameOldName | ClosepoiRenameNewName | Close. La referenza parentale differisce — è così che ricostruisci lo spostamento. - Save-by-rename atomico. Molti editor scrivono in un file temporaneo e poi lo rinominano sul target. Vedi
FileCreatesul temp,FileDelete | Closesull'originale eRenameNewName | Closesul temp. - Ransomware cifra-poi-rinomina. Record
DataOverwriteche coprono megabyte, seguiti daRenameNewName | Closecon la nuova estensione. Il conteggio e il ritmo deiDataOverwritesono spesso il primo indizio di un campione su disco. - Quarantena antivirus. Un
FileDelete | Closeimmediatamente dopo unFileCreaterecente, tutto sotto la stessa MFT entry. Il journal fornisce la prova che l'AV ha toccato il file anche dopo che il file stesso è scomparso.
Quello che i bit non ti diranno
Il bitmask di razionale parla del file, non dell'attore. Niente utente, niente PID, niente riga di comando. Combina il journal con Security.evtx (4663 accesso a oggetto) o con Microsoft-Windows-Sysmon/Operational per legare un attore a ogni operazione. L'USN ti dà il quando e il cosa; gli altri log danno il chi.
Ricetta pratica di lettura
All'apertura di un journal parsato:
- Filtra
FileCreateper vedere cosa è genuinamente nuovo nella finestra temporale. - Cerca
RenameNewNameper catturare spostamenti e pattern di «salva con nome». - Traccia il numero di
DataExtendnel tempo — le scritture massicce (backup, cifratura, staging di esfiltrazione) saltano all'occhio. - Leggi prima i record con
Closeattivo; tratta gli intermedi come prove di supporto.
L'app web di questo sito permette di filtrare per qualsiasi combinazione di razionali, il che rende i passi 1-3 un esercizio da un clic.