¿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.