Zum Inhalt springen

AusführungPersistenz

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

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

BereichPfadVersionshinweiseSchutz
System/Library/Application Support/com.apple.TCC/TCC.dbSchema von access geändert in 11 Big Sur und 14 SonomaSIP + TCC, zum Lesen ist Full Disk Access nötig
Pro Benutzer~/Library/Application Support/com.apple.TCC/TCC.dbGleiches Schema wie SystemTCC, zum Lesen ist Full Disk Access nötig
MDM-Freigaben/Library/Application Support/com.apple.TCC/MDMOverrides.plistVerwaltete MacsDurch SIP geschütztes Verzeichnis
Erinnerungsdaten für Bildschirmaufnahme~/Library/Group Containers/group.com.apple.replayd/ScreenCaptureApprovals.plistAb 15 SequoiaDurch 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 mit MDMOverrides.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):

SpalteBedeutung
serviceDienstkennung, z. B. kTCCServiceSystemPolicyAllFiles (Full Disk Access), kTCCServiceAccessibility, kTCCServiceScreenCapture, kTCCServiceListenEvent, kTCCServiceAppleEvents
clientBundle-ID oder absoluter Pfad des anfragenden Programms
client_type0 Bundle-ID, 1 absoluter Pfad
auth_value0 verweigert, 1 unbekannt, 2 erlaubt, 3 eingeschränkt
auth_reasonVon 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_versionVersion des Eintragsformats
csreqBlob der Code-Signing-Anforderung, der den Client identifiziert
policy_idVerweis auf eine MDM-Richtlinie, falls vorhanden
indirect_object_identifier_type, indirect_object_identifier, indirect_object_code_identityZiel der Freigabe (Automation)
flagsZusätzliche Flags
last_modifiedLetzte Änderung der Zeile
pid, pid_version, boot_uuid, last_remindedHinzugefü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.db sowie MDMOverrides.plist (als root mit FDA ausführen), aber nicht TCC.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 nicht TCC.db-wal oder TCC.db-shm, mit demselben Verlust. Kopieren Sie die Begleitdateien selbst, wie in den Befehlen oben.
  • Velociraptor MacOS.System.TCC liest 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 TCC von mac_apt: python mac_apt.py -o out E01 mac.E01 TCC.
  • SQLite-Plugin macostcc von Plaso: log2timeline.py --parsers 'sqlite/macostcc' --storage-file tcc.plaso ./case.
  • Artefakt MacOS.System.TCC von 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 = 6 weist auf MDM hin. Bestätigen Sie das mit MDMOverrides.plist und sudo profiles show -type configuration; ein unautorisiertes Profil ist für sich schon ein Befund.
  • Entscheidungen von tccd werden im Subsystem com.apple.TCC in 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 csreq mit 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