Skip to content

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.

Publicado el 8 min de lectura

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

NecesitaPor qué
La carpeta com.apple.TCC del sistemaConcesiones de acceso total al disco, Accesibilidad, grabación de pantalla y MDM
La carpeta com.apple.TCC de cada usuarioAutomatización, carpetas, cámara, micrófono
Los archivos -walCambios recientes y versiones anteriores de las filas
La carpeta de usuario en la rutaAtribuye cada base de datos a una cuenta
Un navegador de escritorio actualEl 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.gz de 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:

HallazgoFila de la muestra
Concesión de alto impacto a un terminalAcceso 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 inusualGrabación de pantalla para el helper, denegada a las 10:24:40
Automatización de System Events y FinderTerminal, 10:14:02 y 10:16:48
Ráfaga de cambios de permisosCambios 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 revisarAcceso 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:

ColumnaContenido
Last modifiedlast_modified en UTC
DecisionPermitido, denegado, desconocido o limitado
PermissionNombre legible e identificador en bruto, por ejemplo Full Disk Access y kTCCServiceSystemPolicyAllFiles
App/programEl cliente, más el destino de Automatización cuando lo hay
Reasonauth_reason, decodificado
DatabaseLa base de datos del sistema o la del usuario, para que una fila por usuario siga atribuida a su cuenta
Review flagsLos 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ónUso
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.

Artículos relacionados

Artículos relacionados

Qué registra la base de datos TCC de macOS, qué prueba y qué no, qué servicios importan y un flujo de trabajo repetible para revisar TCC.db en un caso.
Dónde están los TCC.db del sistema y de usuario, el rol del acceso total al disco y SIP, y cómo recopilarlos con el WAL mediante UAC, Aftermath o Velociraptor.
Cómo abusan los atacantes de los permisos TCC de macOS, qué deja cada técnica en TCC.db y cómo pivotar al registro unificado, launchd, cuarentena y shell.