Entropia, magic bytes e file mascherati

Un file non ha volontà, ma ha un carattere: la distribuzione dei suoi byte. Testo, immagini, eseguibili e dati cifrati hanno statistiche diverse e riconoscibili. L'entropia misura quel carattere in un solo numero — e come tutti i numeri singoli, dice qualcosa di vero e invita a concludere troppo.

Che cosa misura l'entropia

L'entropia di Shannon risponde a una domanda precisa: quanta sorpresa c'è, in media, in ogni byte?

Se un file contiene solo la lettera A, il byte successivo è prevedibile con certezza: sorpresa zero, entropia zero. Se ogni byte è estratto a caso fra i 256 possibili, ogni byte è massimamente imprevedibile: l'entropia vale 8 bit per byte, il massimo possibile.

Fra questi due estremi vive tutto il resto. Un testo italiano sta intorno a 4-4,5 bit per byte: le vocali abbondano, le lettere accentate scarseggiano, gli spazi ricorrono. Un eseguibile ha strutture ripetitive. Un JPEG, essendo già compresso, è quasi indistinguibile dal rumore.

03,06,07,58 bit di entropia per byte ordinato log, XML, zeri, testo ripetitivo misto testo naturale, documenti, sorgenti denso eseguibili, PDF casuale compresso o cifrato Entropia alta = compresso OPPURE cifrato OPPURE rumore. Non è, di per sé, un indizio di malevolenza. Un JPEG e un ransomware hanno la stessa entropia.
Le soglie 3,0 · 6,0 · 7,5 sono quelle che Probatio usa per etichettare le quattro classi. Sono convenzioni pratiche, non leggi di natura.

Il numero singolo mente per omissione

Un file da 100 MB di testo, con dentro un blocco cifrato da 200 KB, ha un'entropia complessiva bassa: l'anomalia è annegata nella media.

Per questo Probatio non calcola un solo numero, ma anche 64 valori, uno per ciascuna fetta del file. È la sparkline di entropia, e serve a rispondere alla domanda giusta: non «questo file è casuale?», ma «dove, dentro questo file, i byte diventano casuali?»

entropia per blocco — un archivio di log con qualcosa dentro 8 0 7,5 cinque blocchi sopra 7,5 in un file che sta a 4,2 L'entropia complessiva di questo file non allarma nessuno. La sua sparkline sì. Potrebbe essere un archivio ZIP incorporato, un'immagine, un blocco cifrato — o niente di interessante. Dice dove guardare, non cosa concludere. Il passo successivo è aprire quell'offset. Nota: su file molto grandi l'entropia è calcolata su un campione dei primi 64 MiB, non sull'intero contenuto.
Sessantaquattro blocchi, sessantaquattro entropie. È la stessa idea di guardare un elettrocardiogramma invece della frequenza cardiaca media.

Il file dice di essere una cosa, i byte ne dicono un'altra

L'estensione di un file è una convenzione sociale: si cambia rinominando. Ma quasi tutti i formati cominciano con una sequenza di byte caratteristica, il magic number: %PDF per i PDF, PK per gli ZIP, ÿØÿ per i JPEG.

Probatio legge quei byte, deduce il formato reale, e lo confronta con l'estensione dichiarata. Un fattura.jpg che comincia con PK è uno ZIP travestito. Non è necessariamente malevolo — è necessariamente da spiegare.

I polyglot

Più sottile: un file può essere valido in due formati contemporaneamente. Un PDF che è anche uno ZIP, un'immagine GIF che è anche uno script. Funziona perché molti formati ignorano i byte in eccesso: il PDF cerca la sua struttura, lo ZIP cerca il proprio indice in coda al file, e i due non si pestano i piedi.

Probatio cerca firme di altri formati a offset maggiori di zero — ZIP, PDF, ELF, PNG, JPEG, GIF, GZIP, RAR, 7Z — e le segnala. Un archivio ZIP che comincia a metà di un'immagine è, quantomeno, una scelta insolita.

Se è un eseguibile

Per PE (Windows), ELF (Linux) e Mach-O (macOS), Probatio scende più a fondo: architettura, numero di bit, entry point, elenco delle sezioni, librerie importate.

  • Firma Authenticode — se il PE è firmato, la presenza della firma è rilevata (è cosa diversa dal verificarla).
  • imphash — l'MD5 della tabella degli import normalizzata. Due binari compilati dallo stesso sorgente con nomi diversi conservano lo stesso imphash: serve a raggruppare famiglie. Solo per i PE: per ELF e Mach-O non viene calcolato.
  • Packer — dai nomi delle sezioni si riconoscono UPX, ASPack, Themida, VMProtect, MPRESS, PECompact, Enigma e altri.

Un eseguibile impacchettato con UPX ha entropia altissima e sezioni riconoscibili. Questo lo rende sospetto, non malevolo: il packing riduce le dimensioni, e software legittimo lo usa da trent'anni.

YARA: cercare pattern, non anomalie

Dove l'entropia dice «qui i byte sono strani», YARA dice «qui c'è esattamente questo». È un linguaggio di regole che descrive stringhe e sequenze binarie da cercare dentro i file.

Probatio esegue le regole tramite yara-x, l'implementazione pure-Rust, e scarica il set di regole da un endpoint online. Non usa la libreria nativa libyara.

Le due tecniche sono complementari: YARA trova ciò che qualcuno ha già descritto; l'entropia segnala ciò che nessuno ha ancora descritto.

Come si mettono insieme gli indizi

  1. Entropia complessiva — inquadra il file. Alta? Probabilmente compresso o cifrato. Ma senza allarmarsi.
  2. Sparkline — cerca la discontinuità. Un picco isolato in un file ordinato è la cosa più interessante di tutta l'analisi.
  3. Magic bytes — il file è quello che dice di essere?
  4. Polyglot — c'è qualcos'altro, più in là?
  5. Se è un eseguibile — packer, imphash, firma, sezioni.
  6. YARA — corrisponde a qualcosa di noto?
  7. Apri l'hex viewer all'offset sospetto. Nessuno dei sei punti precedenti sostituisce il guardare.

La frase da non scrivere mai

«Il file presenta entropia 7,9, indicativa di contenuto cifrato o malevolo.»

Entropia 7,9 è indicativa di contenuto ad alta densità informativa. Ogni JPEG del tuo telefono è a 7,9. Ogni ZIP, ogni MP4, ogni PDF con immagini dentro. La frase corretta stabilisce un contrasto: «il file, dichiarato come documento di testo, presenta entropia 7,9 — valore incompatibile con quel formato e tipico di dati compressi o cifrati».

La differenza fra le due frasi non è di stile. La prima è falsa. La seconda è un'osservazione che regge, e che indica il passo successivo: aprire il file e vedere.