Vai al contenuto
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

Hash dei file in ambito DFIR e l'etica del caricamento su VirusTotal

Come gli hash identificano i file, perché SHA-256 ha sostituito MD5, come NSRL filtra il software noto e perché caricare un file su VirusTotal significa condividerlo.

Base10 min di letturaDi NotHoly

Che cos'è un hash

Una funzione di hash crittografica prende un input di qualsiasi lunghezza e restituisce un valore di lunghezza fissa chiamato digest. SHA-256 restituisce sempre 256 bit, che leggi come 64 caratteri esadecimali. Lo stesso input dà sempre lo stesso digest. Cambia un carattere e il digest cambia del tutto. Il NIST definisce il Secure Hash Standard in FIPS 180-4, che copre SHA-256 e gli altri algoritmi SHA, e dice che i digest servono a rilevare se un messaggio è cambiato.

Per un analista l'idea utile è semplice. Un digest è un'etichetta breve e ripetibile per una sequenza esatta di byte. Due persone che calcolano l'hash dello stesso file su due macchine dovrebbero ottenere lo stesso digest. Per questo gli hash compaiono nei report di incidente, nei feed di threat intelligence e nelle pagine di download del software.

Un hash identifica i byte, non un nome. Un file chiamato invoice.pdf e uno chiamato setup.exe hanno lo stesso digest se i loro byte sono identici. Rinominare un file non cambia nulla nel digest. Il nome ti dice come qualcuno ha chiamato il file. Il digest ti dice quali byte hai davvero.

Perché SHA-256 ha sostituito MD5 per l'identificazione

MD5 produce un digest a 128 bit ed è stato molto usato per anni per i checksum. In seguito i ricercatori hanno dimostrato che MD5 è vulnerabile ad attacchi di collisione: qualcuno può costruire due input diversi che producono lo stesso digest MD5. SHA-1 ha un problema simile, con una costruzione diversa.

Per un file che hai scaricato tu, una collisione accidentale è molto improbabile. Il timore riguarda quella deliberata. Un attaccante che riesce a creare un secondo file con lo stesso digest può sostituirlo a un file di cui ti fidi già, e il digest nei tuoi registri continuerà a corrispondere. Quando le collisioni diventano praticabili, una corrispondenza non dimostra più che due file siano uguali, e da un hash ti serve soprattutto quella prova.

La regola di lavoro è semplice. Usa SHA-256 per l'identificazione, per i registri delle evidenze e per tutto ciò che potresti dover difendere in seguito. MD5 e SHA-1 li vedrai ancora in vecchi feed, vecchi strumenti e vecchi report. Tratta quei valori come chiavi di ricerca, e non presentarli come prova che due file coincidono.

Hash set: filtrare ciò che conosci già

Un investigatore non legge ogni file di un disco. La prima domanda utile è quali file sono già noti. La National Software Reference Library (NSRL), gestita dal NIST, raccoglie software e crea profili di file che finiscono in un Reference Data Set (RDS). L'RDS è una raccolta di firme digitali di applicazioni software note e tracciabili. Comprende hash di software legittimo e anche di alcune applicazioni che possono essere malevole, come strumenti di steganografia e script di hacking. Gli investigatori lo usano per confrontare i file dei computer sequestrati con i profili noti, separando il software di routine dai file che potrebbero contare.

Gli hash set sono un filtro e rispondono a una domanda ristretta: questo file esatto è nel set? Un file che non è nel set può essere uno strumento scritto ad hoc, un documento o un malware. Un file che è nel set è un file noto, che non equivale a un file sicuro. Un set costruito da una versione di un programma non corrisponderà a un'altra versione dello stesso programma.

Puoi costruire una piccola versione della stessa idea per il tuo ambiente. Calcola l'hash dei file presenti in un'immagine pulita di un laptop, conserva l'elenco con versione e data e confronta le nuove macchine con quell'elenco. Tutto ciò che non corrisponde va ricontrollato. Il confronto non dimostra nulla, ma il lavoro si riduce ai file diversi.

Una corrispondenza di hash non dice nulla su un file modificato

La corrispondenza degli hash è esatta. Se cambia un byte, cambia il digest. Da qui tre regole da tenere a mente.

Quando un digest corrisponde a un valore noto come legittimo, i byte sono identici a quelli del file nel set. È una prova forte sui byte. Non ti dice cosa fa il programma in esecuzione, e gli stessi byte possono comportarsi diversamente con configurazioni o input diversi.

Quando un file è stato modificato, il suo digest non corrisponde, anche se la modifica è banale. Un installer ricostruito, un binario con una patch, un valore di configurazione cambiato o un file di testo salvato con fine riga diversi producono tutti un nuovo digest. La mancata corrispondenza ti dice che i byte sono diversi. Non ti dice se la modifica è dannosa o innocua. Per deciderlo ti serve un altro metodo.

