TCC.db en macOS: ubicación y adquisición
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.
Resumen. Recopile la carpeta com.apple.TCC completa, no solo TCC.db: la de /Library/Application Support/ para el sistema y la de ~/Library/Application Support/ de cada usuario, conservando TCC.db-wal, TCC.db-shm y MDMOverrides.plist. En un Mac en vivo, el proceso que copia necesita acceso total al disco (Full Disk Access). Varios recolectores populares copian solo TCC.db, lo que puede dejar fuera cambios recientes que siguen en el WAL. Después, suelte el resultado en TCC Parser; la guía How to get your data (cómo obtener sus datos) de la página de inicio repite los comandos de este artículo.
En la ficha de referencia de TCC.db tiene un resumen del artefacto en una página. Este artículo profundiza en la recolección.
Qué recopilar
| Archivo | Ruta | Notas |
|---|---|---|
| TCC.db del sistema | /Library/Application Support/com.apple.TCC/TCC.db | Acceso total al disco, Accesibilidad, grabación de pantalla y servicios similares, por lo general |
| TCC.db por usuario | /Users/<user>/Library/Application Support/com.apple.TCC/TCC.db | Una por cuenta; cámara, micrófono, Automatización, carpetas, por lo general |
| WAL | TCC.db-wal junto a cada base de datos | Cambios confirmados que aún no pasaron por un checkpoint, más versiones antiguas de páginas |
| Índice de memoria compartida | TCC.db-shm junto a cada base de datos | Se puede reconstruir; recopílelo para que la adquisición esté completa |
| Concesiones MDM | /Library/Application Support/com.apple.TCC/MDMOverrides.plist | Macs gestionados; concesiones PPPC por cliente y servicio |
| REG.db | /Library/Application Support/com.apple.TCC/REG.db | Presente en muchos sistemas; su función no está bien documentada |
MDMOverrides.plist es un diccionario indexado por identificador de cliente; cada entrada es un diccionario indexado por nombre de servicio, con claves como Allowed, CodeRequirement, CodeRequirementData e IdentifierType. Las entradas de Apple Events están anidadas un nivel más, por app receptora. Léalo con plutil -p.
No se quede en las cuentas que espera encontrar. Las cuentas de servicio, una segunda cuenta de administrador o una cuenta creada durante la intrusión tienen cada una su propia base de datos. Enumere /Users y recopile todas.
Protecciones: acceso total al disco y SIP
En un sistema en vivo hay dos mecanismos que estorban, y se confunden a menudo:
| Mecanismo | Qué bloquea | Qué no bloquea |
|---|---|---|
| El propio TCC (acceso total al disco) | La lectura de cualquiera de las dos bases de datos por un proceso sin acceso total al disco, incluido root | La lectura por un proceso que tiene acceso total al disco |
| System Integrity Protection | La modificación de la base de datos del sistema, incluso por parte de root | Su lectura por un proceso con acceso total al disco |
En la práctica: conceda acceso total al disco exactamente al programa que hará la copia. Si ejecuta un recolector desde Terminal, lo necesita Terminal; si recopila un agente, lo necesita el agente. sudo no lo sustituye. Anote qué proceso tenía acceso total al disco y cuándo se lo concedió: esa concesión es a su vez una fila nueva en la base de datos del sistema, con un last_modified dentro del periodo de recolección. Indíquelo en el informe para que nadie la confunda con actividad del atacante.
Recolección manual en vivo
Con acceso total al disco concedido a Terminal, ditto copia cada carpeta con sus archivos asociados:
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
shasum -a 256 ./case/tcc_*/* > ./case/tcc_hashes.txt
Copiar la carpeta en lugar de un único archivo conserva el WAL, el SHM, MDMOverrides.plist y todo lo demás que tccd guarda ahí. Comprima la carpeta case en un ZIP si quiere cargarla de una sola vez.
Herramientas de recolección y sus trampas
| Herramienta | Qué recopila | Trampa |
|---|---|---|
| UAC | artifacts/files/system/tcc.yaml: exactamente los TCC.db del sistema y de cada usuario | No incluye -wal/-shm. Forma parte del perfil ir_triage a través de files/system/* |
| Aftermath (Jamf) | El módulo TCC copia el TCC.db del sistema y el de cada usuario en el caso como tcc_root y tcc_<username> | Copias en bruto solo del archivo principal, sin el WAL. Debe ejecutarse como root con acceso total al disco |
Velociraptor MacOS.System.TCC | Consulta ambas bases de datos en vivo y devuelve filas | Según su descripción, se probó en Big Sur; las versiones anteriores necesitan el formato allowed/prompt_count. Devuelve filas, no los archivos |
Velociraptor Generic.Collectors.File | Archivos en bruto que coinciden con sus globs | Usted elige los globs, así que puede incluir el WAL |
| mac_apt | Analiza TCC desde una imagen o desde un archivo suelto | Analiza en lugar de conservar los archivos en bruto; guarde también el origen |
UAC
sudo ./uac -p ir_triage /tmp
# or only the TCC artifact
sudo ./uac -a ./artifacts/files/system/tcc.yaml /tmp
Como el artefacto enumera exactamente TCC.db, añada un ditto manual de las carpetas anteriores si necesita el WAL. TCC Parser acepta directamente el .tar.gz que genera UAC; no hace falta descomprimirlo.
Aftermath
sudo ./aftermath # output to /tmp by default
sudo ./aftermath -o /Volumes/CASE
Busque las copias tcc_root y tcc_<username> en el archivo comprimido. TCC Parser reconoce esos nombres cuando suelta el ZIP de Aftermath.
Velociraptor
Para obtener filas en toda la flota, MacOS.System.TCC (glob por defecto /Library/Application Support/com.apple.TCC/TCC.db,/Users/*/Library/Application Support/com.apple.TCC/TCC.db). Para los archivos en bruto, Generic.Collectors.File con Root / y globs como:
Library/Application Support/com.apple.TCC/TCC.db*
Users/*/Library/Application Support/com.apple.TCC/TCC.db*
El * final recoge -wal y -shm. El cliente de Velociraptor necesita acceso total al disco en el endpoint.
mac_apt
python mac_apt.py -o out -c E01 /path/mac.E01 TCC
python mac_apt_artifact_only.py -i TCC.db -o out -c TCC
El plugin TCC admite los formatos de Catalina y de Big Sur en adelante.
Adquisición en frío
A partir de una imagen completa, monte el volumen Data en solo lectura en un equipo de análisis. Ahí, TCC y SIP no restringen la lectura. Las rutas son las mismas respecto a la raíz del volumen: Library/Application Support/com.apple.TCC/ y Users/*/Library/Application Support/com.apple.TCC/. Copie las carpetas, calcule sus hashes y trabaje sobre las copias.
Busque también copias más antiguas: los snapshots locales de APFS y las copias de seguridad de Time Machine pueden contener versiones anteriores de las mismas bases de datos, que es la forma más fiable de ver concesiones que se eliminaron después.
Manejo de las copias
- No abra nunca el original con una herramienta que escriba. SQLite puede integrar el WAL en el archivo principal (checkpoint) cuando se cierra la última conexión, lo que reescribe ambos archivos. Trabaje sobre una segunda copia.
- Mantenga el WAL junto a su base de datos, con el mismo nombre base. Los parsers los emparejan por nombre.
- Conserve la ruta. La carpeta de usuario que aparece en la ruta es lo que atribuye una base de datos por usuario a una cuenta.
- Anote la hora y los privilegios. Su propia concesión de acceso total al disco y cualquier solicitud que provoque se convierten en filas.
Carga en TCC Parser
Suelte las carpetas, archivos sueltos, un ZIP (Velociraptor, Aftermath, carpetas comprimidas) o un .tar.gz de UAC (sin necesidad de descomprimirlo) en la zona de carga, o use Choose files (elegir archivos) o Choose a folder (elegir una carpeta). El parser reproduce los frames confirmados del WAL, lee MDMOverrides.plist y muestra REG.db y cualquier otro archivo SQLite de la carpeta como tablas en bruto. El recorrido completo está en analizar TCC.db en el navegador.
Preguntas frecuentes
¿Dónde está TCC.db en macOS?
La base de datos del sistema es /Library/Application Support/com.apple.TCC/TCC.db. Cada usuario tiene la suya en ~/Library/Application Support/com.apple.TCC/TCC.db. Los Macs gestionados tienen además /Library/Application Support/com.apple.TCC/MDMOverrides.plist.
¿Por qué mi copia de TCC.db está vacía o no aparece?
En un Mac en vivo, el proceso que hace la copia (Terminal, un agente de recolección, el binario de la herramienta) necesita acceso total al disco. Sin él, las copias fallan o salen vacías, incluso ejecutándose como root.
¿Necesito TCC.db-wal y TCC.db-shm?
Recopile el archivo -wal siempre que exista: puede que los cambios recientes aún no estén en el archivo principal, y puede contener versiones anteriores de las filas. El archivo -shm es un índice que se puede reconstruir; recopílelo para que la adquisición esté completa, aunque un parser no lo necesita.
¿SIP impide leer el TCC.db del sistema?
No. System Integrity Protection protege la base de datos del sistema contra modificaciones, incluso por parte de root. Para leerla en un sistema en vivo hace falta acceso total al disco. En una imagen montada en un equipo de análisis no se aplica ninguna de las dos restricciones.