Eine kurze Einführung
Steganografie, falls sich jemand nicht mehr erinnert, ist das Verstecken von Informationen in bestimmten Behältern. Zum Beispiel in Bildern (diskutiert wurde und ). Daten können auch in den Metadaten von Dateisystemtabellen verborgen werden (darüber wurde geschrieben ), und sogar . Leider haben all diese Methoden einen Nachteil: Um Informationen unauffällig in einen Container einzufügen, sind raffinierte Algorithmen erforderlich, die die spezifischen Eigenschaften des Containers berücksichtigen. Außerdem gibt es Probleme mit der Robustheit des Containers gegenüber Manipulationen: Wenn man ein Bild nur ein wenig bearbeitet, geht die versteckte Information verloren.
Gibt es eine Möglichkeit, ohne raffinierte Algorithmen und feine Manipulationen auszukommen und dennoch die Funktionsfähigkeit des Containers sowie ein akzeptables Maß an Sicherheit für die versteckten Daten zu gewährleisten? Vorausblickend kann ich sagen – ja, das ist möglich! Und ich werde sogar ein Tool vorstellen.
Die blutigen Details der Methode
Die Grundidee ist so einfach wie ein Schlag mit dem Hammer auf den Kopf: Es gibt Bereiche auf der Festplatte, in die das Betriebssystem niemals schreibt (oder nur selten). Um nicht mit komplizierten Algorithmen nach diesen Bereichen suchen zu müssen, nutzen wir Redundanz – das bedeutet, wir duplizieren unsere versteckten Informationen kontinuierlich in allen Sektoren der Festplatte. Direkt über diesem gesamten Überfluss können wir die benötigten Partitionen erstellen, Dateisysteme formatieren, Dateien schreiben und Betriebssysteme installieren – ein Teil der geheimen Daten bleibt trotzdem erhalten und kann extrahiert werden, und die mehrfachen Duplikationen helfen uns dabei, aus den Fragmenten das ursprüngliche Ganze zu rekonstruieren.
Der Vorteil dieser Methode ist offensichtlich: Wir sind unabhängig von Dateiformat und sogar von der Art des verwendeten Dateisystems.
Die Nachteile sind ebenfalls, denke ich, offensichtlich:
- Geheime Daten können nur durch eine vollständige Neubeschreibung der gesamten Festplatte geändert werden, gefolgt von der Wiederherstellung des für den Benutzer sichtbaren Inhalts. Dabei darf keine Software verwendet werden, die die Festplatte aus einem Image wiederherstellt: Diese würde auch die vorherigen geheimen Daten wiederherstellen.
- Je größer das Volumen vertraulicher Daten ist, 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 vertrauliche Daten einfach über die gesamte Festplatte verstreut, diese nur vor dem bloßen Auge verborgen sind. Wenn man jedoch mit einem geeigneten Tool, wie z.B. einem Disk-Editor, darauf zugreift, werden die Daten deutlich sichtbar. Deshalb sollten die Daten besser verschlüsselt werden, um nicht aufzufallen. Wir werden einfach, aber geschmackvoll verschlüsseln: mit dem Algorithmus aes256-cbc. Den Schlüssel zur Verschlüsselung fragen wir den Benutzer, damit er sich ein gutes Passwort ausdenken kann.
Die nächste Frage ist, wie wir „gute“ Daten von beschädigten unterscheiden können. Hierbei hilft uns eine Prüfziffer, und zwar nicht irgendeine, sondern SHA1. Warum nicht? Für Git ist sie gut genug, also wird sie auch uns passen. Beschlossen: Jeder gespeicherte Informationsfragment erhält eine Prüfziffer, und wenn diese nach der Entschlüsselung übereinstimmt, war die Entschlüsselung erfolgreich.
Wir benötigen unbedingt die Fragmentnummer und die gesamte Länge der geheimen Daten. Die Fragmentnummer ist wichtig, um nachzuvollziehen, welche Teile wir bereits entschlüsselt haben und welche noch fehlen. Die Gesamtlänge wird beim Verarbeiten des letzten Fragments hilfreich sein, um keine überflüssigen Daten (sprich Padding) zu erzeugen. Und da wir ohnehin einen Titel anlegen, fügen wir den Namen der geheimen Datei hinzu. Dieser wird nach der Entschlüsselung nützlich sein, um nicht zu rätseln, womit man sie öffnen kann.
Wir testen die Methode in der Praxis
Zur Überprüfung nehmen wir das am häufigsten genutzte Speichermedium – einen USB-Stick. Ich habe einen alten mit 1 GB gefunden, der sich gut für Experimente eignet. Falls Ihnen, wie mir, die Idee gekommen ist, nicht mit physischen Speichermedien zu arbeiten und stattdessen eine Disk-Image-Datei zu testen, muss ich gleich sagen: Das wird nicht klappen. Beim Formatieren eines solchen "Speichermediums" erstellt Linux die Datei neu, und alle unbenutzten Sektoren werden mit Nullen gefüllt.
Als Linux-Maschine mussten wir leider auf die Wetterstation zurückgreifen, die auf dem Balkon lag, und diese auf einem Raspberry Pi 3 betreiben. Der Speicherplatz ist begrenzt, daher werden wir keine großen Dateien verstecken. Wir beschränken uns auf eine maximale Größe von 10 Megabyte. Es macht auch keinen Sinn, zu kleine Dateien zu verstecken: Die Utility schreibt Daten in 4 KB-Clustern auf die Festplatte. Deshalb begrenzen wir uns hier unten auf eine Datei von 3 KB – sie 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 das, was Windows 7 mit einem USB-Stick vorschlägt, auf dem kein Dateisystem vorhanden ist.
- Füllen des USB-Sticks mit allerlei Müll bis zu 50%.
- Füllen des USB-Sticks mit allerlei Müll bis zu 100%.
- Langsame Formatierung im FAT16-Format (mit vollständiger Überschreibung).
Die ersten beiden Tests endeten erwartungsgemäß mit einem vollen Erfolg: Die Utility konnte erfolgreich 10 Megabyte geheime Daten vom USB-Stick extrahieren. Doch als der USB-Stick bis zum Anschlag mit Dateien gefüllt war, trat ein Fehler auf:
Gesamtzahl der gelesenen Cluster: 250752, entschlüsselt: 158
FEHLER: Kann unvollständige secretFile nicht schreiben
Wie wir sehen, konnten nur 158 Cluster erfolgreich entschlüsselt werden (632 Kilobyte an Rohdaten, was 636424 Byte Payload ergibt). Es ist klar, dass hier keine 10 Megabyte zusammenkommen, und unter diesen Clustern gibt es offensichtlich Duplikate. Selbst 1 Megabyte lässt sich auf diese Weise nicht wiederherstellen. Aber wir können garantieren, dass wir 3 Kilobyte geheime Daten von dem USB-Stick wiederherstellen können, selbst nachdem er formatiert und vollständig beschrieben wurde. Experimente zeigen jedoch, dass es möglich ist, eine Datei mit einer Länge von 120 Kilobyte von einem solchen Stick zu extrahieren.
Der letzte Test hat leider gezeigt, dass der USB-Stick vollständig überschrieben wurde:
$ sudo ./steganodisk -p password /dev/sda
Gerätgröße: 250752 Cluster
250700 99%
Insgesamt gelesene Cluster: 250752, entschlüsselt: 0
FEHLER: Kann unvollständige secretFile nicht schreiben
Kein Cluster blieb erhalten… Traurig, aber nicht tragisch! Wir versuchen, vor der formatierung eine Partition auf dem USB-Stick zu erstellen und darin ein Dateisystem einzurichten. Übrigens kam er mit genau so einer Formatierung aus dem Werk, also machen wir nichts Verdächtiges.
Es war zu erwarten, dass der verfügbare Speicherplatz auf dem USB-Stick etwas abgenommen hat.
Es ist auch nicht überraschend, dass 10 Megabyte nicht auf einer vollständig gefüllten Festplatte versteckt werden konnten. Aber jetzt hat sich die Anzahl der erfolgreich entschlüsselten Cluster mehr als verdoppelt!
Gesamt gelesene Cluster: 250.752, entschlüsselt: 405
Ein Megabyte lässt sich leider nicht aus Fragmenten zusammensetzen, aber zweihundert Kilobyte sind kein Problem.
Und die Nachricht von der letzten, vierten Überprüfung ist erfreulich: Eine vollständige Formatierung des USB-Sticks hat nicht zur Zerstörung aller Daten geführt! 120 Kilobyte geheime Informationen passen hervorragend in den ungenutzten Speicher.
Zusammenfassung der Tests:

Ein wenig Theoretisierung: über freien Speicherplatz und ungenutzte Sektoren
Wenn Sie jemals eine Festplatte partitioniert haben, ist Ihnen vielleicht aufgefallen, dass es nicht immer möglich ist, den gesamten freien Speicherplatz auf der Festplatte zu nutzen. Die erste Partition beginnt stets mit einem gewissen Offset (normalerweise 1 Megabyte oder 2048 Sektoren). Hinter der letzten Partition bleibt manchmal auch ein kleiner „Rest“ ungenutzter Sektoren übrig. Und zwischen den Partitionen gibt es manchmal Lücken, wenn auch selten.
Mit anderen Worten, auf der Festplatte gibt es Sektoren, die bei normalem Arbeiten mit der Festplatte nicht zugänglich sind, aber die Daten können in diese Sektoren geschrieben werden! Das bedeutet, dass sie auch gelesen werden können. Allerdings muss man beachten, dass es noch eine Partitionstabelle und einen Bootcode gibt, die sich genau in dem leeren Bereich am Anfang der Festplatte befinden.
Lassen Sie uns kurz von den Partitionen ablenken und die Festplatte aus der Vogelperspektive betrachten. Hier haben wir eine leere Partition auf der Festplatte. Lassen Sie uns darin ein Dateisystem erstellen. Kann man sagen, dass einige Sektoren auf der Festplatte unbeschrieben geblieben sind?
Und — Trommelwirbel! Die Antwort wird fast immer ja sein! Denn in den meisten Fällen besteht die Erstellung eines Dateisystems darin, dass nur einige Blöcke an Verwaltungsinformationen auf die Festplatte geschrieben werden, während der Inhalt der Partition im Übrigen unverändert bleibt.
Und aus rein empirischer Sicht lässt sich vermuten, dass das Dateisystem nicht immer den gesamten für es vorgesehenen Speicher bis zum letzten Sektor ausnutzen kann. Zum Beispiel wird das FAT16-Dateisystem mit einer Clustergröße von 64 Kilobyte offensichtlich nicht in der Lage sein, einen Bereich zu füllen, dessen Größe nicht ein Vielfaches von 64 Kilobyte ist. Am Ende eines solchen Bereichs bleibt ein "Schwanz" von mehreren Sektoren übrig, der für die Speicherung von Benutzerdaten nicht verfügbar ist. Allerdings konnte diese Annahme experimentell nicht bestätigt werden.
Um also den Platz, der für die Steganografie zur Verfügung steht, zu maximieren, sollte ein Dateisystem mit einer größeren Clustergröße verwendet werden. Man könnte auch einen Bereich erstellen, auch wenn das nicht unbedingt erforderlich ist (zum Beispiel auf einem USB-Stick). Es ist nicht notwendig, leere Partitionen zu erstellen oder nicht zugeordnete Bereiche zu lassen — das würde das Interesse stutzig machender Bürger wecken.
Dienstprogramm für Experimente
Die Quellcodes des Dienstprogramms können angesehen werden
Für den Build wird Qt in Version 5.0 oder höher sowie OpenSSL benötigt. Wenn etwas nicht kompiliert, könnte es notwendig sein, die Datei steganodisk.pro zu bearbeiten.
Sie können die Clustergröße von 4 KB auf beispielsweise 512 Byte ändern (in secretfile.h). Dadurch steigen die Kosten für Metainformationen: Header und Prüfziffer benötigen feste 68 Byte.
Die Utility sollte natürlich mit Root-Benutzerrechten ausgeführt werden, und zwar mit Vorsicht. Es werden keine Fragen vor dem Überschreiben der angegebenen Datei oder des Geräts gestellt!
Viel Spaß.
Quelle: habr.com