Quando un digest corrisponde a un valore noto come malevolo, sai che questo file esatto è già stato visto. Una nuova variante è un nuovo file con un nuovo digest, quindi un elenco di hash malevoli noti non la trova. Nemmeno una ricerca pulita per un nuovo campione è un verdetto su quel campione.

Lo stesso programma può anche avere digest diversi da una versione all'altra. Notepad di Windows è un buon esempio. Il suo digest può cambiare da una build di Windows all'altra. Un hash senza una versione accanto dice molto poco, quindi registra la versione ogni volta che registri un digest.

Cercare un hash o caricare un file

VirusTotal ti permette di cercare un file tramite il suo hash. Incolli un valore SHA-256, MD5 o SHA-1 nella casella di ricerca e VirusTotal mostra una pagina per qualsiasi file che già conosce con quel digest. Una ricerca per hash invia al servizio il digest. Non invia il file.

Caricare è un'azione diversa. La documentazione di VirusTotal dice che qualsiasi utente può selezionare un file dal proprio computer e inviarlo a VirusTotal. Dice anche che i report di scansione sono condivisi con la community pubblica di VirusTotal, che il contenuto dei file inviati può essere condiviso con i clienti premium di VirusTotal e che i risultati di base sono condivisi con chi invia il file e tra i partner che lo esaminano.

Un caricamento è una decisione di pubblicazione. Una volta che il file ha lasciato la tua macchina non puoi riprendertelo, e non controlli chi lo riceve. Per un campione di malware pubblico, la condivisione può aiutare altri difensori. Per un file che contiene dati di clienti, un contratto non firmato, codice sorgente di un cliente, un database di password o dati personali, condividerlo può infrangere un contratto, violare le leggi sulla privacy ed esporre qualcuno che non ha mai acconsentito.

La regola sul campo è breve. Non caricare mai file riservati o di clienti su VirusTotal o su qualsiasi altro scanner pubblico. Controlla la policy del tuo datore di lavoro o del cliente prima di inviare un campione a chiunque. Se ti basta un digest, cerca il digest. Se ti serve un verdetto su un campione che non puoi condividere, usa uno strumento che controlli tu, come una sandbox locale o un servizio interno approvato dalla tua organizzazione.

Anche una ricerca per hash ha conseguenze. Il servizio riceve il digest, e il digest di un file di un cliente può rivelare cosa stai cercando. Controlla la policy anche per le ricerche per hash, soprattutto in un caso attivo.

Lab pratico: calcola l'hash dei tuoi file

Ti serve un computer con un terminale. Calcolerai l'hash di programmi di sistema e di un file creato da te, poi cercherai su VirusTotal un digest noto e innocuo. Non caricherai nulla. Usa solo file presenti sulla tua macchina.

Passo 1: calcola l'hash di un programma di sistema

Su Linux, esegui:

bash
sha256sum /bin/ls

Su macOS, esegui:

bash
shasum -a 256 /bin/ls

Su Windows, apri PowerShell ed esegui:

powershell
Get-FileHash C:\Windows\System32\notepad.exe -Algorithm SHA256

Su Windows con Git Bash, puoi fare lo stesso controllo anche dal terminale:

bash
sha256sum /c/Windows/System32/notepad.exe

Sulla macchina dove abbiamo testato questo articolo, Windows 11 con Git Bash, questi sono stati i risultati osservati:

text
$ sha256sum /bin/ls
b45981580702029cfeeffc8ca69e2a4d1e9c68914009e94c31ffec9cbc544aa5 */bin/ls
text
Algorithm : SHA256
Hash      : 468FFE129C395ABF6B21A09EFDF261910A95FB98AA982EAD73CAA7B2B684577E
Path      : C:\Windows\System32\notepad.exe
text
$ sha256sum /c/Windows/System32/notepad.exe
468ffe129c395abf6b21a09efdf261910a95fb98aa982ead73caa7b2b684577e */c/Windows/System32/notepad.exe

Il digest di ls viene dalla copia di ls di Git Bash, quindi non corrisponderà all'ls della tua macchina Linux o macOS. Il digest di Notepad è lo stesso nelle due shell: la sola differenza è tra maiuscole e minuscole dell'esadecimale. Confronta i digest senza distinguere maiuscole e minuscole. La stessa macchina ha riportato anche la versione del file 10.0.26100.9949 e una lunghezza di 360448 byte per notepad.exe. Annotale accanto al digest, perché una build diversa di Windows darà un digest diverso per lo stesso nome di programma.

Passo 2: guarda come un carattere cambia il digest

Esegui questo in Git Bash o in qualsiasi shell POSIX:

bash
echo 'lab' > a.txt && sha256sum a.txt && echo 'lab.' > a.txt && sha256sum a.txt

L'output osservato è stato:

text
b76025a9ca630b026d630d59a18cf414f5724d2bbf5dc4b11dd165c9c1ea8e01 *a.txt
d233123b7c71a1b7234066f700e03452959ce5bb0b4802f0cbd2c2437004a879 *a.txt

