Metodologia

Come USN Parser trasforma un blob $J in record strutturati — algoritmi, passi di validazione, limiti noti.

Questa pagina documenta cosa USN Parser fa al tuo input, perché ci si può fidare dell'output e dove sono i limiti. Serve a supportare una catena di custodia forense — se citi USN Parser in un report, questa è la pagina da riferenziare.

Input

  • $UsnJrnl:$J: obbligatorio. Un flusso di dati alternativo sparse estratto dalla radice del volume \$Extend\$UsnJrnl. Deve essere specificamente il flusso $J$Max porta solo il dimensionamento del journal.
  • $MFT: opzionale. La Master File Table dello stesso volume. Usata unicamente per risolvere i riferimenti alle directory padre in percorsi completi.

Entrambi i file vengono letti in memoria e passati al parser WebAssembly. Il browser passa il buffer di byte al worker via postMessage con una lista di trasferimento esplicita, più veloce e senza copie accidentali che restano in memoria.

Algoritmo di parsing

Compiliamo usnrs (Airbus CERT, Apache-2.0) per wasm32-unknown-unknown. Implementa la struttura USN_RECORD_V2 documentata nella reference NTFS di Microsoft.

Il reader:

  1. Salta la regione sparse-zero iniziale fino al primo byte non nullo (inizio del primo record).
  2. Avanza, leggendo il RecordLength (4 byte) a ogni offset per passare al record successivo.
  3. Si ferma al primo gruppo di 4 byte nulli (fine dei record validi).
  4. Per ogni record, valida che la versione major/minor sia 2.0 e decodifica l'intestazione fissa più il nome del file di lunghezza variabile.

Quando si fornisce un $MFT, risolviamo i percorsi completi camminando lungo la catena dei riferimenti padre. Confermiamo un percorso completo solo quando il nome foglia risolto coincide con il filename del journal — evitando che una entry MFT obsoleta produca un percorso con falsa fiducia.

Output

Ogni record espone:

  • usn (u64): posizione nel journal
  • timestampMs (i64): FILETIME di Windows convertito in millisecondi Unix, UTC
  • filename (UTF-16 decodificato)
  • fullPath (string o null): solo quando $MFT è stato fornito e ha combaciato
  • reasons (string[]): bitmask Reason espansa in nomi leggibili
  • attributes (string[]): attributi NTFS marcati sul file
  • mftEntry, mftSequence, parentMftEntry, parentMftSequence

L'output resta in memoria del browser fino alla chiusura del tab.

Limiti

  • Niente supporto a USN_RECORD_V3 ancora. V3 (riferimenti file a lunghezza variabile, introdotto con ReFS) non viene prodotto su volumi NTFS standard, quindi raramente rilevante in pratica.
  • Il wrap del ring buffer è invisibile: non sappiamo cosa è stato sovrascritto prima del record più vecchio. Incrocia con $LogFile e Volume Shadow Copies se serve storia più profonda.
  • Niente validazione dei timestamp: ci fidiamo del FILETIME scritto nel record. Per rilevare timestomping, il post SI vs FN descrive il controllo incrociato standard contro $MFT.

Catena di custodia

Se serve una reference per un report: la versione di USN Parser è identificabile dal commit hash deployato in fondo al repository GitHub. L'artefatto wasm è riproducibile dalla sorgente via wasm-pack build --release; l'hash del .wasm è stabile per revisione del codice.