Dateisysteme · Lektion 2 von 8
Wie Dateisysteme Daten speichern: Cluster, Zuordnung, Slack und nicht zugeordneter Speicherplatz
10 Min. Lesezeit
Ein Dateisystem macht aus den Rohsektoren eines Volumes benannte Dateien. Es speichert Inhalte in Einheiten fester Größe, verzeichnet, welche Einheiten belegt sind, und verwaltet Metadaten und Namen in separaten Strukturen, die jeweils unabhängig voneinander erhalten bleiben oder gelöscht werden können. Dieses Verständnis ermöglicht es einem Prüfer zu erklären, warum eine gelöschte Datei wiederherstellbar ist, woher ein altes Fragment stammt und was dieses Fragment belegen kann und was nicht. Spätere Lektionen wenden dieses Modell auf NTFS, FAT, ext4 und APFS an.
Ein Denkmodell: Carriers fünf Kategorien
Brian Carrier (Forensische Analyse von Dateisystemen, 2005) ordnet Dateisystemdaten fünf Kategorien zu. Das Modell gilt für jedes Dateisystem und veranlasst Sie zu fragen, zu welcher Kategorie ein Beweismittel gehört.
| Kategorie | Inhalt | Beispiele |
|---|---|---|
| Dateisystem | Aufbau und Größe des Dateisystems als Ganzes | NTFS-Bootsektor, FAT-Bootsektor (BPB), ext4-Superblock |
| Inhalt | Die Dateneinheiten, die Dateiinhalte enthalten, und ihr Zuordnungsstatus | Cluster oder Blöcke, NTFS $Bitmap, ext4-Blockbitmaps |
| Metadaten | Daten, die eine Datei beschreiben: Größe, Zeitstempel, Eigentümer, Speicherort ihres Inhalts | NTFS-MFT-Datensätze, ext4-Inodes, Metadatenfelder eines FAT-Verzeichniseintrags |
| Dateiname | Namen und die Verzeichnisse, die Namen mit Metadaten verknüpfen | NTFS-Verzeichnisindizes $I30, ext4-Verzeichniseinträge, FAT-Namensfelder |
| Anwendung | Funktionen, die das Dateisystem zum Speichern von Dateien nicht benötigt | NTFS $LogFile und $UsnJrnl, ext4-Journal, Datenträgerkontingente |
Die Kategorien können unabhängig voneinander verloren gehen. Ein Name kann erhalten bleiben, nachdem sein Metadateneintrag wiederverwendet wurde, ein Metadateneintrag kann auf Cluster verweisen, die inzwischen zu einer anderen Datei gehören, und Inhalte können ohne Namen oder Metadaten erhalten bleiben. Viele Fehler in Berichten entstehen dadurch, dass Beweismittel einer Kategorie als Beleg für etwas in einer anderen Kategorie behandelt werden.
Cluster, Blöcke und Zuordnungseinheiten
Ein Datenträger wird in Sektoren adressiert, üblicherweise mit 512 Byte (einige Laufwerke verwenden Sektoren mit 4.096 Byte; „512e“-Laufwerke stellen logische Sektoren mit 512 Byte auf physischen Sektoren mit 4.096 Byte bereit). Ein Dateisystem fasst eine feste Anzahl aufeinanderfolgender Sektoren zu einem Cluster (FAT, exFAT und NTFS), einem Block (ext4) oder allgemein einer Zuordnungseinheit zusammen. Die Größe wird bei der Formatierung festgelegt und in der Kategorie Dateisystem verzeichnet. Bei NTFS speichert der Bootsektor die Bytes pro Sektor am Offset 0x0B und die Sektoren pro Cluster am Offset 0x0D. NTFS-Volumes verwenden häufig Cluster mit 4.096 Byte, ext4 verwendet häufig Blöcke mit 4.096 Byte.
Der Cluster ist die kleinste Einheit, die ein Dateisystem einer Datei zuweisen kann, da die Zuordnungsstrukturen pro Cluster einen Status verwalten; die Verwaltung jedes einzelnen Sektors oder Bytes würde diese Strukturen erheblich größer und langsamer machen. Eine Datei belegt daher eine ganzzahlige Anzahl von Clustern, selbst wenn sie nur ein Byte lang ist. Ihre logische Größe ist die Anzahl der Bytes, die die Datei enthält. Ihre physische (zugeordnete) Größe ist die Anzahl der Cluster × Clustergröße. Die Differenz ist der Datei-Slack.
Bei NTFS gibt es eine Ausnahme. Eine sehr kleine Datei kann resident innerhalb ihres MFT-Datensatzes gespeichert werden und verwendet dann überhaupt keine Cluster. Lektion 1.3 behandelt residente Daten.
Zuordnungsstrukturen
Jedes Dateisystem verzeichnet, welche Cluster belegt sind:
- NTFS verwendet
$Bitmap(MFT-Datensatz 6), das ein Bit pro Cluster enthält (1 = zugeordnet). Die Belegung von MFT-Datensätzen wird separat im Attribut$BITMAPvon$MFTund im Belegt-Flag (0x0001) im Header jedes Datensatzes verwaltet. - FAT12/16/32 verwenden die Dateizuordnungstabelle, die einen Eintrag pro Cluster enthält. 0 bedeutet frei; andere Werte geben den nächsten Cluster in der Kette, das Kettenende oder einen fehlerhaften Cluster an. FAT32-Einträge sind 32 Bit breit, wobei die unteren 28 Bit verwendet werden. Bei FAT dient die Tabelle sowohl als Zuordnungsübersicht als auch als Verzeichnis der Speicherorte der Inhalte jeder Datei.
- exFAT verwendet eine Zuordnungsbitmap und nutzt die FAT hauptsächlich für fragmentierte Dateien.
- ext4 verwendet Blockbitmaps und Inode-Bitmaps für jede Blockgruppe.
Was das „Löschen“ einer Datei üblicherweise bewirkt
Bei den meisten Dateisystemen ändert das Löschen einer Datei den Zuordnungsstatus. Der Inhalt wird nicht gelöscht. Typische Ergebnisse:
- NTFS: Das Belegt-Flag im MFT-Datensatz wird zurückgesetzt, die Bits der Datei in
$Bitmapwerden auf 0 gesetzt und der Eintrag wird aus dem Index des übergeordneten Verzeichnisses entfernt. Der Datensatz behält üblicherweise seine Attribute, Zeitstempel und Data Runs bis zu seiner Wiederverwendung. - FAT: Das erste Byte des Verzeichniseintrags wird auf 0xE5 gesetzt, und die Kette der Datei in der FAT wird auf 0 (frei) gesetzt. Der Verzeichniseintrag enthält üblicherweise weiterhin die Größe und den Startcluster (bei FAT32 setzen einige Implementierungen dessen obere 16 Bit zurück), aber die Kette, die die übrigen Cluster verbindet, ist verloren.
- ext3/ext4: Der Inode und seine Blöcke werden als frei markiert. Die Informationen zu den Speicherorten der Blöcke im Inode werden häufig ebenfalls gelöscht, was die Wiederherstellung anhand von Metadaten erschwert.
In jedem Fall bleibt der Inhalt in den Clustern, bis er überschrieben wird. Bei Solid-State-Laufwerken kann TRIM bewirken, dass freigegebene Blöcke beim Lesen Nullen zurückgeben, obwohl keine neuen Daten geschrieben wurden. Lektion 1.8 vergleicht die Wiederherstellung anhand von Metadaten mit File Carving.
Fragmentierung
Eine Datei ist fragmentiert, wenn ihre Cluster nicht zusammenhängend liegen; NTFS verzeichnet die Teile als Data Runs und FAT als Verknüpfungen in der Clusterkette. Bei intakten Metadaten spielt dies keine Rolle, da jeder Run aufgeführt ist. Ohne Metadaten ist es jedoch relevant: Ein Carving-Werkzeug, das zusammenhängende Speicherung voraussetzt, fügt nicht zugehörige Cluster an das erste Fragment an.
Datei-Slack: RAM-Slack und Drive-Slack
Datei-Slack (auch Cluster-Slack genannt) ist der Speicherbereich zwischen dem Ende der logischen Dateigröße und dem Ende des letzten Clusters der Datei. Er besteht aus zwei Teilen:
- RAM-Slack reicht vom Ende der Dateidaten bis zum Ende des Sektors, der diese enthält. Der Datenträger schreibt ganze Sektoren, daher muss das Betriebssystem Bytes bereitstellen, um ihn aufzufüllen. Die Bezeichnung stammt von älteren Systemen wie MS-DOS und frühen Windows-Versionen auf FAT, die ihn mit dem jeweils vorhandenen Inhalt des Speicherpuffers füllten. Aktuelle Windows-Versionen schreiben dort Nullen. Auf einem NTFS-Volume, das von einem modernen Windows-System beschrieben wurde, sollten Sie daher erwarten, dass der RAM-Slack mit Nullen gefüllt ist. Wenn Sie RAM-Slack mit Werten ungleich null finden, erklären Sie dies (ein älteres Betriebssystem, ein anderer Treiber oder ein anderes Werkzeug oder ein anderes Dateisystem als NTFS), statt es einfach vorauszusetzen.
- Drive-Slack, auch residualer Slack genannt, besteht aus den vollständigen Sektoren im letzten Cluster nach dem Sektor, der das Dateiende enthält. Sie werden nicht beschrieben und behalten daher den zuvor vorhandenen Inhalt, häufig einen Rest einer früheren, gelöschten Datei.
Wenn eine Datei später verkleinert wird, wird ihr eigener früherer Inhalt jenseits des neuen Endes zu Slack.
Durchgerechnetes Beispiel
Eine Datei hat eine logische Größe von 10.000 Byte. Sie befindet sich auf einem Volume mit Clustern von 4.096 Byte und Sektoren von 512 Byte (8 Sektoren pro Cluster).
- Benötigte Cluster: 10.000 ÷ 4.096 = 2,44, aufgerundet auf 3 Cluster.
- Zugeordnete Größe: 3 × 4.096 = 12.288 Byte.
- Datei-Slack: 12.288 − 10.000 = 2.288 Byte.
- Daten im letzten Cluster: 10.000 − (2 × 4.096) = 10.000 − 8.192 = 1.808 Byte.
- In diesem Cluster verwendete Sektoren: 1.808 ÷ 512 = 3 Rest 272. Das sind drei vollständige Sektoren plus 272 Byte im vierten Sektor.
- RAM-Slack: 512 − 272 = 240 Byte, an den Offsets 1.808–2.047 innerhalb des Clusters.
- Drive-Slack: 8 − 4 = 4 vollständige Sektoren, also 4 × 512 = 2.048 Byte, an den Offsets 2.048–4.095.
- Kontrolle: 240 + 2.048 = 2.288, was mit Schritt 3 übereinstimmt.
Um diese Bereiche im Abbild zu lokalisieren, nehmen Sie ein NTFS-Volume an (Cluster 0 beginnt im ersten Sektor des Volumes), das bei Sektor 2.048 beginnt und dessen letzter Cluster die Clusternummer 120.000 hat:
| Element | Berechnung | Byte-Offset im Abbild |
|---|---|---|
| Volume-Anfang | 2.048 × 512 | 1.048.576 |
| Anfang von Cluster 120.000 | 1.048.576 + 120.000 × 4.096 | 492.568.576 |
| Anfang des RAM-Slacks | 492.568.576 + 1.808 | 492.570.384 |
| Anfang des Drive-Slacks | 492.568.576 + 2.048 | 492.570.624 |
Volume-Slack und Partitionslücken
Daten können auch außerhalb jedes Dateisystems liegen.
- Volume-Slack ist der Speicherbereich zwischen dem Ende des Dateisystems und dem Ende des Volumes, das es enthält. Er entsteht, wenn die Volume-Größe kein genaues Vielfaches der Clustergröße ist, wenn das Dateisystem kleiner als seine Partition angelegt wurde oder wenn die Partition später vergrößert wurde.
- Partitionslücken sind Sektoren, die von keiner Partition abgedeckt werden. Beispiele sind die Sektoren zwischen der Partitionstabelle und der ersten Partition (Sektoren 1–2.047 auf einem MBR-Datenträger, dessen erste Partition bei Sektor 2.048 beginnt), Speicherbereiche zwischen zwei Partitionen und Speicherbereiche nach der letzten Partition.
Diese Bereiche enthalten üblicherweise Nullen oder Überreste früherer Partitionierungen; Daten ungleich null in diesen Bereichen bedürfen einer Erklärung, da Werkzeuge zum Verbergen von Daten sie nutzen. Lektion 1.1 zeigt, wie Sie sie lokalisieren.
Nicht zugeordneter Speicherplatz gegenüber freiem Speicherplatz
Nicht zugeordneter Speicherplatz ist die Menge der Cluster, die die Zuordnungsstruktur als nicht belegt kennzeichnet. Es handelt sich um einen Status, nicht um eine Beschreibung des Inhalts. Freier Speicherplatz ist die Kapazität, die das Betriebssystem als verfügbar meldet. Er wird aus demselben Status abgeleitet, sagt jedoch nichts über den Inhalt aus: „20 GB frei“ können 20 GB wiederherstellbare gelöschte Daten sein. Schreiben Sie in einem Bericht „nicht zugeordnet“, niemals „leer“. Nicht partitionierter Speicherplatz ist wiederum etwas anderes, da er außerhalb jedes Dateisystems liegt.
Was die einzelnen Bereiche belegen können und was nicht
| Bereich | Kann zeigen | Kann allein nicht zeigen |
|---|---|---|
| Zugeordnete Datei | Inhalt, der mit einem Namen, Zeitstempeln und einem Eigentümer verknüpft ist | Wer den Inhalt erstellt hat, sofern andere Quellen dies nicht bestätigen |
| Gelöschte Datei, Metadaten intakt | Früherer Name, Größe, Zeitstempel, Speicherort des Inhalts | Dass der Inhalt noch unverändert ist, da Cluster wiederverwendet worden sein können |
| Datei-Slack | Dass die Daten vor dem letzten Schreibvorgang der aktuellen Datei im Cluster waren oder dort absichtlich abgelegt wurden | Wann sie geschrieben wurden, zu welcher Datei sie gehörten oder welcher Benutzer sie geschrieben hat |
| Nicht zugeordneter Speicherplatz | Dass die Daten irgendwann auf dieses Volume geschrieben wurden | Wann, von wem oder unter welchem Namen, sofern der Inhalt keine eigenen internen Metadaten enthält |
| Volume-Slack, Partitionslücken | Dass Daten außerhalb des Dateisystems vorhanden sind | Wie oder wann sie dorthin gelangt sind |
Inhalte im Slack und im nicht zugeordneten Speicherplatz haben keine Dateisystemmetadaten. Angaben zu Datum oder Verfasser müssen aus dem Inhalt selbst stammen, etwa aus den internen Metadaten eines Dokuments oder einem Zeitstempel in einer Protokollzeile, und müssen durch weitere Belege bestätigt werden.
Wie Werkzeuge diese Bereiche zugänglich machen
The Sleuth Kit bietet Befehle für jede Kategorie. fls -d listet gelöschte Dateinamen auf (ergänzen Sie -r für eine rekursive Auflistung, -p für vollständige Pfade und -o für den Sektor-Offset der Partition). istat zeigt einen Metadateneintrag an. blkstat zeigt an, ob ein Cluster zugeordnet ist. ifind -d findet den Metadateneintrag, der auf einen bestimmten Cluster verweist. blkls extrahiert standardmäßig nicht zugeordnete Dateneinheiten (-A). Mit -s extrahiert es Slack und mit -e jede Einheit. Wird ein Suchworttreffer in der Ausgabe von blkls gefunden, rechnet blkcalc -u <unit> die Einheitennummer zurück in die Clusteradresse im ursprünglichen Volume um. Autopsy zeigt dieselben Bereiche als Ansichten gelöschter Dateien, virtuelle „Unalloc“-Dateien und dateispezifische -slack-Dateien an.
Prüfungsschwerpunkt: Rechnen Sie damit, aus Dateigröße, Clustergröße und Sektorgröße die zugeordnete Größe, den Datei-Slack, den RAM-Slack und den Drive-Slack berechnen sowie eine Clusternummer in einen Byte-Offset umrechnen zu müssen. Fragen können auch betreffen, was das Löschen auf einem bestimmten Dateisystem verändert und welche Aussagen Inhalte im Slack oder im nicht zugeordneten Speicherplatz über Zeit und Urheberschaft erlauben.
Kernpunkte
- Carriers fünf Kategorien (Dateisystem, Inhalt, Metadaten, Dateiname, Anwendung) können unabhängig voneinander erhalten bleiben oder verloren gehen. Benennen Sie daher bei jedem Beweismittel die Kategorie.
- Der Cluster ist die kleinste Zuordnungseinheit. Die zugeordnete Größe einer Datei entspricht ihrer Clusteranzahl × Clustergröße; die Differenz zu ihrer logischen Größe ist der Datei-Slack.
- Das Löschen verändert normalerweise den Zuordnungsstatus und die Metadaten. Der Inhalt bleibt erhalten, bis er überschrieben oder auf SSDs möglicherweise durch TRIM beeinflusst wird.
- RAM-Slack ist unter modernem Windows/NTFS normalerweise mit Nullen gefüllt. Drive-Slack besteht aus unbeschriebenen Sektoren, die Überreste einer früheren Datei enthalten können.
- Nicht zugeordneter Speicherplatz bezeichnet einen Status, nicht Leere. Dort oder im Slack gefundene Inhalte können ohne unabhängige Belege weder datiert noch einem Urheber zugeordnet werden.