Christian Meng, Consultant des usd HeroLabs, entwickelte zusammen mit Prof. Dr. Harald Baier im Rahmen seiner Abschlussarbeit an der Hochschule Darmstadt ein Open-Source-Tool zur forensischen Datenanalyse und Wiederherstellung gelöschter SQLite-Datensätze „bring2lite“. Im Juli präsentierte Prof. Dr. Harald Baier das Tool auf der DFRWS USA, einer der führenden Konferenzen im Bereich digitaler Forensik.
„Die Forschung in diesem Bereich ist essentiell, um die methodischen und technischen Grundlagen für eine forensische Analyse an die stetig wachsenden Problemstellungen anzupassen“, erklärt Christian Meng. „bring2lite unterstützt bei der Bewältigung der Herausforderungen im Bereich der digitalen Forensik. Ich habe mich sehr darüber gefreut, dass ich unser Tool dem Fachpublikum auf der DFRWS USA vorstellen durfte“, ergänzt Prof. Dr. Harald Baier, Hochschule Darmstadt.
Christian Meng gibt einen Einblick in das Thema:
Applikationen wie zum Beispiel WhatsApp, Skype oder Firefox nutzen alle die Datenbank SQLite. Aus IT-forensischer Sicht ist es sinnvoll und auch nützlich, gelöschte Datensätze wiederherstellen zu können. Folgende Ziele wurden mit der Abschlussarbeit verfolgt:
- Analyse, unter welchen Umständen gelöschte Datensätze in der Datenbank wiederherstellbar sind
- Basierend auf der Analyse ein Open-Source-Tool entwickeln („bring2lite“)
- Vergleich von „bring2lite“ mit anderen bereits etablierten Tools
Analyse:
Innerhalb der Analyse wurden 6 Szenarien definiert, die das Einfügen und Löschen von Daten in eine SQLite-Datenbank beschreiben. Die Szenarien wiesen hierbei eine unterschiedliche Komplexität auf, wie z. B. das Einfügen eines Datensatzes bis hin zu einer definierten Menge, die exakt eine Seite und einen zusätzlichen Datensatz innerhalb des B-Baumes füllt. Jedes dieser Vorgehensmodelle zum Einfügen von Daten wurde danach mit verschiedenen Datenbankeinstellungen wiederholt. Dadurch wurden 72 verschiedene Datenbanken generiert. Bei der Betrachtung dieser Datenbanken konnte festgestellt werden, dass Datenbankeinstellungen wie secure_delete=0, auto_vacuum=0 oder journal_mode=WAL das Extrahieren von gelöschten Datensätzen begünstigen.
Die Arbeitsweise von „bring2lite“:
Das entwickelte Tool „bring2lite“ verarbeitet Strukturen, so wie diese auf der offiziellen Webseite von SQLite definiert sind. Dabei werden, wie in der untenstehenden Grafik zu sehen, 7 einzelne Verarbeitungsprozesse angestoßen. Die beiden letzten Vorgänge beschreiben das Verarbeiten von Dateien, die SQLite zusätzlich erzeugt hat, und wurden in dieser Arbeit nicht berücksichtigt. Auch wenn diese potenziell gelöschte Daten enthalten können, soll lediglich die Wiederherstellbarkeit von Daten aus der eigentlichen Datenbank betrachtet werden.
In Schritt 1 wird die SQLite master table verarbeitet. Diese ist eine Tabelle, welche die Schemata für die Datenbank und den zugehörigen Wurzelknoten des B-Baums speichert, welcher die eigentlichen Daten speichert. Somit kann festgestellt werden, wie das Format und die Datentypen der einzelnen Tabellen und somit der gelöschten Daten aussehen müssen. Die Prozessschritte 3 bis 5 stellen die eigentliche Verarbeitung von gelöschten Daten dar. Freeblocks (Schritt 3) beschreiben einzelne gelöschte Datenbankeinträge innerhalb von regulären Daten. Diese Freeblocks werden als verkettete Liste organisiert, wodurch nur die ersten 4 Bytes des eigentlichen Eintrags überschrieben werden. Durch diese 4 Bytes ist es SQLite nicht mehr möglich, diesen Freeblock als regulären Eintrag zu verarbeiten. Zusätzlich ermöglichen die ersten 2 Bytes der Datenbank, die Adresse des nächsten Freeblocks zu finden und so Zugriff auf alle freigegebenen Speicherbereiche zu haben. Diese Struktur kann somit genutzt werden, um jene Speicherstellen zu finden und mittels der zweiten 2 Bytes (welche die Länge angeben) zu extrahieren.
Der nicht allokierte Bereich, welcher in Schritt 4 verarbeitet wird, befindet sich zwischen dem Header einer B-Baum-Seite (Knoten) und dem Start des Datenbereichs, wie in der oberen Grafik zu sehen. Werden Datensätze gelöscht, die sich am Anfang der Datensektion befinden, so ändert SQLite nur den Zeiger auf den Start der aktiven Daten. Der vermeintlich gelöschte Datensatz ist somit noch intakt. Um diese Daten zu finden, muss lediglich der nicht allokierte Bereich extrahiert und auf die Größe der eigentlichen Daten reduziert werden.
In Schritt 5 werden Freelists extrahiert und verarbeitet. Eine Freelist wird von SQLite dann angelegt, wenn ganze B-Baum Seiten gelöscht werden. Ist dies der Fall, so werden die Inhalte dieser Seiten nicht gelöscht, sondern der Zeiger, der auf diese Seiten zeigt, wird aus dem regulären B-Baum entfernt und zu einer Struktur namens Freelist umgewandelt. Auch diese Struktur kann noch Daten enthalten, welche aus forensicher Sicht wertvoll sind.
Anwendungsbeispiel:
Ist „bring2lite“ installiert, kann es mittels python3 bring2lite/main.py aufgerufen werden. Anschließen gibt das Tool eine Hilfe auf der Kommandozeile aus, die wie folgt aussieht:
Gibt man nun die Pfade zu den jeweiligen SQLite-Datenbanken bzw. zu einem Ordner an, sieht die Verarbeitung der Dateien wie folgt aus:
Für jede Datei, die „bring2lite“ erzeugt, wird direkt nach der Erstellung ein Hash generiert, um die Dateien gegen gewollte als auch ungewollte Veränderungen zu schützen. „bring2lite“ legt für jede Datenbank einen eigenen Hauptordner und für jede Struktur, in der gelöschte Einträge gefunden wurden, einen Ordner an. Dies sieht für die Datenbank 0A-01.db wie folgt aus:
In dieser Datenbank konnten somit gelöschte Datenbankeinträge aus der freelist extrahiert werden. Ebenfalls wird ein Ordner mit dem Schema darin angelegt. Dieser ist nützlich, sobald mehr als eine Tabelle in der Datenbank gespeichert und somit verschiedene Schemas benötigt werden.
Die Datei, die für die Beispieldatenbank erstellt wurde, befindet sich im Ordner /0A-01.db/freelists/freelist_trunk_pages und heißt 2-page.log. Der Name der Datei beschreibt dabei die Seite, auf der die Einträge gefunden wurden. Alle aufbereiteten Daten befinden sich im CSV-Format in der Datei und sehen wie folgt aus:
Der Vergleich verschiedener Tools:
Um eine valide Aussage über die Leistungsfähigkeit von „bring2lite“ zu erhalten, wurden 27 standardisierte Datenbanken verarbeitet und daraufhin überprüft, wie viele gelöschte Einträge wiederhergestellt werden können. „bring2lite“ erreichte dabei eine Wiederherstellungsrate von 52,9 %. Mit diesem Ergebnis arbeitet „bring2lite“ auf den Testdatenbanken effektiver als die 8 Vergleich-Tools.