browserforensics
Zurück zu allen Artikeln

Aktuellen Verlauf aus SQLite-WAL-Dateien wiederherstellen

2026-05-19 · 2 min

Chrome und Firefox öffnen ihre Hauptdatenbanken beide im WAL-Modus (PRAGMA journal_mode=WAL). Transaktionen werden zunächst an <db>-wal angehängt; SQLite überträgt sie später per Checkpoint in die Haupt-.db- oder .sqlite-Datei. Kopieren Sie nur die Hauptdatei, können Sie unbemerkt die jüngsten Besuche, Downloads und Cookies verlieren - häufig genau die Aktivität, um die es in einer Untersuchung geht.

Warum dies die wertvollste Begleitdatei ist

Das WAL enthält bestätigte Transaktionen. Sie sind nicht partiell, nicht vorläufig, sondern lediglich noch nicht zusammengeführt. Browser checkpointen bei Größenschwellen (Standard 1 MB), bei sauberem Herunterfahren und bei explizitem PRAGMA wal_checkpoint. Eine laufende Chrome-Sitzung kann stundenlange Besuche im WAL halten.

Ein sauberes Herunterfahren leert das WAL in die Hauptdatei. Ein Absturz, eine Erfassung während der Nutzung oder ein Stromausfall lassen das WAL gefüllt zurück.

Was Sie bei der Erfassung tun sollten

  • Erfassen Sie immer die -wal- und -shm-Begleitdateien zusammen mit der Haupt-DB.
  • Halten Sie sie zusammen und mit passenden Basisnamen. SQLite hängt nur das WAL an, dessen Name mit der Datenbank übereinstimmt.
  • Lassen Sie kein Werkzeug die Datenbank vor dem Kopieren im Read-Write-Modus öffnen. Ein versehentliches sqlite3 history im Read-Write-Modus löst einen Checkpoint aus und mischt das WAL neu.

Scheinbar nicht bestätigte Daten lesen

Ein WAL-Frame-Stream ist eine Folge aus 24-Byte-Frame-Headern und vollständigen Seiten. Jeder Frame benennt die Seitennummer, die er überschreibt, und das Salt seines Commits. Öffnen Sie die zusammengehörige DB plus WAL mit einer aktuellen SQLite-Bibliothek und der Merge erfolgt automatisch. Wenn Sie gelöschte Zeilen wiederherstellen müssen (Zeilen, die in älteren WAL-Frames existierten, später aber überschrieben wurden), haben Sie zwei Optionen:

  1. WAL-Frame-Carving. Gehen Sie das WAL außerhalb von SQLite durch, dumpen Sie jeden Frame jeder Seite und rekonstruieren Sie die Seitenhistorie. Werkzeuge wie Sandersons walitean und die SQLite-Plugins des Sleuth Kit tun dies.
  2. Wiederherstellung auf Seitenebene aus der Freelist. Selbst bereits gecheckpointete WAL-Frames können gelöschte Zeilendaten in nicht allozierten Zellen hinterlassen. Ein Raw-Page-Walker über die gemergte DB stellt die Freelist-Inhalte wieder her, die häufig die gelöschten Verlaufszeilen wortgetreu enthalten.

Praktische Fallstricke

  • Firefox' places.sqlite-wal und Chromes History-wal folgen denselben Regeln. Derselbe Fehler wiederholt sich bei beiden.
  • Wenn der Benutzer kürzlich „Verlauf löschen" ausgeführt hat, sind die Zeilen gelöscht, doch die zugrunde liegenden Seiten können sie weiterhin enthalten, bis SQLite die Zellen wiederverwendet. Die WAL-Frame-Analyse rettet manchmal, was endgültig verloren schien.
  • Gemountete forensische Images bewahren die Begleitdateien. Live-Triage- Skripte tun das oft nicht.

Weiterführende Lektüre