TCC.db-Forensik: der Leitfaden für Ermittler
Was die TCC-Datenbank von macOS aufzeichnet, was sie belegt und was nicht, die wichtigsten Dienste und ein wiederholbarer Ablauf für die forensische Analyse.
Kurz gesagt. Transparency, Consent and Control (TCC) ist das macOS-Framework, das entscheidet, ob ein Programm Kamera, Mikrofon, Bildschirm, Eingabegeräte, Bedienungshilfen-APIs, geschützte Ordner, die gesamte Festplatte oder über Apple Events andere Apps nutzen darf. Der Daemon tccd speichert jede Entscheidung als Zeile in einer SQLite-Datenbank, der TCC.db: eine für das System und eine pro Benutzer. Jede Zeile sagt Ihnen, welcher Client, welcher Dienst, erlaubt oder verweigert, warum und wann sich die Zeile zuletzt geändert hat. Sie ist ein Berechtigungsregister, kein Nutzungsprotokoll. TCC Parser dekodiert diese Datenbanken in Ihrem Browser, einschließlich früherer Zeilenversionen in der WAL-Datei; nichts wird hochgeladen.
Dieser Leitfaden ist der Einstieg in die Serie. Jeder Abschnitt verweist auf einen vertiefenden Artikel.
Was TCC ist und warum es Ermittler interessiert
Fast alles, was Malware oder ein Eindringling auf einem Mac Interessantes tun will, berührt eine durch TCC geschützte Ressource: Mail, Nachrichten oder Browserdaten lesen (dafür ist Festplattenvollzugriff nötig), den Bildschirm beobachten (Bildschirmaufnahme), Tastatureingaben mitschneiden (Eingabeüberwachung), sich durch Dialoge klicken (Bedienungshilfen) oder Finder und System Events steuern, um im Namen des Benutzers zu handeln (Apple-Events-Automation). Fordert ein Programm eine dieser Fähigkeiten an, fragt tccd den Benutzer, wendet eine Richtlinie an oder lehnt ab, und hält das Ergebnis fest.
Damit ist TCC.db einer der Orte, an denen Absicht sichtbar wird. Ein pfadbasiertes Hilfsprogramm in einem versteckten Cache-Ordner, das Bedienungshilfen anfordert, oder Terminal, das wenige Minuten nach einem verdächtigen Download Festplattenvollzugriff erhält: Genau so etwas hält die Datenbank zuverlässig fest.
Was eine Zeile belegen kann und was nicht
| Eine Zeile kann zeigen | Eine Zeile kann nicht zeigen |
|---|---|
| Dass ein Client (Bundle-ID oder absoluter Pfad) einen Dienst besitzt oder verweigert bekam | Dass die Fähigkeit tatsächlich genutzt wurde, oder wie oft |
| Ob die Entscheidung erlaubt, verweigert, unbekannt oder eingeschränkt war (auth_value) | Was aufgezeichnet, gelesen oder eingegeben wurde |
| Einen Grundcode für die Entscheidung (auth_reason, von der Community dokumentiert) | Wer tatsächlich an der Tastatur saß |
| Die Code-Signing-Anforderung, die der Client erfüllen muss (csreq) | Dass das heutige Binärprogramm auf der Platte das freigegebene ist |
| Bei Automation, welche App gesteuert wird | Jeden früheren Zustand der Zeile (nur den letzten, sofern die WAL nicht mehr bewahrt) |
Wann sich die Zeile zuletzt geändert hat (last_modified, Unix-Sekunden UTC) | Wann die Berechtigung zuerst erteilt wurde, falls sich die Zeile seitdem geändert hat |
Zwei Folgen prägen jeden Bericht. Erstens: Eine Freigabe ist eine Fähigkeit, keine Aktivität. Schreiben Sie „besaß ab 10:11:37 UTC Festplattenvollzugriff“, nicht „las die E-Mails des Benutzers“. Zweitens: Fehlende Einträge sind schwache Belege. Zeilen werden durch tccutil reset, durch Zurücksetzen in den Systemeinstellungen und beim Entfernen von Apps gelöscht. Siehe entfernte Freigaben aus der WAL wiederherstellen.
Wo die Datenbanken liegen
| Datenbank | Pfad | Typischer Inhalt |
|---|---|---|
| System | /Library/Application Support/com.apple.TCC/TCC.db | Festplattenvollzugriff, Bedienungshilfen, Bildschirmaufnahme, Eingabeüberwachung, Entwicklertools, Endpoint-Security-Clients |
| Pro Benutzer | ~/Library/Application Support/com.apple.TCC/TCC.db | Kamera, Mikrofon, Kontakte, Kalender, Fotos, Automation, Schreibtisch/Dokumente/Downloads, Wechsel- und Netzwerkvolumes |
| MDM-Freigaben | /Library/Application Support/com.apple.TCC/MDMOverrides.plist | PPPC-Freigaben, die ein Verwaltungsserver verteilt hat |
Die Spalte „Typischer Inhalt“ ist eine Orientierung: Die Aufteilung richtet sich nach dem Dienst und hat sich zwischen Versionen verschoben, fragen Sie also immer jede Kopie ab. Um eine dieser Dateien auf einem laufenden Mac zu lesen, braucht der kopierende Prozess Festplattenvollzugriff, und System Integrity Protection schützt die System-Datenbank zusätzlich vor Änderungen, selbst durch root. Auch die Begleitdateien TCC.db-wal und TCC.db-shm zählen. Details zur Sicherung und zu Eigenheiten der Werkzeuge: TCC.db unter macOS: Speicherort und Sicherung.
Eine Zeile lesen
Die entscheidende Tabelle ist access. Ab Big Sur sind das die Spalten, die Sie am häufigsten brauchen:
| Spalte | Was sie Ihnen sagt |
|---|---|
service | Den TCC-Dienst, z. B. kTCCServiceSystemPolicyAllFiles |
client | Bundle-ID oder absoluter Pfad des Programms |
client_type | 0 Bundle-ID, 1 absoluter Pfad (client_type) |
auth_value | 0 verweigert, 1 unbekannt, 2 erlaubt, 3 eingeschränkt |
auth_reason | Warum (Zustimmung des Benutzers, vom Benutzer gesetzt, MDM-Richtlinie usw.; von der Community dokumentiert) |
csreq | Kompilierte Code-Anforderung, die den Client identifiziert |
indirect_object_identifier | Bei Automation: die gesteuerte App |
last_modified | Sekunden der Unix-Epoche, UTC |
Mojave und Catalina nutzten allowed und prompt_count statt auth_value und auth_reason; Sonoma fügte pid, pid_version, boot_uuid und last_reminded hinzu. Prüfen Sie auf Ihrer Kopie immer .schema access. Die vollständige Entwicklung und die kleineren Tabellen rund um access beschreibt die TCC-Tabelle access in allen macOS-Versionen.
Die wichtigsten Dienste
| Dienstkennung | In den Systemeinstellungen angezeigt als | Warum sie zählt |
|---|---|---|
kTCCServiceSystemPolicyAllFiles | Festplattenvollzugriff | Liest geschützte Benutzerdaten: Mail, Nachrichten, Safari, andere TCC.db-Dateien |
kTCCServiceAccessibility | Bedienungshilfen | Steuert die Oberfläche: Klicks, Tastatureingaben, Bestätigen von Dialogen |
kTCCServiceScreenCapture | Bildschirmaufnahme | Sieht alles, was auf dem Bildschirm ist |
kTCCServiceListenEvent | Eingabeüberwachung | Beobachtet Tastatur- und Mausereignisse |
kTCCServicePostEvent | (synthetische Eingaben) | Erzeugt Eingabeereignisse |
kTCCServiceAppleEvents | Automation | Steuert eine andere App; Ziel in indirect_object_identifier |
kTCCServiceSystemPolicyDocumentsFolder und verwandte Dienste | Dateien und Ordner | Schreibtisch, Dokumente, Downloads |
kTCCServiceSystemPolicyRemovableVolumes | Wechselmedien | USB-Laufwerke und Ähnliches |
kTCCServiceEndpointSecurityClient | (Endpoint Security) | Sicherheitsagenten; ein neuer verdient einen Blick |
Wer entschieden hat: Benutzer, System oder MDM
Mit auth_reason unterscheiden Sie einen Klick des Benutzers von einer Richtlinie. Häufig genannte Werte sind 2 Zustimmung des Benutzers (hat eine Abfrage beantwortet), 3 vom Benutzer gesetzt (in den Systemeinstellungen umgeschaltet), 4 vom System gesetzt und 6 MDM-Richtlinie. Apple dokumentiert diese Zahlen nicht. Behandeln Sie sie als Hypothesen und bestätigen Sie sie auf einem Test-Mac derselben Version oder im Unified Log, bevor Sie sich darauf stützen.
Auf verwalteten Macs spiegeln sich Freigaben aus einem Profil für Privacy Preferences Policy Control (PPPC) in MDMOverrides.plist wider, und Zeilen können über policy_id auf die Tabelle policies verweisen. Ein legitimer EDR-Agent mit Festplattenvollzugriff aus MDM ist normal. Ein unerwartetes PPPC-Profil ist für sich schon ein Befund.
Ein wiederholbarer Ablauf
- Sichern Sie den gesamten Ordner
com.apple.TCCdes Systems und jedes Benutzers, mit-walund-shm, aus einem Prozess mit Festplattenvollzugriff (oder aus einem eingebundenen Abbild). Bilden Sie Hashes über das Gesicherte. - Prüfen Sie das Schema jeder Datenbank vor der Abfrage: Die Spalten unterscheiden sich je nach Version.
- Prüfen Sie Freigaben mit hoher Tragweite: Festplattenvollzugriff, Bedienungshilfen, Bildschirmaufnahme, Eingabeüberwachung, Post Event, Entwicklertools, Endpoint Security. Fragen Sie, wer sie besitzt und ob das zur Rolle des Benutzers passt.
- Sehen Sie sich pfadbasierte Clients an (
client_type = 1) sowie Clients in temporären, gemeinsam genutzten oder versteckten Ordnern. Legitime Apps sind fast immer Bundle-IDs. - Dekodieren Sie
csreq. Eine Anforderung, die nur aus einemcdhashbesteht, bindet die Zeile an genau einen Build, typisch für ad hoc signierten Code. Siehe csreq dekodieren. - Lesen Sie die Automation-Zeilen in jeder Benutzer-Datenbank: welche App Finder, System Events oder Terminal steuern darf.
- Stellen Sie den Verlauf wieder her aus
TCC.db-walund freien Seiten: entfernte und geänderte Freigaben. - Erstellen Sie eine Zeitachse aus
last_modifiedund korrelieren Sie sie mit dem Unified Log (subsystem == "com.apple.TCC"), Quarantäne-Ereignissen, launchd-Jobs und der Shell-Historie.
Der Artikel Missbrauch von TCC-Berechtigungen untersuchen spielt das an einem realistischen, fiktiven Einbruch durch.
Werkzeuge
- sqlite3 auf einer Kopie, mit eigenen Abfragen. Gut für Stichproben; Blobs und Grundcodes dekodieren Sie selbst.
- Plugin
TCCvon mac_apt: unterstützt die Layouts von Catalina sowie ab Big Sur, aus einem Abbild oder im Artifact-only-Modus. - Plugin
macostccvon Plaso: erwartet die Spaltenallowed/prompt_countaus der Zeit vor Big Sur und zielt daher auf Datenbanken von Mojave und Catalina. - Velociraptor
MacOS.System.TCC: Live-Abfragen über eine ganze Flotte. - TCC Parser: Ordner oder Triage-ZIP in den Browser ziehen; er dekodiert jede Schemaversion, die Code-Anforderungen und Grundcodes, markiert auffällige Zeilen, stellt den Verlauf aus der WAL wieder her und exportiert CSV, Timesketch-CSV und JSON. Die Schritt-für-Schritt-Anleitung steht in TCC.db im Browser analysieren.
Apple und macOS sind Marken der Apple Inc. TCC Parser ist ein unabhängiges Werkzeug und steht in keiner Verbindung zu Apple und wird nicht von Apple unterstützt.
Fallstricke
- Unvollständige Sicherung. Ohne Festplattenvollzugriff schlägt die Kopie fehl oder bleibt leer. Fehlt TCC.db in einem Triage-Paket, ist das meist ein Problem der Sicherung.
- Die WAL vergessen. Mehrere Sicherungswerkzeuge kopieren nur
TCC.db. Jüngste Änderungen können noch inTCC.db-walstehen. - Verantwortlicher Prozess. Berechtigungen werden oft der App zugeordnet, die ein Werkzeug gestartet hat (Terminal), statt dem Skript, das sie genutzt hat. Eine Freigabe für Terminal gilt für alles, was darin ausgeführt wird.
- Bundle-ID oder Binärprogramm. Eine Zeile mit Bundle-ID gilt für jeden Code, der die gespeicherte Anforderung erfüllt. Vergleichen Sie die Anforderung mit dem Binärprogramm auf der Platte.
- Grundcodes überinterpretieren. Die Bedeutungen von
auth_reasonsind von der Community dokumentiert, nicht offiziell.
Häufige Fragen
Zeigt TCC.db jedes Mal, wenn eine App die Kamera genutzt oder meine Dateien gelesen hat?
Nein. TCC.db speichert dauerhafte Entscheidungen: welchem Client welcher Dienst erlaubt oder verweigert wurde und wann sich diese Entscheidung zuletzt geändert hat. Einzelne Zugriffe werden dort nicht erfasst. Belege pro Anfrage finden sich im Unified Log unter dem Subsystem com.apple.TCC, der Nutzungsverlauf in anderen Artefakten.
Beweist eine fehlende Zeile, dass eine Berechtigung nie erteilt wurde?
Nein. tccutil reset, ein Zurücksetzen in den Systemeinstellungen oder das Entfernen der App löscht Zeilen. Frühere Versionen einer Zeile können eine Zeit lang in TCC.db-wal oder in freien Seiten überdauern, und ältere Kopien der Datenbank können in APFS-Snapshots oder Time-Machine-Backups existieren.
Welche TCC-Datenbank sollte ich ansehen, die des Systems oder die des Benutzers?
Beide, jedes Mal. Dienste mit hoher Tragweite wie Festplattenvollzugriff, Bedienungshilfen und Bildschirmaufnahme stehen meist in der System-Datenbank, Kamera, Mikrofon, Automation und Ordnerzugriffe meist in der Datenbank des jeweiligen Benutzers. Die Aufteilung richtet sich nach dem Dienst und hat sich zwischen Versionen verschoben, fragen Sie also alle Kopien ab.
In welcher Zeitzone ist last_modified angegeben?
last_modified enthält Sekunden der Unix-Epoche, also UTC. Es ist keine Mac Absolute Time. Dasselbe gilt für last_reminded (ab Sonoma) und für expired_at in der Tabelle expired.