Se pensate che una password non sia sufficiente per proteggere un file importante o volete salvarlo nel cloud senza dover ricordare una password, ma nemmeno lasciandolo in chiaro, allora potete ricorrere al semplice programma che vi suggeriremo e a un breve script PowerShell per manipolare la "genetica del file". Il “genoma” di ogni file è fatto di bit, che nella loro semplice binarietà rendono possibili le molteplici "combinazioni genetiche" che denotano in modo peculiare e unico ogni file. Il “microscopio” per analizzare i bit è uno strumento imprescindibile per le analisi di digital forensics e solitamente viene indicato come "hex editor", ossia editor esadecimale, con chiaro riferimento alla codifica esadecimale solitamente utilizzata per leggere i byte.
Quello che useremo qui, per dar vita a “mutazioni genetiche” a fin di bene (ossia sicurezza e confidenzialità dei dati) è HxD, freeware scaricabile dal sito mh-nexus.de che occupa nemmeno 8 MB di spazio ed è disponibile anche in lingua italiana. Si tratta di un software che consente la visualizzazione dei byte che compongono un file ed è ricco di funzioni per la gestione “a basso livello” di operazioni sui bit (modifica, inserimento, etc.), ma in questa sede ci limiteremo ad esplorare le sue potenzialità per la "manomissione" dei bit, mostrando dei metodi per rendere un file difficilmente leggibile ad occhi indiscreti, ricordando sempre che il primo requisito di ogni sperimentazione è di non esser applicata a dati importanti o non backuppati.
DIVIDE ET IMPERA
Un primo modo per usare i bit a nostro favore, per rendere un file importante (anche se già protetto da password o steganografato) ulteriormente inaccessibile, è semplicemente quello di dividere il file in questione in due (o più) frammenti, in modo che ciascun frammento funga da “chiave di completamento” inderogabile per l’apertura del file originale. Questa operazione può essere svolta anche usando programmi come 7-Zip, che tuttavia aggiungono ad ogni file-frammento dei metadati che ne rivelano l'identità. HxD, senza l'uso di metadati, ce lo consente ancor più agevolmente con l’apposita funzione Separa
.
Scegliamo quindi fra le dimensioni preimpostate o, più semplicemente, definiamone una superiore alla metà delle dimensione complessiva del file (se vogliamo limitarci a due frammenti); decidiamo poi il percorso ed il nome per i file parziali e in un attimo avremo pronti i due frammenti.
Semmai ve lo steste chiedendo, non è possibile aprire correttamente il primo frammento usando il suo programma di default, anche se esso contiene l’header (i metadati posti nei primi byte del file) per intero, essendo solitamente necessario, per l’integrità e la leggibilità del file, anche il trailer (i metadati posti negli ultimi byte del file), che rende il file perfettamente gestibile dal programma associato (l’unica eccezione è se si tratta di un file del "Blocco note" o eventuali altri formati parimenti privi di header e trailer; in questo caso ciascun frammento resta perfettamente autonomo e leggibile singolarmente).
Giunti a questo punto, separare fisicamente i due (o più) file-frammenti, magari mettendone uno su una periferica esterna o nel cloud, dovrebbe garantire un ulteriore livello di sicurezza (ma certo non l’unico da applicare!), per il file originale, rispetto a qualunque file soltanto protetto da password: la password può infatti essere rubata o crackata, mentre un file mancante non può essere ricostruito.
Anche perché bisogna anzitutto saper intuire che si tratta di un file parziale e non, ad esempio, di un container VeraCrypt o di un file danneggiato: aggiungere un’estensione fittizia ai file parziali può infatti aiutare a sviare i curiosi, facendo credere che si tratti di un file difettoso (quanti, di fronte a un messaggio di errore di Acrobat Reader che tenta di aprire un file con estensione .pdf, si procurano un hex editor e controllano l’integrità dell’header? Da oggi, comunque, sapete che con HxD potete farlo).
RISOLVIAMO IL PUZZLE
Per ricomporre i frammenti e riottenere il file originale (oltre a poter usare il comando CMD “copy /b file1+file2 originale.xxx”) è sufficiente rimetterli nel giusto ordine con la funzione Concatenamento
e scegliere la destinazione e il nome del file ricostruito, magari precisando già l’estensione.
Il file ricomposto, identico all’originale bit-by-bit come confermato dal confronto degli hash, è così pronto per essere decifrato, nuovamente consultato, eventualmente modificato, cifrato e poi ri-frammentato. Chiaramente, per rinforzare la “simulazione di integrità” di ciascun file-frammento, ogni frammento può essere a sua volta messo in sicurezza: criptato, compresso e protetto da password, steganografato in un altro file o più semplicemente modificato ancora una volta a livello di bit, come ci accingiamo a vedere. A questo punto è solo una questione di creatività e di quanto si vuole rendere difficile per gli altri, ma, va sottolineato, anche per noi stessi, riassemblare il file da proteggere.
LA GIOSTRA DEI BIT
Il modo più scontato per rendere meno riconoscibile (e "illeggibile") un file binario è, considerata la sua “essenza”, invertire gli 0 e gli 1. Per ottenere questo si possono usare "script casalinghi" nel proprio linguaggio di programmazione preferito o utilizzare programmi free come FileInvert, scaricabile da qui.
Una variazione più interessante, che può anche essere combinata con la precedente (o, come accennato prima, con la cifratura, con la steganografia e con altre combinazioni di pura creatività), è la rotazione dei bit. Si tratta di una variante del “bit shifting”, ossia del far scorrere i bit all’interno di ciascun byte del file verso sinistra o verso destra. In questo caso verrà praticato un “circular shift": quando un bit, scorrendo, arriva “a fine byte”, alla fine dell’ottava o della prima posizione (a seconda della direzione in cui si scorre), tale bit "rientra" nel byte dal "lato" opposto, come ben spiegato da queste immagini tratte da Wikipedia:
La prima immagine mostra come la prima riga di bit, scorrendo verso sinistra diventi la seconda, con lo zero in prima posizione (MSB, Most Significant Bit) che passa in ultima posizione (LSB, Least Significant Bit). Nella seconda immagine accade lo stesso, ma scorrendo verso destra.
Per sperimentare liberamente il meccanismo del circular shift, è possibile andare sul sito Dcode.fr, impostare “use the following parameters”, poi “Shift by ±N bits, N=”, inserire il numero di bit da shiftare (se anteponiamo il “-“, lo shift è verso sinistra), selezionare “binary”, cliccare su “Decrypt” (o “Encrypt”) ed osservare il risultato sulla colonna di sinistra. Ecco la schermata con le impostazioni ed un esempio con i bit “10110001”:
Per manipolare i nostri file in modo circolare offline, come si addice a informazioni riservate e importanti (anche per evitare rischiosi e prolissi copia e incolla dal browser a un hex editor), abbiamo a disposizione alcuni programmi da poter scaricare liberamente: WinHex, Hex Workshop e Hex Editor Neo.
La nota dolente è che non sono totalmente gratuiti in tutte le loro funzioni: WinHex è anche portable, ma può salvare file di massimo 200kB, anche se consente di salvare copie di backup nel formato .whx, qualora decidessimo di usarle dopo aver acquistato la licenza, non proprio economica, a partire da circa 117€. Hex Workshop non presenta limiti di dimensioni per i file, ma ha una scadenza temporale di 34 giorni (di quelle che vengono gestite nel registro di sistema, per intenderci...). Il costo della licenza è inferiore, ma parliamo comunque di circa 90 dollari. C’è infine Free Hex Editor Neo, installabile anche in versione portable, che dopo i 14 giorni di prova lascia attive solo le funzionalità freemium (da cui il nome), fra le quali purtroppo non ci sono quelle che ci servono in questo caso; il costo della sua licenza base è un più ragionevole 65€.
LO SCRIPT PER LA ROTAZIONE
La soluzione più economica e più "formativa" (facendo si impara) è dunque, come spesso accade, produrre "in casa" ciò che serve; abbiamo scelto di usare PowerShell 7, compatibile con Windows, Linux e MacOS, scaricabile anche in versione portabile da questo indirizzo.
Lo script per il circular shift è il seguente (incollarlo in un file del "Blocco note" e salvarlo con estensione .ps1; prima di eseguirlo, accertarsi di aver impostato le giuste execution policy, oppure usare la policy "bypass" con il comando "Set-ExecutionPolicy Bypass -Scope CurrentUser
", poi digitare "Y", premere invio, trascinare il file .ps1 nella shell oppure digitare il percorso e il nome del file, e infine premere ancora invio):
function Rotate-BitsLeft { # imposta la funzione
param ( # imposta i parametri
[byte]$value, # variabile per i byte in ingresso
[int]$shift # variabile per impostare lo shift in bit
)
$shift %= 8 # lo shift accettato deve essere a base 8
[byte]((($value -shl $shift) -bor ($value -shr (8 - $shift))) -band 0xFF)
# imposta la circolarità dei bit
}
$inputFile = Read-Host "Inserire il percorso e il file da modificare"
# viene inserito il file da modificare
$inputBytes = [System.IO.File]::ReadAllBytes($inputFile)
# il file di input diventa array di byte
$leftshift = Read-Host "Inserire il numero di posizioni da shiftare a sinistra"
# l'utente sceglie la quantità dello shift
$rotatedBytes = foreach ($byte in $inputBytes) {
# per ogni byte individuato nell’array precedente…
Rotate-BitsLeft $byte $leftshift
# …viene eseguito lo shift a sinistra secondo quanto indicato da $leftshift
}
$outputFile = Read-Host "Inserire il percorso e il file di destinazione"
# si definisce il file di output
[System.IO.File]::WriteAllBytes($outputFile, $rotatedBytes)
# i byte shiftati vengono scritti nel file di output
Una volta avviato, lo script ci chiederà quale file vogliamo modificare, di quanti bit (a sinistra) vogliamo "shiftare" il suo contenuto e come vogliamo chiamare il nuovo file. Se si tratta di un file normale, non modificato o frammentato, la rotazione dei bit lo renderà illeggibile dal suo programma predefinito (verranno alterati anche l'header e il trailer). Ovviamente, se impostiamo il valore dello shift a 8, riotteniamo il file di partenza; mentre se, ad esempio, abbiamo applicato uno shift di 3, per riottenere il file originale dobbiamo semplicemente rieseguire lo script con uno shift di 5. Le combinazioni totali possibili per ogni file sono 8, quindi piuttosto limitate, per questo non è un espediente che va usato come unica forma di protezione di un file, ma va abbinato ad altri metodi ben più solidi. Nondimeno, i frammenti derivati da un file possono essere molteplici e a ciascun frammento è possibile applicare una differente "quantità di rotazione", aumentando la complessità e il numero delle combinazioni da vagliare (similmente a quelle casseforti con più manopole che si vedono in alcuni vecchi film).
Combinando la divisione del file originale in due o più parti e "shiftando" i bit che lo compongono, si ottiene quindi un puzzle che è una sfida per un eventuale malintenzionato, sfida che può risultare molto ostica soprattutto se qualche tessera del puzzle è delocalizzata nel cloud o su supporto esterno e se, immancabilmente, il quadro finale è comunque protetto da una buona password.
APPENDICE - RISORSE PER IDENTIFICARE UN FILE
Per approfondire l’individuazione della vera identità di un file, usando la “genetica dei bit”, su Garykessler.net troviamo un lungo elenco dei “magic number”: byte che identificano esattamente il tipo di file a partire dalle informazioni contenute nell’header del file stesso, quindi a prescindere dall’estensione truffaldina che potrebbe esser stata assegnata al file per simulare una tipologia differente.
Se invece preferiamo un’analisi più rapida e meno chirurgica, se non ci basta il comando “file” su Unix, TRIDNet è un programma agile per identificare il tipo di file. Sul sito Checkfiletype.com invece troviamo uno dei servizi che propongono l'identificazione di file online.
Al di là dei possibili tecnicismi, la morale della favola è quella di diffidare della mera estensione di un file (che non indica esattamente il tipo di file, ma solo il programma con cui verrà aperto) e, dopo quanto abbiamo visto in questo articolo, anche di file apparentemente danneggiati o illeggibili. Non è un caso che, spostando il discorso dalla difesa all'attacco, spesso i malware usino tecniche di offuscamento o cifratura dei propri byte per bypassare firewall e antivirus.
P.s.
Come emerso da un test svolto da CUB3, il programma PhotoRec è in grado di riconoscere se alcuni file-frammento appartengono al medesimo file d'origine e quindi li ricompone nel file sorgente. CUB3 ci segnala inoltre che ci sono alcuni programmi e servizi online che sono dedicati al recupero della leggibilità di file troncati o parziali. Questo ad ulteriore riprova del fatto che dividere un file non garantisce in sé la minima sicurezza se tutti i frammenti sono tenuti nel medesimo dispositivo, per cui è almeno consigliato abbinare a tale operazione lo shift dei bit; fermo restando che l'operazione decisiva per la sicurezza di un file resta sempre proteggerlo con una buona password e solo dopo procedere, eventualmente, con ulteriori manipolazioni.