Saltar al contenido

Actividad del usuarioRed

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

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

ArchivoRutaVersiones / 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.dbSafari 17+
Descargas~/Library/Safari/Downloads.plistPlist binario
Pestañas, grupos de pestañas, nombres de perfil~/Library/Containers/com.apple.Safari/Data/Library/Safari/SafariTabs.dbEstructura de contenedor de Safari 15+
Pestañas de iCloud~/Library/Containers/com.apple.Safari/Data/Library/Safari/CloudTabs.dbLas versiones antiguas lo guardaban en ~/Library/Safari
Pestañas cerradas recientemente~/Library/Safari/RecentlyClosedTabs.plistPresente cuando se cerraron pestañas
Última sesión~/Library/Safari/LastSession.plistNo 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.dbMiniaturas de páginas en caché
Preferencias~/Library/Containers/com.apple.Safari/Data/Library/Preferences/com.apple.Safari.plistAntes: ~/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_tombstones registra 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 origin y 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 / archivoCampoSignificado
history_itemsid, urlURL única (una fila por URL)
history_itemsdomain_expansionEtiqueta corta del sitio derivada del dominio
history_itemsvisit_countContador agregado de visitas
history_visitshistory_itemClave foránea a history_items.id
history_visitsvisit_timeHora de la visita (Mac absolute time, REAL)
history_visitstitleTítulo de la página en el momento de la visita
history_visitsload_successful, http_non_getResultado de la carga, indicador de petición distinta de GET
history_visitsredirect_source, redirect_destinationIDs de las visitas enlazadas en una cadena de redirecciones
history_visitsorigin, generationDatos de control de la sincronización (local frente a sincronizado)
history_tombstonesstart_time, end_time, urlRango o URL eliminados al borrar el historial
Downloads.plistArray DownloadHistory: DownloadEntryURL, DownloadEntryPath, DownloadEntryDateAddedKey, DownloadEntryDateFinishedKeyOrigen, 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 -wal hasta 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.yaml recopila History*, Downloads.plist, SafariTabs.db*, CloudTabs*, LastSession.plist, RecentlyClosedTabs.plist y más, de ambas ubicaciones.
  • Aftermath (Jamf): recopila el History.db del perfil por defecto, Downloads.plist, Bookmarks.plist, LastSession.plist y UserNotificationPermissions.plist (ni extensiones ni perfiles adicionales); ejecútalo como root con Full Disk Access.
  • mac_apt: el plugin SAFARI exporta 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

  • sqlite3 para History.db, SafariTabs.db y CloudTabs.db. Trabaja sobre una copia (con sus archivos -wal y -shm en la misma carpeta), nunca sobre el original de la evidencia, porque abrir una base de datos WAL puede hacer un checkpoint.
  • plutil -p Downloads.plist para la lista de descargas.
  • Plugin SAFARI de 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_history consulta History.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.db en la carpeta Profiles/<UUID>/ del contenedor. Asocia los UUID con los nombres de perfil mediante SafariTabs.db.
  • La falta de los archivos -wal es la causa más habitual de visitas recientes "desaparecidas".
  • Vincula las descargas con los archivos en disco mediante los atributos com.apple.quarantine y kMDItemWhereFroms y 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_tombstones fechadas 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.db como actividad de otro dispositivo mientras no se demuestre lo contrario.

Ver también