Skip to content

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.

Veröffentlicht am 9 Min. Lesezeit

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 zeigenEine Zeile kann nicht zeigen
Dass ein Client (Bundle-ID oder absoluter Pfad) einen Dienst besitzt oder verweigert bekamDass 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 wirdJeden 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

DatenbankPfadTypischer Inhalt
System/Library/Application Support/com.apple.TCC/TCC.dbFestplattenvollzugriff, Bedienungshilfen, Bildschirmaufnahme, Eingabeüberwachung, Entwicklertools, Endpoint-Security-Clients
Pro Benutzer~/Library/Application Support/com.apple.TCC/TCC.dbKamera, Mikrofon, Kontakte, Kalender, Fotos, Automation, Schreibtisch/Dokumente/Downloads, Wechsel- und Netzwerkvolumes
MDM-Freigaben/Library/Application Support/com.apple.TCC/MDMOverrides.plistPPPC-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:

SpalteWas sie Ihnen sagt
serviceDen TCC-Dienst, z. B. kTCCServiceSystemPolicyAllFiles
clientBundle-ID oder absoluter Pfad des Programms
client_type0 Bundle-ID, 1 absoluter Pfad (client_type)
auth_value0 verweigert, 1 unbekannt, 2 erlaubt, 3 eingeschränkt
auth_reasonWarum (Zustimmung des Benutzers, vom Benutzer gesetzt, MDM-Richtlinie usw.; von der Community dokumentiert)
csreqKompilierte Code-Anforderung, die den Client identifiziert
indirect_object_identifierBei Automation: die gesteuerte App
last_modifiedSekunden 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

DienstkennungIn den Systemeinstellungen angezeigt alsWarum sie zählt
kTCCServiceSystemPolicyAllFilesFestplattenvollzugriffLiest geschützte Benutzerdaten: Mail, Nachrichten, Safari, andere TCC.db-Dateien
kTCCServiceAccessibilityBedienungshilfenSteuert die Oberfläche: Klicks, Tastatureingaben, Bestätigen von Dialogen
kTCCServiceScreenCaptureBildschirmaufnahmeSieht alles, was auf dem Bildschirm ist
kTCCServiceListenEventEingabeüberwachungBeobachtet Tastatur- und Mausereignisse
kTCCServicePostEvent(synthetische Eingaben)Erzeugt Eingabeereignisse
kTCCServiceAppleEventsAutomationSteuert eine andere App; Ziel in indirect_object_identifier
kTCCServiceSystemPolicyDocumentsFolder und verwandte DiensteDateien und OrdnerSchreibtisch, Dokumente, Downloads
kTCCServiceSystemPolicyRemovableVolumesWechselmedienUSB-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

  1. Sichern Sie den gesamten Ordner com.apple.TCC des Systems und jedes Benutzers, mit -wal und -shm, aus einem Prozess mit Festplattenvollzugriff (oder aus einem eingebundenen Abbild). Bilden Sie Hashes über das Gesicherte.
  2. Prüfen Sie das Schema jeder Datenbank vor der Abfrage: Die Spalten unterscheiden sich je nach Version.
  3. 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.
  4. 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.
  5. Dekodieren Sie csreq. Eine Anforderung, die nur aus einem cdhash besteht, bindet die Zeile an genau einen Build, typisch für ad hoc signierten Code. Siehe csreq dekodieren.
  6. Lesen Sie die Automation-Zeilen in jeder Benutzer-Datenbank: welche App Finder, System Events oder Terminal steuern darf.
  7. Stellen Sie den Verlauf wieder her aus TCC.db-wal und freien Seiten: entfernte und geänderte Freigaben.
  8. Erstellen Sie eine Zeitachse aus last_modified und 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 TCC von mac_apt: unterstützt die Layouts von Catalina sowie ab Big Sur, aus einem Abbild oder im Artifact-only-Modus.
  • Plugin macostcc von Plaso: erwartet die Spalten allowed/prompt_count aus 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 in TCC.db-wal stehen.
  • 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_reason sind 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.

Verwandte Artikel

Verwandte Artikel

Schritt für Schritt: TCC.db samt WAL in einen kostenlosen Browser-Parser laden, Befunde lesen, Berechtigungen und Verlauf prüfen, Zeitraum setzen, exportieren.
Wo System- und Benutzer-TCC.db liegen, warum Festplattenvollzugriff und SIP zählen und wie Sie sie mit WAL per UAC, Aftermath, Velociraptor und mac_apt sichern.
Wie Angreifer TCC-Berechtigungen unter macOS missbrauchen, welche Spuren das in TCC.db hinterlässt und welche Artefakte Sie als Nächstes prüfen.