Eine kurze Einleitung
Steganographie, falls sich jemand nicht erinnert, ist die Versteckung von Informationen in irgendeiner Art von Behältern. Zum Beispiel in Bildern (diskutiert und ). Man kann auch Daten in den Systemtabellen des Dateisystems verstecken (darüber wurde geschrieben ), und sogar . Leider haben all diese Methoden einen Nachteil: Um Informationen unauffällig in einen Container einzufügen, braucht man ausgeklügelte Algorithmen, die die Besonderheiten der inneren Struktur des Containers berücksichtigen. Und die Widerstandsfähigkeit des Containers gegen Manipulationen stellt ebenfalls ein Problem dar: Wenn man zum Beispiel ein Bild etwas bearbeitet, geht die versteckte Information verloren.
Kann man irgendwie ohne ausgeklügelte Algorithmen und feine Manipulationen mit den Daten auskommen und dabei trotzdem die Funktionalität des Containers und ein akzeptables Niveau der Datensicherheit bewahren? Um es vorwegzunehmen: Ja, das ist möglich! Und ich werde sogar ein Tool dafür vorschlagen.
Die blutigen Einzelheiten der Methode
Die Grundidee ist so einfach wie ein Schlag mit einem Knüppel auf die Stirn: Auf der Festplatte gibt es Bereiche, in die das Betriebssystem niemals schreibt (oder nur selten). Um diese Bereiche nicht mit ausgeklügelten Algorithmen suchen zu müssen, nutzen wir Überflüssigkeit – das heißt, wir duplizieren unsere versteckte Information viele, viele Male über alle Sektoren der Festplatte. Dann kann man direkt über all diesem Prunk die notwendigen Partitionen erstellen, die Dateisysteme formatieren, Dateien schreiben und Betriebssysteme installieren – ein Teil der geheimen Daten bleibt trotzdem erhalten und kann extrahiert werden, und das mehrmalige Duplizieren hilft uns, aus den Fragmenten ein ganzes zu erstellen.
Der Vorteil dieser Methode ist offensichtlich: Wir sind weder vom Dateiformat noch vom Typ des verwendeten Dateisystems abhängig.
Die Nachteile sind ebenfalls offensichtlich, denke ich:
- Geheime Daten können nur durch eine vollständige Neuschreibung der gesamten Festplatte geändert werden, gefolgt von der Wiederherstellung des sichtbaren Inhalts für den Benutzer. Dabei darf keine Software verwendet werden, die die Festplatte aus einem Abbild wiederherstellt: Sie stellt auch die vorherigen geheimen Daten wieder her.
- Je größer das Volumen der geheimen Daten, desto höher ist die Wahrscheinlichkeit, dass Teile der Informationen verloren gehen.
- Das Extrahieren von Daten von der Festplatte kann viel Zeit in Anspruch nehmen. Von mehreren Minuten bis zu mehreren Tagen (moderne Festplatten sind größer).
Kommen wir nun zu den Details.
Es ist klar, dass, wenn man geheime Daten einfach über die gesamte Festplatte verstreut, sie nur vor einem unbewaffneten Blick verborgen werden. Wenn man jedoch den Blick mit einem Disk-Editor bewaffnet, erscheinen die Daten in voller Pracht. Daher wäre es gut, die Daten zu verschlüsseln, um nicht aufzufallen. Wir werden es einfach, aber stilvoll machen: nach dem aes256-cbc-Algorithmus. Den Verschlüsselungsschlüssel fragen wir den Benutzer, damit er sich ein gutes Passwort ausdenken kann.
Die nächste Frage ist, wie wir "richtige" Daten von beschädigten unterscheiden können. Hier hilft uns ein Prüfziffer, und nicht irgendein einfacher, sondern SHA1. Warum nicht? Für git ist sie gut genug, also wird sie auch uns passen. Beschlossen: Wir versehen jedes gespeicherte Informationsfragment mit einer Prüfziffer, und wenn sie nach der Entschlüsselung übereinstimmt, war die Entschlüsselung erfolgreich.
Wir benötigen auch die Fragmentnummer und die Gesamtlänge der geheimen Daten. Die Fragmentnummer ist wichtig, um zu verfolgen, welche Teile wir bereits entschlüsselt haben und welche noch übrig sind. Die Gesamtlänge wird bei der Verarbeitung des letzten Fragments nützlich sein, um keine überflüssigen Daten zu schreiben (sprich Padding). Da wir ohnehin eine Kopfzeile haben, fügen wir dort den Namen der geheimen Datei hinzu. Dieser wird nach der Entschlüsselung nützlich sein, um nicht zu raten, womit wir sie öffnen.
Wir testen die Methode in der Praxis
Für den Test nehmen wir das gängigste Medium – einen USB-Stick. Ich habe einen alten mit 1 GB gefunden, der sich gut für Experimente eignet. Wenn auch Ihnen, wie mir, der Gedanke gekommen ist, sich nicht mit physischen Medien abzumühen, sondern es mit einer Datei – einem Image der Festplatte – zu testen, muss ich gleich sagen: Das wird nicht funktionieren. Beim Formatieren einer solchen "Festplatte" erstellt Linux die Datei neu, und alle unbenutzten Sektoren werden mit Nullen gefüllt.
Als Linux-Maschine musste ich leider auf eine Wetterstation mit Raspberry Pi 3 zurückgreifen, die auf dem Balkon lag. Der Speicherplatz ist dort nicht üppig, also werden wir keine großen Dateien verstecken. Wir beschränken uns auf eine maximale Größe von 10 Megabyte. Zu kleine Dateien machen ebenfalls keinen Sinn: Das Tool schreibt Daten auf die Festplatte in Clustern von 4 KB. Daher begrenzen wir uns auf eine Datei von 3 KB – die passt in einen solchen Cluster.
Wir werden schrittweise mit dem USB-Stick experimentieren und nach jedem Schritt überprüfen, ob die versteckten Informationen lesbar sind:
- Schnelles Formatieren im FAT16-Format mit einer Clustergröße von 16 KB. Das ist es, was Windows 7 mit einem USB-Stick tun möchte, auf dem kein Dateisystem vorhanden ist.
- Füllen des USB-Sticks mit allerlei Müll auf 50%.
- Füllen des USB-Sticks mit allerlei Müll auf 100%.
- »Lange« Formatierung im FAT16-Format (mit Überschreibung aller Daten).
Die ersten beiden Tests endeten erwartungsgemäß mit einem vollständigen Erfolg: Das Tool konnte erfolgreich 10 Megabyte geheime Daten vom USB-Stick extrahieren. Nach dem vollständigen Füllen des USB-Sticks kam es jedoch zu einem Fehler:
Insgesamt gelesene Cluster: 250752, entschlüsselt: 158
FEHLER: Kann die unvollständige secretFile nicht schreiben
Wie wir sehen, konnten nur 158 Cluster (632 Kilobyte Rohdaten, was 636424 Bytes nützlicher Daten entspricht) erfolgreich entschlüsselt werden. Es ist klar, dass hier keine 10 Megabyte zusammenkommen, und sicherlich gibt es unter diesen Clustern Duplikate. Selbst 1 Megabyte kann auf diese Weise nicht wiederhergestellt werden. Aber wir können garantieren, dass wir 3 Kilobyte geheime Daten sogar nach der Formatierung und dem vollständigen Füllen des USB-Sticks wiederherstellen können. Experimente zeigen jedoch, dass von einem solchen USB-Stick durchaus eine Datei mit einer Größe von 120 Kilobyte extrahiert werden kann.
Der letzte Test hat leider gezeigt, dass der USB-Stick vollständig überschrieben wurde:
$ sudo .\/steganodisk -p password \/dev\/sda
Gerätegröße: 250752 Cluster
250700 99%
Insgesamt gelesene Cluster: 250752, entschlüsselt: 0
FEHLER: Kann die unvollständige secretFile nicht schreiben
Kein Cluster blieb erhalten... Traurig, aber nicht tragisch! Lassen Sie uns versuchen, vor der Formatierung eine Partition auf dem USB-Stick zu erstellen und darin ein Dateisystem zu implementieren. Übrigens kam es im Auslieferungszustand genau mit dieser Formatierung, daher tun wir nichts Verdächtiges.
Es war zu erwarten, dass der verfügbare Speicherplatz auf dem USB-Stick etwas abgenommen hat.
Es ist auch zu erwarten, dass 10 Megabyte nicht auf einer völlig gefüllten Festplatte versteckt werden konnten. Aber die Anzahl der erfolgreich entschlüsselten Cluster hat sich mehr als verdoppelt!
Gesamtzahl der gelesenen Cluster: 250752, entschlüsselt: 405
Leider kann man aus Teilstücken kein Megabyte zusammensetzen, aber 200 Kilobyte sind im Handumdrehen möglich.
Die Nachricht vom letzten, vierten Test ist diesmal erfreulich: Eine vollständige Formatierung dieses USB-Sticks führte nicht zur Zerstörung aller Informationen! 120 Kilobyte geheime Daten passten hervorragend in den nicht genutzten Speicherplatz.
Zusammenfassung der Tests:

Ein wenig Theorie: über freien Speicherplatz und ungenutzte Sektoren
Wenn Sie jemals eine Festplatte partitioniert haben, haben Sie vielleicht bemerkt, dass es nicht immer möglich ist, den gesamten freien Speicherplatz auf der Festplatte zu nutzen. Die erste Partition beginnt immer mit einem gewissen Versatz (in der Regel 1 Megabyte oder 2048 Sektoren). Hinter der letzten Partition bleibt manchmal auch ein kleiner „Schwanz“ aus ungenutzten Sektoren zurück. Und zwischen den Partitionen bleiben manchmal Lücken, wenn auch selten.
Anders ausgedrückt: Es gibt Sektoren auf der Festplatte, auf die man bei normalem Arbeiten mit der Festplatte keinen Zugriff hat, aber man kann Daten in diese Sektoren schreiben! Das bedeutet, dass man sie auch lesen kann. Vorausgesetzt, dass es noch eine Partitionstabelle und einen Bootloader gibt, die sich in dem leeren Bereich am Anfang der Festplatte befinden.
Lassen Sie uns für einen Moment von den Partitionen ablenken und die Festplatte aus der Vogelperspektive betrachten. Angenommen, wir haben auf der Festplatte eine leere Partition. Können wir sagen, dass einige Sektoren auf der Festplatte nicht überschrieben wurden?
Und jetzt — Trommelwirbel! Die Antwort wird praktisch immer — ja! Denn in den meisten Fällen besteht die Erstellung eines Dateisystems darin, dass nur ein paar Blöcke an Verwaltungsinformationen auf die Festplatte geschrieben werden, während der Rest des Inhalts der Partition unverändert bleibt.
Außerdem kann man rein empirisch annehmen, dass ein Dateisystem nicht immer den gesamten ihm zugewiesenen Speicher bis zum letzten Sektor füllen kann. Zum Beispiel kann ein FAT16-Dateisystem mit einer Clustergröße von 64 Kilobyte offensichtlich nicht vollständig eine Partition mit einer Größe, die kein Vielfaches von 64 Kilobyte ist, ausfüllen. Am Ende einer solchen Partition bleibt ein „Schwanz“ von mehreren Sektoren zurück, der nicht für die Speicherung benutzerspezifischer Daten verfügbar ist. Allerdings konnte diese Annahme experimentell nicht bestätigt werden.
Um den Platz, der für Steganogramme zur Verfügung steht, zu maximieren, sollte man ein Dateisystem mit einer größeren Clustergröße verwenden. Man kann auch eine Partition erstellen, auch wenn das nicht unbedingt erforderlich ist (zum Beispiel auf einem USB-Stick). Es ist nicht nötig, leere Partitionen zu erstellen oder ungenutzte Bereiche zu lassen — das würde die Aufmerksamkeit interessierter Bürger auf sich ziehen.
Experimentelle Utility
Die Quellcodes der Utility können eingesehen werden
Für den Aufbau werden Qt in Version 5.0 und höher sowie OpenSSL benötigt. Falls etwas nicht kompiliert, müssen Sie möglicherweise die Datei steganodisk.pro anpassen.
Die Clustergröße kann von 4 KB auf beispielsweise 512 Byte (in secretfile.h) geändert werden. Dabei steigen die Kosten für die Verwaltungsinformationen: Der Header und die Prüfziffer benötigen fix 68 Byte.
Das Dienstprogramm muss natürlich mit den Rechten des Benutzers root gestartet werden, und zwar mit Vorsicht. Vor dem Überschreiben der angegebenen Datei oder des Geräts gibt es keine Rückfragen!
Genießen Sie es.
Quelle: habr.com
