Safari History.db : historique de navigation macOS
History.db de Safari, bases de profils, Downloads.plist et onglets sous macOS : quelles pages ont été visitées, quand, et ce qui a été effacé.
- Emplacement
- ~/Library/Safari/History.db
- Prouve
- Quelles URL un utilisateur macOS a ouvertes dans Safari, quand, par quelles redirections, et si l'historique a été effacé
- Horodatages
- Temps absolu Mac (Cocoa, secondes depuis le 2001-01-01 UTC), stocké en REAL
- Accès
- Accès complet au disque pour le processus lecteur (TCC) ; root seul ne suffit pas
- Rétention
- Réglage utilisateur, un an par défaut ou conservé jusqu'à effacement manuel ; liste des téléchargements : un jour par défaut
- Collecte
- Aftermath, mac_apt, UAC
Outils
Comparer tous les outils- Browser ForensicsNavigateur
- mac_aptCLI · open source
- APOLLOCLI · open source
- sqlite3CLI · intégré à macOS
- plutilCLI · intégré à macOS
Ce que c'est
Safari conserve son historique de navigation dans une base SQLite nommée History.db. Chaque URL unique occupe une ligne dans history_items et chaque chargement de page une ligne dans history_visits : la base répond donc à la fois à « l'utilisateur est-il déjà allé ici ? » et à « quand exactement, et combien de fois ? ». Depuis l'arrivée des profils avec Safari 17, le profil par défaut écrit toujours dans ~/Library/Safari/History.db, tandis que chaque profil supplémentaire dispose de son propre History.db dans le conteneur sandbox de Safari.
Autour de la base d'historique gravitent plusieurs fichiers compagnons : Downloads.plist (la liste des téléchargements), SafariTabs.db (onglets ouverts, groupes d'onglets et noms de profils), CloudTabs.db (onglets ouverts sur les autres appareils iCloud de l'utilisateur), RecentlyClosedTabs.plist et, selon les versions, LastSession.plist. Cette page sert de référence rapide ; le guide d'analyse forensique de Safari détaille l'analyse.
Où il se trouve
| Fichier | Chemin | Versions / remarques |
|---|---|---|
| Historique (profil par défaut) | ~/Library/Safari/History.db (+ -wal, -shm, -lock) | 10.10 Yosemite et ultérieur ; History.plist auparavant |
| Historique (profils supplémentaires) | ~/Library/Containers/com.apple.Safari/Data/Library/Safari/Profiles/<UUID>/History.db | Safari 17 et ultérieur |
| Téléchargements | ~/Library/Safari/Downloads.plist | Plist binaire |
| Onglets, groupes d'onglets, noms de profils | ~/Library/Containers/com.apple.Safari/Data/Library/Safari/SafariTabs.db | Organisation en conteneur de Safari 15 et ultérieur |
| Onglets iCloud | ~/Library/Containers/com.apple.Safari/Data/Library/Safari/CloudTabs.db | Les versions plus anciennes le plaçaient dans ~/Library/Safari |
| Onglets fermés récemment | ~/Library/Safari/RecentlyClosedTabs.plist | Présent lorsque des onglets ont été fermés |
| Dernière session | ~/Library/Safari/LastSession.plist | Absent de certaines versions |
| Sites favoris (Top Sites) | ~/Library/Safari/TopSites.plist et TopSites.plist par profil | |
| Aperçus d'onglets | ~/Library/Containers/com.apple.Safari/Data/Library/Caches/com.apple.Safari/TabSnapshots/Metadata.db | Miniatures de pages en cache |
| Préférences | ~/Library/Containers/com.apple.Safari/Data/Library/Preferences/com.apple.Safari.plist | Anciennement : ~/Library/Preferences/com.apple.Safari.plist |
Protection : ~/Library/Safari et le conteneur Safari sont protégés par TCC (Mojave et ultérieur). Un processus sans accès complet au disque obtient Operation not permitted, même avec sudo. Sur une image montée en analyse à froid, TCC ne s'applique pas.
Ce qu'il prouve
- Quelles URL ont été chargées dans Safari et à quelle heure, visite par visite.
- Si un chargement a réussi (
load_successful), et la chaîne de redirections ayant mené à une page d'arrivée (redirect_source/redirect_destination). - Les titres de pages tels qu'ils étaient au moment de la visite (
history_visits.title), et les termes de recherche contenus dans les URL de résultats. - Que l'utilisateur a délibérément effacé l'historique :
history_tombstonesenregistre la plage de temps ou l'URL effacée. - Quels fichiers Safari a téléchargés et où ils ont été enregistrés (
Downloads.plist), tant que la liste n'a pas été vidée. - Quels onglets étaient ouverts, épinglés ou groupés, et à quel profil ils appartenaient (
SafariTabs.db).
Il ne prouve pas :
- Que la personne au clavier a lu la page, ni qu'une visite a eu lieu sur ce Mac : la synchronisation iCloud de l'historique peut importer des visites d'autres appareils (voir la colonne
origin, et validez ses valeurs sur un système de référence avant de vous y fier). - L'activité de navigation privée : les fenêtres privées n'écrivent pas de visites dans
History.db. - L'activité dans d'autres navigateurs (voir Chrome et Firefox).
Champs clés
| Table / fichier | Champ | Signification |
|---|---|---|
history_items | id, url | URL unique (une ligne par URL) |
history_items | domain_expansion | Libellé court du site dérivé du domaine |
history_items | visit_count | Compteur cumulé de visites |
history_visits | history_item | Clé étrangère vers history_items.id |
history_visits | visit_time | Heure de la visite (temps absolu Mac, REAL) |
history_visits | title | Titre de la page au moment de la visite |
history_visits | load_successful, http_non_get | Résultat du chargement, indicateur de requête non GET |
history_visits | redirect_source, redirect_destination | Identifiants des visites liées dans une chaîne de redirections |
history_visits | origin, generation | Suivi lié à la synchronisation (local ou synchronisé) |
history_tombstones | start_time, end_time, url | Plage ou URL supprimée par un effacement de l'historique |
Downloads.plist | Tableau DownloadHistory : DownloadEntryURL, DownloadEntryPath, DownloadEntryDateAddedKey, DownloadEntryDateFinishedKey | Source, destination, début et fin de chaque téléchargement |
Les builds récents ajoutent des colonnes (par exemple status_code dans history_items, udid dans history_tombstones). Lancez d'abord .schema sur le fichier réel.
Horodatages
visit_time, start_time et end_time sont en temps absolu Mac à virgule flottante : secondes depuis le 2001-01-01 00:00:00 UTC. Ajoutez 978307200 pour obtenir un horodatage Unix. Les dates de Downloads.plist sont des objets date natifs des plists, que plutil -p affiche en UTC.
SELECT datetime(v.visit_time + 978307200, 'unixepoch') AS visit_utc,
i.url, v.title, v.load_successful, v.redirect_source, v.redirect_destination
FROM history_visits v
JOIN history_items i ON i.id = v.history_item
ORDER BY v.visit_time;
Rétention
- L'historique est élagué selon le réglage « Supprimer les éléments de l'historique » de Safari. La valeur par défaut est « Après un an », et « Manuellement » conserve l'historique jusqu'à ce que l'utilisateur l'efface.
- « Effacer l'historique » supprime des lignes et laisse des entrées dans
history_tombstones. - La liste des téléchargements a son propre réglage de suppression et est souvent vide : l'artefact Velociraptor sur les téléchargements Safari mentionne un délai par défaut de 24 heures. Les fichiers téléchargés, leurs attributs de quarantaine et la base de quarantaine survivent généralement à la liste.
- Des lignes supprimées peuvent survivre un temps dans les pages libres SQLite et dans le fichier
-waljusqu'à un checkpoint ou un vacuum.
Collecte
Accordez d'abord l'accès complet au disque au Terminal ou à l'outil de collecte. Copiez chaque base avec ses fichiers -wal et -shm.
# Live, per user, preserving metadata
ditto ~/Library/Safari /cases/host01/Safari
ditto ~/Library/Containers/com.apple.Safari/Data/Library/Safari /cases/host01/Safari-container
- UAC : son artefact
safari.yamlcollecteHistory*,Downloads.plist,SafariTabs.db*,CloudTabs*,LastSession.plist,RecentlyClosedTabs.plistet d'autres fichiers aux deux emplacements. - Aftermath (Jamf) : collecte le
History.dbdu profil par défaut,Downloads.plist,Bookmarks.plist,LastSession.plistetUserNotificationPermissions.plist(ni extensions ni profils supplémentaires) ; à exécuter en root avec l'accès complet au disque. - mac_apt : le plugin
SAFARIexporte et analyse les fichiers depuis une image disque ou un montage live, y compris les bases des profils Safari 17.
Analyse
sqlite3pourHistory.db,SafariTabs.dbetCloudTabs.db. Travaillez sur une copie (avec ses fichiers-walet-shmdans le même dossier), jamais sur l'original de la preuve, car ouvrir une base WAL peut déclencher un checkpoint.plutil -p Downloads.plistpour la liste des téléchargements.- Plugin
SAFARIde mac_apt : historique, téléchargements, signets, sites favoris, dernière session, onglets fermés récemment, onglets iCloud et aperçus d'onglets dans une seule table. - APOLLO : le module
safari_historyinterrogeHistory.db; ses modules Safari pour KnowledgeC ajoutent le contexte d'utilisation de l'application.
Repérer un effacement délibéré :
SELECT datetime(start_time + 978307200, 'unixepoch') AS cleared_from_utc,
datetime(end_time + 978307200, 'unixepoch') AS cleared_to_utc,
url
FROM history_tombstones ORDER BY end_time;
Conseils d'investigation
- Traitez toujours tous les profils : un utilisateur qui garde un profil « Travail » ou « Privé » séparé possède un second
History.dbdans le dossierProfiles/<UUID>/du conteneur. Faites correspondre les UUID aux noms de profils grâce àSafariTabs.db. - L'absence des fichiers
-walest la cause la plus fréquente de visites récentes « manquantes ». - Reliez les téléchargements aux fichiers sur disque grâce aux attributs
com.apple.quarantineetkMDItemWhereFromset à la base des événements de quarantaine. - Croisez les visites avec le premier plan des applications dans KnowledgeC pour montrer que Safari était réellement au premier plan à ce moment-là.
- Des lignes
history_tombstoneshorodatées juste avant la fenêtre d'un incident sont un fort indicateur d'anti-forensique ; consignez-les même lorsque l'historique lui-même a disparu. - Considérez les entrées de
CloudTabs.dbcomme l'activité d'un autre appareil jusqu'à preuve du contraire.