Skip to content

TCC.dbTCC.db-wal

TCC Parser

¿Quién tenía permiso para leer el disco, ver la pantalla o controlar el Mac?

Decodifica las bases de datos TCC de macOS (del sistema y de cada usuario, con sus registros WAL) en permisos, apps, una cronología e historial recuperado, con marcas de revisión para los permisos de riesgo. Se analiza en tu navegador con WebAssembly: no se sube nada.

Suelta archivos TCC.db, una carpeta o un archivo de recolección

TCC.db del sistema y de cada usuario con sus -wal y -shm, MDMOverrides.plist, o una recolección completa de UAC, Velociraptor o Aftermath (.zip, .tar.gz). Todo se decodifica en tu dispositivo.

¿No tienes datos a mano? Prueba un ejemplo: el Mac sintético FIN-MBP-03 de una intrusión ficticia (TCC.db + WAL del sistema y de un usuario, más MDMOverrides.plist).

100 % en tu navegador — Rust + WebAssembly, no se sube nada

Cómo obtener tus datos

Guía de adquisición completa

Cada Mac tiene un TCC.db del sistema y uno por usuario, cada uno con un TCC.db-wal que puede contener los últimos cambios y versiones anteriores de filas. Copia las carpetas com.apple.TCC completas, no solo TCC.db, y conserva sus rutas para que la herramienta sepa de quién es cada base de datos.

  1. Copia las carpetas com.apple.TCC (requiere Acceso total al disco)
  2. Suelta aquí la carpeta o el archivo comprimido
  3. Análisis local — nada sale del navegador

En el Mac en funcionamiento, concede Acceso total al disco a Terminal (Ajustes del Sistema › Privacidad y seguridad › Acceso total al disco), vuelve a abrirlo y pega este bloque en una cuenta de administrador. ditto copia cada carpeta com.apple.TCC tal cual, con TCC.db-wal, TCC.db-shm y MDMOverrides.plist, y conserva la estructura Library/… y Users/<name>/….

