Cómo analizar TCC.db en el navegador
Paso a paso: cargue los TCC.db de macOS y su WAL en un parser gratuito en el navegador, lea los hallazgos, revise permisos e historial, y exporte.
Resumen. Recopile las carpetas com.apple.TCC (del sistema y de cada usuario, con el WAL), suéltelas en TCC Parser y recorra las pestañas: Findings (hallazgos), Permissions (permisos), Apps (apps), Timeline (cronología), History (historial) y Sources (fuentes). Fije un intervalo de tiempo para centrar todas las vistas en la ventana que le interesa y exporte a CSV, CSV para Timesketch o JSON. El análisis se ejecuta en WebAssembly, en un Web Worker dentro de su navegador: los archivos nunca se suben.
Este es el complemento práctico de la guía de análisis forense de TCC.db. Los ejemplos usan la muestra integrada, que es sintética y ficticia: un portátil del departamento financiero, FIN-MBP-03, usuario dana.whitlock, en el que un atacante con una sesión robada actuó aproximadamente entre las 10:05 y las 10:50 UTC del 2026-09-14. Forma parte de la misma intrusión ficticia que el equipo Windows FIN-WKS-07 usado en nuestras herramientas hermanas.
Apple y macOS son marcas comerciales de Apple Inc. TCC Parser es independiente y no está afiliado a Apple.
Antes de empezar
| Necesita | Por qué |
|---|---|
La carpeta com.apple.TCC del sistema | Concesiones de acceso total al disco, Accesibilidad, grabación de pantalla y MDM |
La carpeta com.apple.TCC de cada usuario | Automatización, carpetas, cámara, micrófono |
Los archivos -wal | Cambios recientes y versiones anteriores de las filas |
| La carpeta de usuario en la ruta | Atribuye cada base de datos a una cuenta |
| Un navegador de escritorio actual | El parser se ejecuta como WebAssembly |
Paso 1: Recopilar las carpetas com.apple.TCC
En un Mac en vivo, conceda primero acceso total al disco (Full Disk Access) a Terminal (o a su agente) y después copie las carpetas:
sudo ditto "/Library/Application Support/com.apple.TCC" ./case/tcc_system
for u in /Users/*; do
[ -d "$u/Library/Application Support/com.apple.TCC" ] && \
sudo ditto "$u/Library/Application Support/com.apple.TCC" "./case/tcc_$(basename "$u")"
done
Los mismos comandos, además de las opciones con UAC, Aftermath, Velociraptor y en frío, están en la guía How to get your data (cómo obtener sus datos), bajo la zona de carga, y en ubicación y adquisición de TCC.db. Si su recolector copió solo TCC.db sin TCC.db-wal, el parser funciona igual, pero la pestaña History tendrá menos que mostrar.
Paso 2: Cargar los archivos
Abra la página de inicio. En la zona de carga puede:
- soltar archivos, una carpeta o un archivo de colección: un ZIP (Velociraptor, copias
tcc_root/tcc_<user>de Aftermath o una carpeta comprimida) o un.tar.gzde UAC, que no hace falta descomprimir antes; - hacer clic en Choose files (elegir archivos) o Choose a folder (elegir una carpeta);
- hacer clic en Try a sample (probar una muestra) para cargar FIN-MBP-03.
El parser reconoce los archivos TCC.db y empareja cada uno con su -wal, lee MDMOverrides.plist y carga REG.db y cualquier otro archivo SQLite de la carpeta como tablas en bruto. El espacio de trabajo se abre a pantalla completa; pulse Esc para salir de ella.
Paso 3: Leer la pestaña Findings
Los hallazgos son invitaciones a mirar, no veredictos. En la muestra verá, entre otros:
| Hallazgo | Fila de la muestra |
|---|---|
| Concesión de alto impacto a un terminal | Acceso total al disco para com.apple.Terminal, 10:11:37 UTC |
| Cliente identificado por ruta en una carpeta oculta, requisito de código ad hoc | /Users/dana.whitlock/Library/Caches/.sync/sync-helper |
| Concesión eliminada (solo visible en el WAL) | Accesibilidad para ese helper, concedida a las 10:19:05 y eliminada después |
| Solicitud denegada de un cliente inusual | Grabación de pantalla para el helper, denegada a las 10:24:40 |
| Automatización de System Events y Finder | Terminal, 10:14:02 y 10:16:48 |
| Ráfaga de cambios de permisos | Cambios de las 10:11:37 a las 10:24:40, seguidos de un hueco de 14 minutos hasta las 10:38:55 |
| Fila concedida por MDM que conviene revisar | Acceso total al disco para com.example.edr.agent desde un perfil PPPC |
La fila MDM es esperable en un Mac gestionado; aparece para que la confirme, no porque sea sospechosa. Otros tipos de hallazgo son los clientes en /tmp, /private/var/tmp, /Users/Shared o Descargas, y las marcas de tiempo en el futuro.
Paso 4: Revisar las pestañas Permissions y Apps
Permissions enumera todas las filas de todas las bases de datos, decodificadas, en estas columnas:
| Columna | Contenido |
|---|---|
| Last modified | last_modified en UTC |
| Decision | Permitido, denegado, desconocido o limitado |
| Permission | Nombre legible e identificador en bruto, por ejemplo Full Disk Access y kTCCServiceSystemPolicyAllFiles |
| App/program | El cliente, más el destino de Automatización cuando lo hay |
| Reason | auth_reason, decodificado |
| Database | La base de datos del sistema o la del usuario, para que una fila por usuario siga atribuida a su cuenta |
| Review flags | Los hallazgos que se aplican a la fila |
Haga clic en una fila para abrir su panel de detalle: client_type, el auth_value en bruto, el csreq decodificado a texto de requisito, auth_version, flags, la política, el almacenamiento (una página de TCC.db o una copia en el WAL) y botones para fijar el intervalo de tiempo alrededor de esa decisión.
Apps agrupa por cliente. Abra com.apple.Terminal en la muestra y verá toda su huella en un solo lugar: acceso total al disco en la base de datos del sistema; Automatización de System Events y Finder, acceso a Documentos y Escritorio, y acceso a volúmenes extraíbles (10:38:55, el volumen USB "EXFIL" de la historia) en la base de datos de dana.whitlock. Esa es la imagen que interesa en el informe: una app, muchas capacidades, todo en 30 minutos.
Paso 5: Acotar un intervalo en Timeline
La pestaña Timeline ordena todas las marcas de tiempo. Para acotarla, junto con todo lo demás, use la barra de intervalo de tiempo situada sobre todas las pestañas:
- From (desde) y To (hasta), al segundo;
- un selector de campo de tiempo: Last modified, Last reminded, Expired at o Any of these times (cualquiera de estas horas);
- intervalos predefinidos calculados a partir de los datos;
- un selector Around… (alrededor de);
- una franja de densidad que muestra dónde se concentran los cambios y sobre la que puede arrastrar para seleccionar una ventana.
Desde el panel de detalle de una fila también puede fijar el intervalo alrededor de esa decisión. El intervalo se aplica a todas las vistas, recuentos, hallazgos y exportaciones, y se guarda en la URL, así que puede guardar la vista exacta en marcadores o compartirla con un compañero que cargue los mismos archivos. En la muestra, un intervalo de 10:05:00 a 10:50:00 UTC separa la intrusión de las concesiones antiguas y legítimas (cámara y micrófono de Zoom y Teams, etc.); con la muestra cargada, el botón Use the sample's incident window (usar la ventana del incidente de la muestra) de la pestaña Findings lo fija por usted.
Paso 6: Revisar History y Sources
History muestra las filas recuperadas de los frames del WAL (commits anteriores, frames sin confirmar y frames de una generación anterior del WAL) y de las páginas liberadas, comparadas con el estado actual. En la muestra aparece la concesión de Accesibilidad del sync-helper que ya no existe en la base de datos actual. Cómo y por qué funciona se explica en recuperar permisos TCC eliminados del WAL.
Sources enumera lo que se cargó: cada base de datos, si se encontró y reprodujo un WAL, MDMOverrides.plist y las tablas en bruto de otros archivos SQLite. Revísela antes de dar por buena una ausencia: si falta la base de datos de un usuario, la explicación es una laguna en la recolección, no una cuenta limpia.
Paso 7: Exportar la evidencia
| Entrada del menú de exportación | Uso |
|---|---|
| Permissions (CSV, incl. history) | Las filas decodificadas, incluidas las filas de historial recuperadas, con una columna de estado (actual, caducada, eliminada o anterior) |
| Timeline (CSV) | La cronología, para la cronología del caso |
| Timeline for Timesketch (CSV) | Importación en Timesketch junto a otras fuentes |
| Everything (JSON) | Todo, incluidos los requisitos decodificados y el historial recuperado |
Cuando hay un intervalo fijado, forma parte de los nombres de archivo, de modo que una exportación siempre indica qué ventana cubre. Registre los hashes de los archivos de origen que cargó junto a las exportaciones.
Siguientes pasos
La muestra no termina en TCC.db: en la misma historia hay una descarga en cuarentena tools.zip desde https://files.example/…, un LaunchAgent falso com.example.updater.plist, archivos preparados en ~/Library/Caches/.sync/ y una visita a transfer.example. Cómo pivotar desde las filas TCC hacia esos artefactos se explica en investigar el abuso de permisos TCC.