browserforensics
Zurück zu allen Artikeln

Chrome Local Storage & IndexedDB (LevelDB)

2026-05-19 · 2 min

Neben den SQLite-Dateien hält Chrome den Web-App-Zustand in LevelDB-Schlüssel-Wert-Speichern. Die meisten Ermittler überspringen sie und verpassen die ergiebigste Quelle für Absichtsbeweise auf dem Rechner. Eine angemeldete Identität, eine Entwurfsnachricht, ein OAuth-Token, die URL eines vom Benutzer geöffneten Drive-Dokuments - diese Daten liegen in Local Storage oder IndexedDB, nicht in History.

Wo es im Profil liegt

Local Storage/leveldb/             # window.localStorage je Origin
Session Storage/                   # Session Storage je Tab
IndexedDB/<origin>.indexeddb.leveldb/    # strukturierte App-Datenbanken
IndexedDB/<origin>.indexeddb.blob/        # große Blobs, referenziert vom LDB

Jeder Eintrag ist ein Ordner, keine einzelne Datei: CURRENT, MANIFEST-NNNNNN, eine oder mehrere *.ldb-SSTables und ein *.log-Write-Ahead-Log. Kopieren Sie das gesamte Verzeichnis, sonst weigert sich LevelDB, es zu öffnen.

Das Format, das Sie wirklich lesen müssen

LevelDB ist ein LSM-Baum. Um Schlüssel korrekt aufzuzählen:

  1. Lesen Sie CURRENT, um das aktive Manifest zu finden.
  2. Laufen Sie durch MANIFEST-*, um zu erfahren, welche SSTables auf welcher Ebene live sind.
  3. Mergen Sie die Live-SSTables mit dem *.log-WAL; der jüngste Schreibvorgang gewinnt pro Schlüssel.
  4. Dekomprimieren Sie Snappy pro Block, falls der Trailer das angibt.

Die Werte erfordern dann eine formatspezifische Dekodierung:

  • Local-Storage-Schlüssel sind _<origin>\x00<key>. Werte beginnen mit einem 1-Byte-Kodierungsmarker: 0x00 UTF-16LE, 0x01 Latin-1, manchmal vorangestellt von einem Meta-Byte.
  • Session Storage verwendet eine namespace -> map -> key-Indirektion. Über die Meta-Namespace-Schlüssel auflösen, bevor Werte extrahiert werden.
  • IndexedDB-Werte sind V8-Structured-Clone-kodiert. Zahlen, Strings und einfache Objekte gehen sauber hin und zurück; zyklische Referenzen und typed arrays brauchen sorgfältige Behandlung.

Was Sie hier an echten Beweisen finden

  • Slack, Teams, Discord, Notion: eingeloggte Benutzer-IDs, Workspace-IDs, zuletzt geöffnete Kanäle, Entwurfsnachrichten.
  • Google Docs / Drive: Datei-IDs (der lange zufällige Teil einer Drive-URL), zuletzt bearbeitete Dokumenttitel, Synchronisierungsstatus.
  • VS Code Web / GitHub Codespaces: geöffnete Dateipfade, Repository-Namen.
  • Banking und SSO: JWT-Token mit noch lesbaren Claims (Audience, Issuer, Ablauf, manchmal Benutzername).
  • Krypto-Wallets: gespeicherte Adressen, oft die Wallet-Kennung.

Vorbehalte

  • Im WAL (*.log) liegen die jüngsten Schreibvorgänge. Wenn Sie nur die *.ldb-Dateien kopieren, verlieren Sie die letzten Minuten Aktivität.
  • LevelDB-Compaction kann Tombstones für gelöschte Schlüssel erzeugen, die während des Merges noch auftauchen. Behandeln Sie unerklärliche NULs in Ihrer Ausgabe als Löschungen, nicht als Daten.
  • Browser migrieren gelegentlich Origins zwischen LevelDB-Stores. Ein sauberer Shutdown ist freundlicher; ein Absturz während der Migration kann verwaiste Daten hinterlassen, die manuelle Wiederherstellung wert sind.

Weiterführende Lektüre