Terminal · zsh / bash · admin
C=~/Desktop/tcc_case; mkdir -p "$C"
sudo ditto "/Library/Application Support/com.apple.TCC" "$C/Library/Application Support/com.apple.TCC"
for u in /Users/*; do
  d="$u/Library/Application Support/com.apple.TCC"
  [ -d "$d" ] && sudo ditto "$d" "$C/Users/$(basename "$u")/Library/Application Support/com.apple.TCC"
done
R="/private/var/root/Library/Application Support/com.apple.TCC"
sudo test -d "$R" && sudo ditto "$R" "$C$R"
sudo ditto -c -k --keepParent "$C" ~/Desktop/tcc_case.zip

Obtendrás ~/Desktop/tcc_case y tcc_case.zip. Suelta cualquiera de los dos en la página.

Conceder Acceso total al disco a Terminal escribe a su vez una fila en el TCC.db del sistema: anota la hora a la que lo hiciste para que tu propio permiso no se confunda con el del intruso.

Trampas habituales

  • Sin Acceso total al disco para el proceso que hace la copia (Terminal, el agente, el recolector), la copia falla con «Operation not permitted» o sale vacía.
  • Toma TCC.db-wal junto con TCC.db. Las herramientas que solo copian TCC.db (tcc.yaml de UAC, Aftermath) pierden los cambios que siguen en el WAL y el historial que contiene.
  • Cada cuenta tiene su propio TCC.db, incluida root en /private/var/root.
  • Nunca abras la evidencia con sqlite3 en modo lectura-escritura: al cerrarlo, vuelca el WAL a TCC.db mediante checkpoint y elimina el archivo -wal, borrando el historial que recupera esta herramienta. Trabaja sobre copias y calcula antes sus hashes.
  • Una copia tomada mientras tccd escribe puede quedar inconsistente; la herramienta solo reproduce las tramas WAL con sumas de comprobación válidas y lista el resto en Historial.

¿Qué es TCC.db?

Transparency, Consent and Control (TCC) es el framework de macOS que decide si un programa puede usar la cámara, el micrófono, la pantalla, los eventos de teclado, las API de accesibilidad, las carpetas protegidas, el Acceso total al disco o la automatización mediante Apple Events. El daemon tccd registra cada decisión vigente en bases de datos SQLite llamadas TCC.db: una para el sistema y una por usuario.

Cada fila es una decisión para un programa (bundle ID o ruta) y un servicio, con la decisión (permitido, denegado, limitado), su motivo, el requisito de código del programa y cuándo cambió la decisión por última vez. Es un registro de permisos, no un registro de uso.

Dónde se almacena

  • /Library/Application Support/com.apple.TCC/TCC.db: base de datos del sistema (protegida por SIP y TCC), normalmente Acceso total al disco, Accesibilidad, Grabación de pantalla, Monitorización de entrada.
  • ~/Library/Application Support/com.apple.TCC/TCC.db de cada usuario: cámara, micrófono, carpetas, volúmenes extraíbles, Automatización y más.
  • TCC.db-wal junto a cada base de datos: el registro de escritura anticipada (WAL) con los cambios recientes y copias antiguas de páginas.
  • /Library/Application Support/com.apple.TCC/MDMOverrides.plist: permisos aplicados por perfiles de configuración MDM (PPPC).

Por qué importa en una investigación

  • Muestra qué programas podían leerlo todo (Acceso total al disco), ver la pantalla, registrar pulsaciones o controlar la interfaz, incluido un terminal o intérprete de scripts a través del cual se ejecuta todo lo demás.
  • Fecha el último cambio de cada decisión (segundos Unix, UTC): una ráfaga de permisos durante la ventana de una intrusión es un indicio sólido.
  • Los clientes por ruta en carpetas temporales, compartidas u ocultas y los requisitos de código firmados ad hoc apuntan a herramientas depositadas.
  • El WAL y las páginas libres pueden conservar permisos que luego se eliminaron con tccutil reset.

Limitaciones

  • Una fila muestra una decisión, no su uso: TCC.db no registra cada activación de la cámara ni cada lectura de archivo. La evidencia de cada solicitud está en el registro unificado (subsistema com.apple.TCC).
  • last_modified es solo el último cambio; la fecha de la primera concesión se pierde cuando se actualiza una fila.
  • Las filas eliminadas solo sobreviven hasta que SQLite reutiliza el espacio; que falte una fila no demuestra que nunca se concediera un permiso.
  • Los valores de auth_reason y algunas columnas (flags, pid, boot_uuid) no están documentados por Apple; la herramienta muestra los valores en bruto junto a las interpretaciones de la comunidad.

Cómo obtener los archivos

  • Copia la carpeta /Library/Application Support/com.apple.TCC completa y la carpeta ~/Library/Application Support/com.apple.TCC de cada usuario, conservando las rutas, desde un terminal con Acceso total al disco (consulta «Cómo obtener tus datos»).
  • Recolecta TCC.db-wal con cada TCC.db; tcc.yaml de UAC y Aftermath solo copian TCC.db.
  • Desde una imagen, monta el volumen Data en solo lectura y archiva las mismas carpetas.

Preguntas frecuentes

¿Se suben mis bases de datos TCC a algún sitio?

No. El parser está escrito en Rust compilado a WebAssembly y se ejecuta en un Web Worker de tu navegador. No hay ningún endpoint de subida; las tablas, hallazgos y exportaciones se generan localmente.

¿Qué versiones de macOS son compatibles?

Cualquier estructura de la tabla access: Mojave y Catalina (allowed, prompt_count), Big Sur a Ventura (auth_value, auth_reason, auth_version) y Sonoma y posteriores (pid, pid_version, boot_uuid, last_reminded). Los nombres de columna se leen del propio esquema de cada base de datos y las columnas desconocidas se muestran tal cual.

¿Necesito los archivos -wal y -shm?

Aporta el -wal: puede contener las decisiones más recientes y versiones anteriores de filas, y la herramienta lo reproduce como lo hace SQLite. El archivo -shm es solo un índice del WAL y no es necesario.

¿Qué significa auth_value 2?

Permitido. 0 es denegado, 1 desconocido y 3 limitado. En Mojave y Catalina la tabla tenía en su lugar una columna allowed (1 = permitido), que la herramienta asigna a las mismas decisiones.

¿Qué es la columna csreq?

Un requisito de firma de código compilado que identifica el programa al que se aplica la decisión. La herramienta lo decodifica a texto como identifier "com.apple.Terminal" and anchor apple y muestra el team ID o el cdhash del código firmado ad hoc.

¿Puede recuperar permisos eliminados?

A menudo, si los cambios son recientes: las filas eliminadas con tccutil reset o desde Ajustes del Sistema pueden sobrevivir en tramas WAL, en las versiones de páginas que el WAL sustituyó y en páginas libres. Aparecen en la pestaña Historial hasta que SQLite reutiliza el espacio.

Sobre el parser

TCC Parser es una implementación independiente en Rust compilada a WebAssembly. Lee los archivos SQLite por sí mismo, a partir de las especificaciones públicas del formato de archivo y del WAL (sqlite.org), de modo que puede reproducir el archivo -wal, listar lo que el WAL sustituyó y extraer filas de páginas libres, algo que una consulta SQLite normal no muestra. Las columnas se leen del propio esquema de cada base de datos, así que se decodifican tanto las estructuras de la época de Mojave y de Big Sur como las de Sonoma y posteriores. Los requisitos de código (csreq) se decodifican al lenguaje de requisitos documentado por Apple. Los significados de auth_reason están documentados por la comunidad, no publicados por Apple; verifica las conclusiones importantes en un Mac de pruebas con la misma versión y en los registros unificados.

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.
Cómo cambió la tabla access de TCC.db de Mojave a Big Sur y Sonoma: allowed y prompt_count, auth_value y auth_reason, pid y last_reminded, y las demás tablas.
Cómo leer los blobs csreq e indirect_object_code_identity de TCC.db: requisitos compilados, anclas, identificadores y clientes ad hoc con solo cdhash.