Steganografia per file: nascondere i dati direttamente nei settori

Breve introduzione

La steganografia, se qualcuno non se lo ricorda, nasconde informazioni in alcuni contenitori. Ad esempio, nelle immagini (discusso qui и qui). Puoi anche nascondere i dati nelle tabelle di servizio del file system (questo è stato scritto su qui), e persino nei pacchetti di servizi del protocollo TCP. Sfortunatamente, tutti questi metodi presentano uno svantaggio: per “inserire” impercettibilmente le informazioni in un contenitore, sono necessari algoritmi astuti che tengano conto delle peculiarità della struttura interna del contenitore. E sorgono problemi con la resistenza del contenitore alla manipolazione: ad esempio, se si modifica leggermente l'immagine, le informazioni nascoste vanno perse.

È possibile in qualche modo fare a meno di algoritmi astuti e sottili manipolazioni dei dati, garantendo comunque la funzionalità del contenitore e un livello accettabile di sicurezza dei dati nascosti? Guardando al futuro, dirò: sì, puoi! Offrirò anche un'utilità.

Dettagli cruenti del metodo

L'idea di base è semplice come un colpo in fronte: ci sono aree del disco su cui il sistema operativo non scrive mai (o scrive in rari casi). Per evitare la necessità di cercare queste aree utilizzando algoritmi ingegnosi, utilizzeremo la ridondanza, ovvero duplicheremo le nostre informazioni nascoste molte, molte volte in tutti i settori del disco. Quindi, oltre a tutto questo splendore, puoi creare le partizioni necessarie, formattare file system, scrivere file e installare sistemi operativi: comunque, parte dei dati segreti verrà salvata e potrà essere recuperata e la duplicazione ripetuta ci aiuterà mettere insieme il tutto originale dai pezzi.

Il vantaggio di questo metodo è evidente: non dipendiamo dal formato del file e nemmeno dal tipo di file system utilizzato.

Anche gli svantaggi sono, credo, evidenti:

  • I dati segreti possono essere modificati solo riscrivendo completamente l'intero disco, quindi ricreando il contenuto visibile all'utente. Tuttavia, non è possibile utilizzare un software che ricrea il disco da un'immagine: ricreerà anche i dati segreti precedenti.
  • Maggiore è il volume dei dati segreti, maggiore è la probabilità di perdere alcune informazioni.
  • Il recupero dei dati dal disco può richiedere molto tempo. Da alcuni minuti a diversi giorni (i dischi moderni sono grandi).

Passiamo ora allo specifico.

È chiaro che se spalmi semplicemente dati segreti su tutto il disco, questi saranno nascosti solo ad occhio nudo. Se doti il ​​tuo sguardo, ad esempio, di un editor di dischi, i dati appariranno in tutto il loro splendore. Pertanto, sarebbe una buona idea crittografare i dati in modo che non vengano visualizzati. Crittograferemo in modo semplice, ma con gusto: utilizzando l'algoritmo aes256-cbc. Chiederemo all'utente la chiave di crittografia e gli faremo trovare una buona password.

La domanda successiva è come possiamo distinguere i dati “buoni” da quelli cattivi. Qui un checksum ci aiuterà, ma non semplice, ma SHA1. E cosa? È abbastanza buono per Git, quindi andrà bene anche per noi. Deciso: forniamo ad ogni informazione memorizzata un checksum e se dopo la decrittazione corrisponde, significa che la decrittazione ha avuto successo.

Avrai bisogno anche del numero del frammento e della lunghezza totale dei dati segreti. Il numero del frammento serve a tenere traccia di quali pezzi abbiamo già decifrato e quali sono rimasti. La lunghezza totale ci sarà utile durante l'elaborazione dell'ultimo frammento, in modo da non scrivere dati non necessari (cioè riempimento). Bene, poiché abbiamo ancora un'intestazione, aggiungeremo lì il nome del file segreto. Sarà utile dopo la decrittazione per non indovinare come aprirlo.

Testare il metodo nella pratica

Per verificare, prendiamo il mezzo più comune: un'unità flash. Ne ho trovato uno vecchio con una capacità di 1 GB, che è abbastanza adatto per gli esperimenti. Se tu, come me, hai avuto l'idea di non preoccuparti dei supporti fisici, ma di testarlo su un file, un'immagine del disco, allora dirò subito: non funzionerà. Quando si formatta un tale "disco", Linux crea nuovamente il file e tutti i settori inutilizzati verranno riempiti con zeri.

Essendo una macchina con Linux, purtroppo ho dovuto utilizzare sul balcone una stazione meteorologica sul Raspberry Pi 3. Non c’è molta memoria lì, quindi non nasconderemo file di grandi dimensioni. Ci limitiamo a una dimensione massima di 10 megabyte. Inoltre, non ha senso nascondere file troppo piccoli: l'utilità scrive i dati su disco in cluster da 4 KB. Pertanto, di seguito ci limiteremo a un file da 3 kb: si inserisce in uno di questi cluster.

Prenderemo in giro l'unità flash in più fasi, controllando dopo ogni fase se le informazioni nascoste sono leggibili:

  1. Formattazione rapida in formato FAT16 con una dimensione del cluster di 16 KB. Questo è ciò che Windows 7 offre a che fare con un'unità flash che non dispone di un file system.
  2. Riempiendo l'unità flash con tutti i tipi di spazzatura del 50%.
  3. Riempiendo l'unità flash con tutti i tipi di spazzatura del 100%.
  4. Formattazione “lunga” in formato FAT16 (sovrascrivendo tutto).