L'unica modifica è stata un punto. Entrambi i digest sono lunghi 64 caratteri e non hanno alcuno schema visibile in comune. Il comando echo aggiunge anche un a capo, quindi il primo file contiene lab seguito da un'interruzione di riga e il secondo contiene lab. seguito da un'interruzione di riga. Puoi controllare i byte esatti con od -c a.txt. I fine riga sono un motivo comune per cui due copie dello "stesso testo" danno digest diversi. Un file salvato su Windows con fine riga CRLF produce un digest diverso dallo stesso testo salvato con LF.

Passo 3: cerca un digest noto e innocuo su VirusTotal

Apri un browser e vai su https://www.virustotal.com/gui/search/ seguito dal digest SHA-256 di Notepad del Passo 1. Puoi anche incollare il digest nella casella di ricerca del sito di VirusTotal. Non trascinare un file sulla pagina e non cliccare nessun comando di caricamento.

Nella nostra esecuzione, l'indirizzo di ricerca ha portato a una pagina del file per quel digest, ma la pagina ha mostrato prima un controllo reCAPTCHA. Non l'abbiamo completato, quindi i risultati del report non compaiono in questo articolo. Se vuoi vedere i risultati, completa tu il controllo. VirusTotal lo chiede per fermare il traffico automatizzato, e la decisione spetta al sito, non a noi.

Quando la pagina si carica, annota quattro cose:

  • I nomi e i tipi di file che la pagina elenca per quel digest.
  • Il numero di motori che hanno segnalato il file e il numero totale di motori.
  • Le date di first-seen e last-seen.
  • Se il digest sulla pagina corrisponde a quello calcolato sulla tua macchina.

Poi annota cosa la pagina non ti dice. Un risultato senza rilevamenti significa che nessun motore ha segnalato questo digest in quel momento. Non dimostra che il file sia sicuro. La pagina inoltre non dice nulla sulla tua copia a meno che i digest non corrispondano, e non dice nulla su cosa fa il programma quando viene eseguito.

Errori comuni

Calcolare l'hash del file sbagliato. Un download può essere copiato, rinominato o convertito prima che tu lo guardi. Calcola l'hash del file esatto che stai esaminando, registra il suo percorso e il momento in cui hai calcolato il digest, e controlla che ogni copia abbia lo stesso digest dell'originale.

Trattare MD5 o SHA-1 come prova. Usa SHA-256 per l'identificazione. Conserva i digest più vecchi solo come chiavi di ricerca.

Leggere un risultato pulito come sicuro. Un digest senza rilevamenti può essere un malware nuovo, un malware mirato o un file che nessun motore ha ancora visto. Pulito significa "non segnalato", e nient'altro.

Fidarsi del nome del file. I nomi si cambiano facilmente. L'identificatore è il digest, e il nome è solo un'etichetta.

Caricare un file per vedere cos'è. Questo è l'errore che causa incidenti reali. Una ricerca per hash risponde alla domanda per un file noto. Un caricamento pubblica il file stesso.

Dimenticare la versione. Lo stesso nome di programma può produrre molti digest. Registra versione e build accanto a ogni digest, o più avanti il digest non vorrà dire molto.

Per andare oltre

Calcola i digest di ogni file in una cartella e salvali in un manifest, così potrai rilevare le modifiche successive. Su Linux o macOS, esegui sha256sum * > manifest.txt dentro la cartella. Tieni il manifest con le evidenze e ricalcola i digest in seguito per vedere cosa è cambiato. Questo comando è standard, ma non lo abbiamo eseguito nel lab di questo articolo, quindi controlla il suo output sulla tua macchina.

Leggi FIPS 180-4 per le definizioni esatte degli algoritmi SHA e delle loro dimensioni di output. Leggi la pagina di NSRL per vedere come si costruisce e si usa nella pratica un reference data set. Leggi la documentazione di VirusTotal su come vengono gestiti gli invii prima di usare uno scanner pubblico nel tuo lavoro.

Il passo successivo è scrivere una logica di rilevamento su un file che controlli tu. L'articolo Scrivi una regola YARA su un file di test innocuo mostra come trovare pattern anziché digest interi, e copre i casi che un hash esatto non può coprire.

Fonti

Altre letture: Cifratura, codifica e hashing a confronto e l'articolo precedente di questa serie, Prima analisi con Ghidra su un binario che compili tu.

Fonti

  1. FIPS 180-4, Secure Hash Standard (NIST)
  2. National Software Reference Library (NIST)
  3. How VirusTotal works (VirusTotal documentation)

Altro su Malware e analisi forense

Malware e analisi forense

Perché usare NotHoly per l'analisi del malware

Triage statico in un sandbox che non esegue mai il campione, e un modello che lo spiega e lo mappa su ATT&CK. La detonazione resta nel tuo laboratorio.

Intermedio3 min di lettura

Malware e analisi forense

Scrivi una regola YARA su un file di test innocuo

Scrivi la tua prima regola YARA, falla corrispondere a un file di test innocuo e non a un altro, e capisci perché ogni regola ha bisogno di test positivi e negativi.

Base10 min di lettura