browserforensics
Retour à tous les articles

Récupérer l'historique récent depuis les fichiers WAL SQLite

2026-05-19 · 3 min

Chrome et Firefox ouvrent leurs bases principales en mode WAL (PRAGMA journal_mode=WAL). Les transactions sont d'abord ajoutées à <db>-wal ; SQLite les reporte ensuite par checkpoint dans le fichier .db / .sqlite principal. Si vous ne copiez que le fichier principal, vous pouvez perdre silencieusement les visites, téléchargements et cookies les plus récents, soit fréquemment l'activité même qui intéresse l'enquête.

Pourquoi c'est le fichier complémentaire le plus précieux

Le WAL contient des transactions validées. Elles ne sont pas partielles, ni provisoires, simplement pas encore fusionnées. Les navigateurs effectuent un checkpoint à des seuils de taille (par défaut 1 Mo), à l'arrêt propre et sur PRAGMA wal_checkpoint explicite. Une session Chrome en cours peut conserver des heures de visites dans le WAL.

Un arrêt propre vide le WAL dans le fichier principal. Un plantage, une acquisition en cours d'utilisation ou une coupure d'alimentation laisse le WAL rempli.

Ce qu'il faut faire pendant l'acquisition

  • Collectez toujours les fichiers complémentaires -wal et -shm à côté de la base principale.
  • Conservez-les ensemble et avec des noms de base concordants. SQLite ne rattachera que le WAL dont le nom correspond à la base.
  • Ne laissez aucun outil ouvrir la base en lecture-écriture avant la copie. Un sqlite3 history mal placé en lecture-écriture déclenche un checkpoint et remanie le WAL.

Lire ce qui ressemble à des données non validées

Un flux de frames WAL est une séquence d'en-têtes de frame de 24 octets suivis de pages complètes. Chaque frame nomme le numéro de page qu'il écrase et le sel de son commit. Ouvrez la base correspondante et son WAL avec une bibliothèque SQLite récente : la fusion se fait automatiquement. Si vous devez récupérer des lignes supprimées (lignes qui existaient dans des frames WAL plus anciens mais ont été écrasées par la suite), vous avez deux options :

  1. Carving de frames WAL. Parcourez le WAL en dehors de SQLite, exportez chaque frame pour chaque page et reconstruisez l'historique par page. Des outils comme walitean de Sanderson et les plugins SQLite du Sleuth Kit font cela.
  2. Récupération au niveau page depuis la freelist. Même les frames WAL qui ont été checkpointés peuvent avoir écrit des données de lignes supprimées dans des cellules non allouées. Un parcours brut des pages sur la base fusionnée récupère le contenu de la freelist, qui contient souvent les lignes d'historique supprimées telles quelles.

Pièges pratiques

  • Le places.sqlite-wal de Firefox et le History-wal de Chrome suivent les mêmes règles. L'erreur se répète sur les deux.
  • Si l'utilisateur a récemment exécuté « Effacer l'historique de navigation », les lignes sont supprimées mais les pages sous-jacentes peuvent encore les contenir tant que SQLite n'a pas réutilisé les cellules. L'analyse des frames WAL récupère parfois ce qui semblait perdu pour de bon.
  • Les images forensiques montées préservent les fichiers complémentaires. Les scripts de triage à chaud ne le font souvent pas.

Pour aller plus loin