I primi due test, come previsto, si sono conclusi con una vittoria completa: l'utility è riuscita a estrarre con successo 10 megabyte di dati segreti dall'unità flash. Ma dopo che l'unità flash è stata riempita al massimo di file, si è verificato un errore:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Come puoi vedere, solo 158 cluster sono stati decrittografati con successo (632 kilobyte di dati grezzi, che danno 636424 byte di carico utile). È chiaro che qui non è possibile ottenere 10 megabyte, eppure tra questi cluster ci sono chiaramente dei duplicati. Non puoi nemmeno recuperare 1 megabyte in questo modo. Ma possiamo garantire che recupereremo 3 kilobyte di dati segreti da un'unità flash anche dopo averla formattata e scritta al massimo della sua capacità. Tuttavia, gli esperimenti dimostrano che è del tutto possibile estrarre un file lungo 120 kilobyte da una tale unità flash.

L'ultimo test, purtroppo, ha dimostrato che l'intera unità flash è stata sovrascritta:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Non è sopravvissuto un solo ammasso... Triste, ma non tragico! Prima della formattazione, proviamo a creare una partizione sull'unità flash e già al suo interno un file system. A proposito, è uscito dalla fabbrica esattamente con questa formattazione, quindi non stiamo facendo nulla di sospetto.
È abbastanza probabile che lo spazio disponibile sull'unità flash sia leggermente diminuito.

È inoltre prevedibile che 10 megabyte non possano essere nascosti su un disco completamente pieno. Ma ora il numero di cluster decriptati con successo è più che raddoppiato!

Total clusters read: 250752, decrypted: 405

Sfortunatamente, è impossibile assemblare un megabyte dai pezzi, ma duecento kilobyte sono facili.

Ebbene, la notizia dell'ultimo, quarto controllo, questa volta è gioiosa: la formattazione completa di una simile unità flash non ha portato alla distruzione di tutte le informazioni! 4 kilobyte di dati segreti si inseriscono perfettamente nello spazio inutilizzato.

Tabella riepilogativa delle prove:

Steganografia per file: nascondere i dati direttamente nei settori

Un po' di teoria: sullo spazio libero e sui settori inutilizzati

Se hai mai diviso il tuo disco rigido in partizioni, potresti aver notato che non è sempre possibile allocare tutto lo spazio libero sul disco. La prima sezione inizia sempre con un rientro (di solito 1 megabyte o 2048 settori). Dietro l’ultima sezione capita anche che rimanga una piccola “coda” di settori inutilizzati. E a volte ci sono degli spazi tra le sezioni, anche se raramente.

In altre parole, ci sono settori sul disco a cui non è possibile accedere durante il normale funzionamento del disco, ma in questi settori è possibile scrivere i dati! E questo significa anche leggerlo. Adeguato al fatto che esiste anche una tabella delle partizioni e un codice del bootloader, che si trovano nell'area vuota all'inizio del disco.

Prendiamoci una pausa dalle sezioni per un po' e guardiamo il disco da una prospettiva a volo d'uccello, per così dire. Qui abbiamo una partizione vuota sul disco. Creiamo un file system al suo interno. Possiamo dire che alcuni settori del disco non vengono cancellati?

E-e-e - rullo di tamburi! La risposta sarà quasi sempre sì! Infatti, nella maggior parte dei casi, la creazione di un file system si riduce alla scrittura sul disco solo di pochi blocchi di informazioni di servizio, altrimenti il ​​contenuto della partizione non cambia.

E anche - puramente empiricamente - possiamo supporre che il file system non possa sempre occupare tutto lo spazio assegnatogli fino all'ultimo settore. Ad esempio, un file system FAT16 con una dimensione del cluster di 64 kilobyte ovviamente non può occupare completamente una partizione con una dimensione non multipla di 64 kilobyte. Alla fine di tale sezione dovrà esserci una “coda” di più settori, inaccessibili per la memorizzazione dei dati dell'utente. Tuttavia, questa ipotesi non ha potuto essere confermata sperimentalmente.

Quindi, per massimizzare lo spazio disponibile per lo steganogramma, è necessario utilizzare un file system con una dimensione del cluster maggiore. Puoi anche creare una partizione, anche se non è necessaria (ad esempio su una chiavetta USB). Non è necessario creare sezioni vuote o lasciare aree non assegnate: questo attirerà l'attenzione dei cittadini interessati.

Utilità per esperimenti

Puoi toccare il codice sorgente dell'utilità qui

Per compilare avrai bisogno di Qt versione 5.0 o successiva e OpenSSL. Se qualcosa non funziona, potresti dover modificare il file steganodisk.pro.

Puoi modificare la dimensione del cluster da 4 KB a, ad esempio, 512 byte (in secretfile.h). Allo stesso tempo, il costo delle informazioni di servizio aumenterà: l'intestazione e il checksum occupano 68 byte fissi.

È necessario eseguire l'utilità, ovviamente, con i diritti di utente root e con cautela. Non verranno poste domande prima di sovrascrivere il file o il dispositivo specificato!

Godere.

Fonte: habr.com

Aggiungi un commento