Aller au contenu

Activité utilisateurRéseau

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

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

FichierCheminVersions / 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.dbSafari 17 et ultérieur
Téléchargements~/Library/Safari/Downloads.plistPlist binaire
Onglets, groupes d'onglets, noms de profils~/Library/Containers/com.apple.Safari/Data/Library/Safari/SafariTabs.dbOrganisation en conteneur de Safari 15 et ultérieur
Onglets iCloud~/Library/Containers/com.apple.Safari/Data/Library/Safari/CloudTabs.dbLes versions plus anciennes le plaçaient dans ~/Library/Safari
Onglets fermés récemment~/Library/Safari/RecentlyClosedTabs.plistPrésent lorsque des onglets ont été fermés
Dernière session~/Library/Safari/LastSession.plistAbsent 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.dbMiniatures de pages en cache
Préférences~/Library/Containers/com.apple.Safari/Data/Library/Preferences/com.apple.Safari.plistAnciennement : ~/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_tombstones enregistre 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 / fichierChampSignification
history_itemsid, urlURL unique (une ligne par URL)
history_itemsdomain_expansionLibellé court du site dérivé du domaine
history_itemsvisit_countCompteur cumulé de visites
history_visitshistory_itemClé étrangère vers history_items.id
history_visitsvisit_timeHeure de la visite (temps absolu Mac, REAL)
history_visitstitleTitre de la page au moment de la visite
history_visitsload_successful, http_non_getRésultat du chargement, indicateur de requête non GET
history_visitsredirect_source, redirect_destinationIdentifiants des visites liées dans une chaîne de redirections
history_visitsorigin, generationSuivi lié à la synchronisation (local ou synchronisé)
history_tombstonesstart_time, end_time, urlPlage ou URL supprimée par un effacement de l'historique
Downloads.plistTableau DownloadHistory : DownloadEntryURL, DownloadEntryPath, DownloadEntryDateAddedKey, DownloadEntryDateFinishedKeySource, 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 -wal jusqu'à 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.yaml collecte History*, Downloads.plist, SafariTabs.db*, CloudTabs*, LastSession.plist, RecentlyClosedTabs.plist et d'autres fichiers aux deux emplacements.
  • Aftermath (Jamf) : collecte le History.db du profil par défaut, Downloads.plist, Bookmarks.plist, LastSession.plist et UserNotificationPermissions.plist (ni extensions ni profils supplémentaires) ; à exécuter en root avec l'accès complet au disque.
  • mac_apt : le plugin SAFARI exporte et analyse les fichiers depuis une image disque ou un montage live, y compris les bases des profils Safari 17.

Analyse

  • sqlite3 pour History.db, SafariTabs.db et CloudTabs.db. Travaillez sur une copie (avec ses fichiers -wal et -shm dans le même dossier), jamais sur l'original de la preuve, car ouvrir une base WAL peut déclencher un checkpoint.
  • plutil -p Downloads.plist pour la liste des téléchargements.
  • Plugin SAFARI de 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_history interroge History.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.db dans le dossier Profiles/<UUID>/ du conteneur. Faites correspondre les UUID aux noms de profils grâce à SafariTabs.db.
  • L'absence des fichiers -wal est 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.quarantine et kMDItemWhereFroms et à 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_tombstones horodaté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.db comme l'activité d'un autre appareil jusqu'à preuve du contraire.

Voir aussi