Skip to content

Glossaire

Journal d'écriture anticipée (WAL)

Mode de journalisation SQLite : les modifications validées sont ajoutées à un fichier -wal avant d'être recopiées dans la base lors d'un checkpoint.

Le journal d'écriture anticipée (write-ahead log, WAL) est l'un des modes de journalisation de SQLite. Au lieu de modifier directement le fichier de base, SQLite ajoute chaque page modifiée, sous forme de trame, à un fichier distinct nommé <database>-wal, et ne touche pas au fichier principal jusqu'à ce qu'un checkpoint y recopie les pages (sqlite.org). Les lecteurs combinent les deux : pour chaque page, ils utilisent la version validée la plus récente du WAL s'il y en a une, sinon celle du fichier de base. Un troisième fichier, -shm, est un index en mémoire partagée que SQLite peut reconstruire et qui ne contient aucune preuve supplémentaire.

Le WAL commence par un en-tête de 32 octets (nombre magique, taille de page, numéro de séquence de checkpoint, deux valeurs de sel et des sommes de contrôle). Chaque trame se compose d'un en-tête de 24 octets suivi d'une page complète. L'en-tête de trame enregistre le numéro de page, un marqueur de validation (commit), les sels et des sommes de contrôle cumulées, ce qui permet à un lecteur d'ignorer les transactions non validées et les trames restantes d'une génération précédente du WAL.

Pourquoi c'est important dans une investigation

wpndatabase.db fonctionne en mode WAL. Les notifications les plus récentes ne se trouvent donc souvent que dans wpndatabase.db-wal, et une base copiée sans son WAL, ou à un autre moment, les perd ou mélange des états. Le WAL peut aussi contenir plusieurs versions d'une même page : les trames plus anciennes peuvent encore contenir des lignes de notification supprimées par la suite, ce qui en fait une source de récupération, au même titre que les freeblocks et la freelist.

Exemple

wpndatabase.db-wal
  En-tête WAL (32 octets) : sel-1, sel-2 ...
  Trame 1 : page 5, pas une trame de commit
  Trame 2 : page 4, trame de commit    -> transaction 1 validée
  Trame 3 : page 4, trame de commit    -> version plus récente de la page 4
  Trame 4 : page 9, aucun commit ensuite -> ignorée

Ici, la page 4 existe en trois versions : celle du fichier, celle de la trame 2 et celle de la trame 3. Le parseur applique les trames 1 à 3, signale les lignes présentes uniquement ou différemment dans le WAL, et analyse les anciennes versions à la recherche de lignes supprimées.

Termes associés

Chargez la base avec son -wal dans le Windows Notification Parser, et suivez le guide de collecte pour collecter les deux au même instant.