Brève introduction
La stéganographie, si quelqu'un ne s'en souvient pas, est la dissimulation d'informations dans des conteneurs. Par exemple, en images (discutées
ici et
ici ). Vous pouvez également masquer les données dans les tables de service du système de fichiers (cela a été écrit
ici ), et même
dans les paquets de service du protocole TCP . Malheureusement, toutes ces méthodes ont un inconvénient: pour «intercaler» discrètement des informations dans un conteneur, vous avez besoin d'algorithmes complexes qui prennent en compte les caractéristiques de la structure interne du conteneur. Oui, et avec la résistance du conteneur à la manipulation, des problèmes surviennent: par exemple, si vous modifiez légèrement l'image, des informations cachées sont perdues.
Est-il possible de se passer d'une manière ou d'une autre d'algorithmes astucieux et de manipulations subtiles des données, tout en garantissant les performances du conteneur et un niveau de sécurité acceptable pour les données cachées? Pour l'avenir, je dirai - oui, vous le pouvez! Et même je vais offrir un utilitaire.
Détails de la méthode Bloody
L'idée de base est aussi simple qu'un coup de massue sur le front: il y a des zones sur le disque dans lesquelles le système d'exploitation n'écrit jamais (ou écrit dans de rares cas). Afin de ne pas avoir besoin de rechercher ces zones avec des algorithmes astucieux, nous utiliserons la redondance - c'est-à-dire que nous dupliquerons nos informations cachées sur tous les secteurs du disque plusieurs fois. Ensuite, en plus de toute cette grandeur, vous pouvez créer les partitions nécessaires, formater les systèmes de fichiers, écrire des fichiers et installer le système d'exploitation - de toute façon, une partie des données secrètes sera enregistrée et peut être extraite, et la duplication répétée nous aidera à composer l'ensemble original à partir de morceaux.
L'avantage de cette méthode est évident: nous ne dépendons pas du format de fichier, ni même du type de système de fichiers utilisé.
Les inconvénients sont également, je pense, évidents:
- Les données secrètes ne peuvent être modifiées qu'en réécrivant complètement le disque entier, avec la reconstruction subséquente du contenu visible pour l'utilisateur. En même temps, vous ne pouvez pas utiliser un logiciel qui recrée un disque à partir d'une image: il recréera les données secrètes précédentes.
- Plus la quantité de données classifiées est importante, plus la probabilité de perdre une partie des informations est grande.
- La récupération des données du disque peut prendre du temps. De plusieurs minutes à plusieurs jours (les disques modernes sont grands).
Passons maintenant aux détails.
Il est clair que si vous étalez simplement des données secrètes sur le disque, elles ne seront cachées qu'à l'œil nu. Si vous équipez vos yeux avec, par exemple, un éditeur de disque, les données apparaîtront dans toute leur splendeur. Par conséquent, il serait intéressant de crypter les données afin qu'elles ne clignotent pas. Nous crypterons simple, mais avec goût: selon l'algorithme aes256-cbc. Nous demandons à l'utilisateur la clé de cryptage, laissez-le trouver un bon mot de passe.
La question suivante est de savoir comment distinguer les données «correctes» des données corrompues. Ici, la somme de contrôle nous aidera, mais pas simplement, mais SHA1. Quoi? Pour git, c'est assez bon, ce qui veut dire qu'il nous conviendra. Il a été décidé: nous fournissons à chaque fragment d'informations enregistré une somme de contrôle, et si après le déchiffrement cela coïncidait, alors le déchiffrement a réussi.
Vous avez également besoin du numéro de fragment et de la longueur totale des données secrètes. Numéro de fragment - pour savoir quels morceaux nous avons déjà déchiffrés et lesquels sont restés. La longueur totale nous est utile lors du traitement du dernier fragment, afin de ne pas écrire de données supplémentaires (en d'autres termes, le remplissage). Eh bien, comme nous obtenons toujours un titre, nous y ajouterons le nom du fichier secret. Il vous sera utile après le décryptage afin de ne pas deviner comment l'ouvrir.
Vérifiez la méthode en pratique
Pour vérification, nous prenons le support le plus courant - un lecteur flash. J'en ai trouvé un ancien à 1 Go, ce qui est tout à fait adapté aux expériences. Si vous, comme moi, avez eu l’idée de ne pas prendre un bain de vapeur avec un support physique, mais de tester sur un fichier - une image disque, je dirai tout de suite: ça ne marchera pas. Lors du formatage d'un tel «disque», Linux crée à nouveau le fichier et tous les secteurs inutilisés seront remplis de zéros.
En tant que machine Linux, malheureusement, j'ai dû utiliser la station météo du Raspberry Pi 3 allongée sur le balcon. Il n'y a pas beaucoup de mémoire, donc nous ne cacherons pas de gros fichiers. Nous nous limitons à une taille maximale de 10 mégaoctets. Il n'y a aucun sens à cacher des fichiers trop petits: l'utilitaire écrit les données sur le disque dans des clusters de 4 Ko. Par conséquent, d'en bas, nous nous limitons à un fichier de 3 ko - il s'inscrit dans un tel cluster.
Nous nous moquerons du lecteur flash par étapes, en vérifiant après chaque étape si les informations cachées sont lues:
- Formatage rapide au format FAT16 avec une taille de cluster de 16 ko. C'est ce que Windows 7 propose de faire avec un lecteur flash qui n'a pas de système de fichiers.
- Remplir un lecteur flash avec toutes sortes de déchets de 50%.
- Remplir le lecteur flash avec toutes sortes de déchets est à 100%.
- Formatage "long" au format FAT16 (avec tout écraser).
Les deux premiers tests se sont finalement attendus à une victoire complète: l'utilitaire a réussi à extraire 10 mégaoctets de données sensibles à partir d'un lecteur flash. Mais après que le lecteur flash a été rempli de fichiers vers les globes oculaires, une défaillance s'est produite:
Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile
Comme vous pouvez le voir, seulement 158 clusters ont été décryptés avec succès (632 kilo-octets de données brutes, ce qui donne 636424 octets de charge utile). Il est clair qu'il n'y a aucun moyen d'obtenir 10 mégaoctets, et il y a évidemment des doublons entre ces clusters. Même 1 mégaoctet ne peut pas être restauré de cette façon. Mais il peut être garanti que nous récupérerons 3 kilo-octets de données sensibles à partir d'un lecteur flash même après qu'il soit formaté et écrit sur les globes oculaires. Cependant, les expériences montrent qu'il est tout à fait possible d'extraire un fichier de 120 kilo-octets d'un tel lecteur flash.
Le dernier test, malheureusement, a montré que le lecteur flash était tout écrasé:
$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile
Pas un seul cluster n'a survécu ... Malheureusement, mais pas tragiquement! Essayons de créer une partition sur le lecteur flash avant le formatage, et déjà dedans - le système de fichiers. Soit dit en passant, elle est venue de l'usine avec ce formatage, donc nous ne faisons rien de suspect.
Il est prévu que l'espace disponible sur le lecteur flash soit légèrement réduit.
Il est également prévu que 10 mégaoctets ne puissent toujours pas être cachés sur un lecteur complètement bouché. Mais maintenant, le nombre de clusters décryptés avec succès a plus que doublé!
Total clusters read: 250752, decrypted: 405
Malheureusement, un mégaoctet ne peut pas être assemblé à partir de pièces, mais deux cents kilo-octets sont faciles.
Eh bien, les nouvelles du dernier, 4ème contrôle, cette fois sont joyeuses: le formatage complet d'un tel lecteur flash n'a pas entraîné la destruction de toutes les informations! 120 kilo-octets de données secrètes s'intègrent parfaitement dans l'espace inutilisé.
Tableau récapitulatif des tests:

Un peu de théorie: sur l'espace libre et les secteurs inutilisés
Si vous avez déjà partitionné un disque dur, vous remarquerez peut-être qu'il est loin d'être toujours possible d'allouer tout l'espace libre sur le disque. La première section commence toujours par une indentation (généralement 1 mégaoctet ou 2048 secteurs). Derrière la dernière section, aussi, il arrive, il reste une petite «queue» de secteurs inutilisés. Et parfois, il y a des écarts entre les sections, bien que rarement.
En d'autres termes, il y a des secteurs sur le disque qui ne sont pas accessibles pendant le travail normal avec le disque, mais vous pouvez écrire des données dans ces secteurs! Ce qui signifie aussi lire. Ajusté pour le fait qu'il existe également une table de partition et un code de chargeur de démarrage, qui sont juste situés dans une zone vide au début du disque.
Détournons-nous un instant des cloisons et regardons le disque du haut, pour ainsi dire, du vol d'un oiseau. Ici, nous avons une partition vide sur le disque. Créez-y un système de fichiers. Est-il possible de dire que certains secteurs du disque sont restés déverrouillés?
Et-et-et-roulement de tambour! La réponse sera presque toujours - oui! En effet, dans la plupart des cas, la création d'un système de fichiers se résume au fait que seuls quelques blocs d'informations de service sont écrits sur le disque, mais sinon le contenu de la section ne change pas.
Et pourtant - purement empiriquement - on peut supposer que le système de fichiers ne peut pas toujours occuper tout l'espace qui lui est alloué au dernier secteur. Par exemple, un système de fichiers FAT16 avec une taille de cluster de 64 kilo-octets ne pourra évidemment pas occuper entièrement une partition d'une taille non multiple de 64 kilo-octets. À la fin d'une telle section, une queue doit rester dans plusieurs secteurs, inaccessible pour le stockage des données utilisateur. Cependant, expérimentalement, cette hypothèse n'a pas pu être confirmée.
Ainsi, pour maximiser l'espace disponible pour le stéganogramme, vous devez utiliser un système de fichiers plus grand avec une taille de cluster. Vous pouvez toujours créer une partition, même si elle est facultative (sur un lecteur flash, par exemple). Il n'est pas nécessaire de créer des sections vides ou de laisser des zones non attribuées - cela attirera l'attention des citoyens intéressés.
Utilité pour les expériences
Les sources utilitaires peuvent être trouvées
ici.Pour construire, vous aurez besoin de Qt version 5.0 et supérieure et d'OpenSSL. Si quelque chose ne va pas se produire, vous devrez peut-être corriger le fichier steganodisk.pro.
Vous pouvez modifier la taille du cluster de 4 Ko à, disons, 512 octets (dans secretfile.h). Dans le même temps, les dépenses d'informations officielles augmenteront: l'en-tête et la somme de contrôle occupent 68 octets fixes.
Vous devez bien sûr exécuter l'utilitaire avec les droits d'utilisateur root et avec prudence. Il n'y aura pas de questions avant d'écraser le fichier ou le périphérique spécifié!
Profitez-en.