Safari History.db: historial de navegación en macOS
History.db de Safari, bases de datos de perfiles, Downloads.plist y almacenes de pestañas en macOS: qué páginas visitó un usuario, cuándo y qué se borró.
- Ubicación
- ~/Library/Safari/History.db
- Prueba
- Qué URL abrió un usuario de macOS en Safari, cuándo, a través de qué redirecciones y si se borró el historial
- Marcas de tiempo
- Mac absolute time (Cocoa, segundos desde 2001-01-01 UTC), almacenado como REAL
- Acceso
- Full Disk Access para el proceso que lee (TCC); root por sí solo no basta
- Retención
- Ajuste del usuario, un año por defecto o hasta que se borre manualmente; la lista de descargas, un día por defecto
- Adquisición
- Aftermath, mac_apt, UAC
Herramientas
Comparar todas las herramientas- Browser ForensicsNavegador
- mac_aptCLI · código abierto
- APOLLOCLI · código abierto
- sqlite3CLI · incluido en macOS
- plutilCLI · incluido en macOS
Qué es
Safari guarda su historial de navegación en una base de datos SQLite llamada History.db. Cada URL única ocupa una fila en history_items y cada carga de página individual una fila en history_visits, de modo que la base de datos responde tanto a "¿ha estado aquí alguna vez el usuario?" como a "¿exactamente cuándo y cuántas veces?". Desde que Safari 17 introdujo los perfiles, el perfil por defecto sigue escribiendo en ~/Library/Safari/History.db, mientras que cada perfil adicional tiene su propio History.db dentro del contenedor sandbox de Safari.
Alrededor de la base de datos del historial hay varios archivos complementarios: Downloads.plist (la lista de descargas), SafariTabs.db (pestañas abiertas, grupos de pestañas y nombres de perfil), CloudTabs.db (pestañas abiertas en los demás dispositivos iCloud del usuario), RecentlyClosedTabs.plist y, en algunas versiones, LastSession.plist. Esta página es la referencia rápida; la guía forense de Safari recorre el análisis con más profundidad.
Dónde se encuentra
| Archivo | Ruta | Versiones / notas |
|---|---|---|
| Historial (perfil por defecto) | ~/Library/Safari/History.db (+ -wal, -shm, -lock) | 10.10 Yosemite y posteriores; antes, History.plist |
| Historial (perfiles adicionales) | ~/Library/Containers/com.apple.Safari/Data/Library/Safari/Profiles/<UUID>/History.db | Safari 17+ |
| Descargas | ~/Library/Safari/Downloads.plist | Plist binario |
| Pestañas, grupos de pestañas, nombres de perfil | ~/Library/Containers/com.apple.Safari/Data/Library/Safari/SafariTabs.db | Estructura de contenedor de Safari 15+ |
| Pestañas de iCloud | ~/Library/Containers/com.apple.Safari/Data/Library/Safari/CloudTabs.db | Las versiones antiguas lo guardaban en ~/Library/Safari |
| Pestañas cerradas recientemente | ~/Library/Safari/RecentlyClosedTabs.plist | Presente cuando se cerraron pestañas |
| Última sesión | ~/Library/Safari/LastSession.plist | No existe en todas las versiones |
| Sitios frecuentes | ~/Library/Safari/TopSites.plist y TopSites.plist por perfil | |
| Miniaturas de pestañas | ~/Library/Containers/com.apple.Safari/Data/Library/Caches/com.apple.Safari/TabSnapshots/Metadata.db | Miniaturas de páginas en caché |
| Preferencias | ~/Library/Containers/com.apple.Safari/Data/Library/Preferences/com.apple.Safari.plist | Antes: ~/Library/Preferences/com.apple.Safari.plist |
Protección: ~/Library/Safari y el contenedor de Safari están protegidos por TCC (Mojave y posteriores). Un proceso sin Full Disk Access obtiene Operation not permitted, incluso con sudo. En una imagen montada para análisis en frío, TCC no se aplica.
Qué prueba
- Qué URL se cargaron en Safari y a qué hora, por visita.
- Si una carga tuvo éxito (
load_successful) y la cadena de redirecciones que llevó a una página de destino (redirect_source/redirect_destination). - Los títulos de las páginas tal como eran en el momento de la visita (
history_visits.title) y los términos de búsqueda dentro de las URL de resultados. - Que el usuario borró deliberadamente el historial:
history_tombstonesregistra el rango temporal o la URL borrados. - Qué archivos descargó Safari y dónde se guardaron (
Downloads.plist), mientras la lista no se haya vaciado. - Qué pestañas estaban abiertas, fijadas o agrupadas, y a qué perfil pertenecían (
SafariTabs.db).
No prueba:
- Que la persona ante el teclado leyera la página, ni que una visita se produjera en este Mac: la sincronización del historial por iCloud puede traer visitas de otros dispositivos (consulta la columna
originy valida sus valores en un sistema de referencia antes de apoyarte en ellos). - La actividad en navegación privada: las ventanas privadas no escriben visitas en
History.db. - La actividad en otros navegadores (consulta Chrome y Firefox).
Campos clave
| Tabla / archivo | Campo | Significado |
|---|---|---|
history_items | id, url | URL única (una fila por URL) |
history_items | domain_expansion | Etiqueta corta del sitio derivada del dominio |
history_items | visit_count | Contador agregado de visitas |
history_visits | history_item | Clave foránea a history_items.id |
history_visits | visit_time | Hora de la visita (Mac absolute time, REAL) |
history_visits | title | Título de la página en el momento de la visita |
history_visits | load_successful, http_non_get | Resultado de la carga, indicador de petición distinta de GET |
history_visits | redirect_source, redirect_destination | IDs de las visitas enlazadas en una cadena de redirecciones |
history_visits | origin, generation | Datos de control de la sincronización (local frente a sincronizado) |
history_tombstones | start_time, end_time, url | Rango o URL eliminados al borrar el historial |
Downloads.plist | Array DownloadHistory: DownloadEntryURL, DownloadEntryPath, DownloadEntryDateAddedKey, DownloadEntryDateFinishedKey | Origen, destino, inicio y fin de cada descarga |
Las compilaciones más recientes añaden columnas (por ejemplo status_code en history_items, udid en history_tombstones). Ejecuta primero .schema sobre el archivo real.
Marcas de tiempo
visit_time, start_time y end_time están en Mac absolute time de coma flotante: segundos desde 2001-01-01 00:00:00 UTC. Suma 978307200 para obtener una marca de tiempo Unix. Las fechas de Downloads.plist son objetos de fecha nativos de plist, que plutil -p muestra 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;
Retención
- El historial se depura según el ajuste "Eliminar elementos del historial" de los ajustes de Safari. El valor por defecto es al cabo de un año, y "Manualmente" conserva el historial hasta que el usuario lo borra.
- "Borrar historial" elimina filas y deja entradas en
history_tombstones. - La lista de descargas tiene su propio ajuste de eliminación y a menudo está vacía: el artefacto de descargas de Safari de Velociraptor indica un valor por defecto de 24 horas. Los archivos descargados, sus atributos de cuarentena y la base de datos de cuarentena suelen sobrevivir a la lista.
- Las filas borradas pueden sobrevivir un tiempo en las páginas libres de SQLite y en el archivo
-walhasta un checkpoint o un vacuum.
Adquisición
Concede primero Full Disk Access a Terminal o a la herramienta de adquisición. Copia cada base de datos junto con sus archivos -wal y -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: su artefacto
safari.yamlrecopilaHistory*,Downloads.plist,SafariTabs.db*,CloudTabs*,LastSession.plist,RecentlyClosedTabs.plisty más, de ambas ubicaciones. - Aftermath (Jamf): recopila el
History.dbdel perfil por defecto,Downloads.plist,Bookmarks.plist,LastSession.plistyUserNotificationPermissions.plist(ni extensiones ni perfiles adicionales); ejecútalo como root con Full Disk Access. - mac_apt: el plugin
SAFARIexporta y analiza los archivos desde una imagen de disco o un montaje en vivo, incluidas las bases de datos de perfiles de Safari 17.
Análisis
sqlite3paraHistory.db,SafariTabs.dbyCloudTabs.db. Trabaja sobre una copia (con sus archivos-waly-shmen la misma carpeta), nunca sobre el original de la evidencia, porque abrir una base de datos WAL puede hacer un checkpoint.plutil -p Downloads.plistpara la lista de descargas.- Plugin
SAFARIde mac_apt: historial, descargas, marcadores, sitios frecuentes, última sesión, pestañas cerradas recientemente, pestañas de iCloud y miniaturas de pestañas en una sola tabla. - APOLLO: el módulo
safari_historyconsultaHistory.db; sus módulos Safari de KnowledgeC añaden contexto de uso de la app.
Detectar borrados deliberados:
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;
Consejos para la investigación
- Procesa siempre todos los perfiles: un usuario que mantiene un perfil "Trabajo" o "Privado" aparte tiene un segundo
History.dben la carpetaProfiles/<UUID>/del contenedor. Asocia los UUID con los nombres de perfil medianteSafariTabs.db. - La falta de los archivos
-wales la causa más habitual de visitas recientes "desaparecidas". - Vincula las descargas con los archivos en disco mediante los atributos
com.apple.quarantineykMDItemWhereFromsy la base de datos de eventos de cuarentena. - Correlaciona las visitas con el foco de apps de KnowledgeC para demostrar que Safari estaba realmente en primer plano en ese momento.
- Las filas de
history_tombstonesfechadas justo antes de la ventana de un incidente son un indicador antiforense sólido; regístralas aunque el historial en sí haya desaparecido. - Trata las entradas de
CloudTabs.dbcomo actividad de otro dispositivo mientras no se demuestre lo contrario.