TCC.db: Datenschutzberechtigungen unter macOS
Die TCC-Datenbanken von macOS zeigen, welche Apps Zugriff auf Kamera, Mikrofon, Bildschirm, Festplatte und Automation erhielten und wann sich das änderte.
- Speicherort
- /Library/Application Support/com.apple.TCC/TCC.db
- Belegt
- Welche Programme sensible Datenschutzberechtigungen angefordert oder erhalten haben, durch wen, und wann sich die Entscheidung zuletzt änderte
- Zeitstempel
- Unix-Epoche in Sekunden (UTC) in last_modified
- Zugriff
- Full Disk Access zum Lesen; die System-Datenbank ist zusätzlich durch SIP geschützt
- Aufbewahrung
- Bis die Zeile geändert, zurückgesetzt (tccutil) oder die App entfernt wird
- Sicherung
- Aftermath, mac_apt, UAC, Velociraptor
- TCC ParserBrowser
- mac_aptCLI · Open Source
- PlasoCLI · Open Source
- VelociraptorPlattform · Open Source
- sqlite3CLI · in macOS enthalten
Was es ist
Transparency, Consent and Control (TCC) ist das macOS-Framework, das den Zugriff auf datenschutzrelevante Ressourcen regelt: Kamera, Mikrofon, Bildschirmaufnahme, Eingabeüberwachung, Bedienungshilfen-APIs, geschützte Benutzerordner, Full Disk Access und Automation über Apple Events. Der Daemon tccd trifft die Entscheidungen und speichert sie in SQLite-Datenbanken namens TCC.db, eine für das System und eine pro Benutzer.
Jede Zeile ist eine dauerhafte Entscheidung für einen Client (Bundle-ID oder Pfad) und einen Dienst. Die Datenbank ist ein Berechtigungsregister, kein Nutzungsprotokoll: Sie zeigt, was ein Programm tun durfte, nicht jedes Mal, wenn es das tat.
Wo es liegt
| Bereich | Pfad | Versionshinweise | Schutz |
|---|---|---|---|
| System | /Library/Application Support/com.apple.TCC/TCC.db | Schema von access geändert in 11 Big Sur und 14 Sonoma | SIP + TCC, zum Lesen ist Full Disk Access nötig |
| Pro Benutzer | ~/Library/Application Support/com.apple.TCC/TCC.db | Gleiches Schema wie System | TCC, zum Lesen ist Full Disk Access nötig |
| MDM-Freigaben | /Library/Application Support/com.apple.TCC/MDMOverrides.plist | Verwaltete Macs | Durch SIP geschütztes Verzeichnis |
| Erinnerungsdaten für Bildschirmaufnahme | ~/Library/Group Containers/group.com.apple.replayd/ScreenCaptureApprovals.plist | Ab 15 Sequoia | Durch TCC geschützt |
Sichern Sie zu jeder Datenbank die WAL- und SHM-Begleitdateien (TCC.db-wal, TCC.db-shm). Jedes Konto unter /Users hat seine eigene Benutzerkopie.
Was es belegt
- Dass eine bestimmte App oder ein Binärprogramm Full Disk Access, Bedienungshilfen, Bildschirmaufnahme, Eingabeüberwachung, Kamera oder Mikrofon besitzt oder verweigert bekam.
- Dass einem pfadbasierten Client (
client_type = 1), etwa einem unsignierten Binärprogramm oder einem Skriptinterpreter, eine Fähigkeit gewährt wurde, was für legitime Software ungewöhnlich ist. - Dass eine Automation-Freigabe einer App erlaubt, Apple Events an eine andere zu senden (Ziel in
indirect_object_identifier). - Ob die Entscheidung vom Benutzer, vom System oder aus einer MDM-Richtlinie stammt (
auth_reason, abgeglichen mitMDMOverrides.plist). - Den ungefähren Zeitpunkt der letzten Änderung einer Entscheidung (
last_modified).
Es belegt nicht, dass die Berechtigung tatsächlich genutzt wurde, wie oft oder was aufgezeichnet wurde. Eine fehlende Zeile belegt nicht, dass eine Berechtigung nie erteilt wurde: tccutil reset löscht Zeilen.
Wichtige Felder
Tabelle access (ab Big Sur):
| Spalte | Bedeutung |
|---|---|
service | Dienstkennung, z. B. kTCCServiceSystemPolicyAllFiles (Full Disk Access), kTCCServiceAccessibility, kTCCServiceScreenCapture, kTCCServiceListenEvent, kTCCServiceAppleEvents |
client | Bundle-ID oder absoluter Pfad des anfragenden Programms |
client_type | 0 Bundle-ID, 1 absoluter Pfad |
auth_value | 0 verweigert, 1 unbekannt, 2 erlaubt, 3 eingeschränkt |
auth_reason | Von der Community dokumentiert: 1 Fehler, 2 Zustimmung des Benutzers, 3 vom Benutzer gesetzt, 4 vom System gesetzt, 5 Dienstrichtlinie, 6 MDM-Richtlinie, 7 Override-Richtlinie, 8 fehlender Usage-String, 9 Zeitüberschreitung der Abfrage, 10 Preflight unbekannt, 11 per Entitlement, 12 Richtlinie nach App-Typ |
auth_version | Version des Eintragsformats |
csreq | Blob der Code-Signing-Anforderung, der den Client identifiziert |
policy_id | Verweis auf eine MDM-Richtlinie, falls vorhanden |
indirect_object_identifier_type, indirect_object_identifier, indirect_object_code_identity | Ziel der Freigabe (Automation) |
flags | Zusätzliche Flags |
last_modified | Letzte Änderung der Zeile |
pid, pid_version, boot_uuid, last_reminded | Hinzugefügt in macOS 14 Sonoma |
Unter Mojave und Catalina nutzte die Tabelle allowed und prompt_count statt auth_value und auth_reason. Führen Sie immer zuerst .schema access aus.
Zeitstempel
last_modified ist in Sekunden der Unix-Epoche, UTC angegeben, anders als bei den meisten Apple-Datenbanken, die Mac Absolute Time verwenden. Der Wert spiegelt den letzten Schreibvorgang auf diese Zeile wider (Abfrage beantwortet, Schalter umgelegt, Richtlinie angewendet), nicht die erste Freigabe.
SELECT service, client, auth_value, auth_reason,
datetime(last_modified, 'unixepoch') AS last_modified_utc
FROM access ORDER BY last_modified DESC;
last_reminded (ab Sonoma) ist ebenfalls in Unix-Sekunden; der Standardwert im Schema ist strftime('%s','now'). Erstellungs- und Änderungszeiten von TCC.db im Dateisystem (APFS, Nanosekundengenauigkeit) zeigen nur, wann sich die Datenbank geändert hat, nicht welche Zeile.
Aufbewahrung
Zeilen bleiben bestehen, bis die Entscheidung geändert wird, der Client mit tccutil reset <service> [bundle-id] zurückgesetzt wird, der Benutzer die Berechtigungen in den Systemeinstellungen zurücksetzt oder die Datenbank neu aufgebaut wird. Es gibt keine automatische Alterung. Gelöschte Zeilen können eine Zeit lang in der WAL-Datei oder in freien Seiten überdauern, und ältere Kopien können in lokalen APFS-Snapshots oder Time-Machine-Backups existieren.
Sicherung
Der sichernde Prozess (Terminal, der Agent oder das Tool-Binärprogramm) muss auf einem Live-System Full Disk Access besitzen, sonst schlägt die Kopie stillschweigend fehl oder bleibt leer.
# Live, with FDA granted to Terminal
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
- Aftermath kopiert die System- und Benutzer-
TCC.dbsowieMDMOverrides.plist(als root mit FDA ausführen), aber nichtTCC.db-wal: Änderungen, die noch im WAL stehen, und die älteren Zeilenversionen darin gehen verloren. - UAC sichert sowohl die System- als auch die Benutzer-
TCC.db(files/system/tcc.yaml), aber nichtTCC.db-waloderTCC.db-shm, mit demselben Verlust. Kopieren Sie die Begleitdateien selbst, wie in den Befehlen oben. - Velociraptor
MacOS.System.TCCliest beide Datenbanken direkt. - Dead-Box: Hängen Sie das Data-Volume schreibgeschützt ein; TCC und SIP schränken das Lesen von einem Analyse-Host aus nicht ein.
Auswertung
- sqlite3 auf einer Kopie, mit den obigen Abfragen.
- Plugin
TCCvon mac_apt:python mac_apt.py -o out E01 mac.E01 TCC. - SQLite-Plugin
macostccvon Plaso:log2timeline.py --parsers 'sqlite/macostcc' --storage-file tcc.plaso ./case. - Artefakt
MacOS.System.TCCvon Velociraptor für die Suche in der Flotte.
Prüfung auf hohes Risiko:
SELECT service, client, client_type, auth_value, auth_reason,
datetime(last_modified,'unixepoch') AS changed_utc
FROM access
WHERE auth_value = 2
AND (service IN ('kTCCServiceSystemPolicyAllFiles','kTCCServiceAccessibility',
'kTCCServiceScreenCapture','kTCCServiceListenEvent',
'kTCCServicePostEvent')
OR client_type = 1);
TCC Parser dekodiert System- und Benutzer-TCC.db samt -wal (einschließlich älterer Zeilenversionen aus dem WAL), MDMOverrides.plist und csreq-Blobs im Browser und markiert riskante Freigaben; es wird nichts hochgeladen.
Tipps für die Untersuchung
- Freigaben für Interpreter oder Terminals (
/bin/bash,/usr/bin/osascript,com.apple.Terminal) gelten für alles, was darüber gestartet wird. Wechseln Sie zur Shell-Historie und zu den launchd-Jobs. - Eine verweigerte Zeile (
auth_value = 0) belegt dennoch eine Anfrage, oft den ersten sichtbaren Versuch einer Malware. auth_reason = 6weist auf MDM hin. Bestätigen Sie das mitMDMOverrides.plistundsudo profiles show -type configuration; ein unautorisiertes Profil ist für sich schon ein Befund.- Entscheidungen von
tccdwerden im Subsystemcom.apple.TCCin den Unified Logs protokolliert. Dort finden sich die Belege pro Anfrage. - Unter Sequoia zeigen weit in der Zukunft liegende Daten in
ScreenCaptureApprovals.plist, dass jemand die regelmäßige Erinnerung zur Bildschirmaufnahme unterdrückt hat. - Endpoint Security meldet TCC-Änderungen ab macOS 15.4 an EDR-Tools (
ES_EVENT_TYPE_NOTIFY_TCC_MODIFY); prüfen Sie Ihre EDR-Telemetrie auf Änderungen, die die Datenbank nicht mehr zeigt. - Vergleichen Sie
csreqmit der Signatur des Binärprogramms auf der Platte: Eine Zeile mit Bundle-ID gilt für jeden Code, der die gespeicherte Anforderung erfüllt. - Service-Listen und Abfragemuster finden Sie im Leitfaden zur TCC-Datenbank-Forensik.
Siehe auch
Verwandte Artefakte
Ausführliche Leitfäden
Glossar
- TCC (Transparency, Consent, and Control)Englisch
- Unified LogsEnglisch