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
-walet-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 historymal 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 :
- 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
waliteande Sanderson et les plugins SQLite du Sleuth Kit font cela. - 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-walde Firefox et leHistory-walde 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.