Skip to content

TCC.dbTCC.db-wal

TCC Parser

Wer durfte die Festplatte lesen, den Bildschirm beobachten oder den Mac steuern?

Dekodiert die TCC-Datenbanken von macOS (System und pro Benutzer, samt Write-Ahead-Logs) in Berechtigungen, Apps, eine Zeitleiste und wiederhergestellte Historie, mit Prüfhinweisen für riskante Freigaben. Analyse im Browser mit WebAssembly: nichts wird hochgeladen.

TCC.db-Dateien, einen Ordner oder ein Sammlungsarchiv ablegen

System- und Benutzer-TCC.db mit ihren -wal- und -shm-Dateien, MDMOverrides.plist oder eine komplette UAC-, Velociraptor- oder Aftermath-Sammlung (.zip, .tar.gz). Alles wird auf Ihrem Gerät dekodiert.

Keine Daten zur Hand? Testen Sie ein Beispiel: den synthetischen Mac FIN-MBP-03 aus einem fiktiven Angriff (TCC.db + WAL für das System und einen Benutzer, dazu MDMOverrides.plist).

100 % im Browser – Rust + WebAssembly, nichts wird hochgeladen

So kommen Sie an Ihre Daten

Vollständige Anleitung zur Sicherung

Jeder Mac hat eine System-TCC.db und eine pro Benutzer, jeweils mit einer TCC.db-wal, die die neuesten Änderungen und ältere Versionen von Zeilen enthalten kann. Kopieren Sie die kompletten com.apple.TCC-Ordner, nicht nur TCC.db, und behalten Sie die Pfade bei, damit das Tool weiß, welche Datenbank wem gehört.

  1. com.apple.TCC-Ordner kopieren (Festplattenvollzugriff nötig)
  2. Ordner oder Archiv hier ablegen
  3. Lokal geparst – nichts verlässt den Browser

Geben Sie auf dem laufenden Mac dem Terminal Festplattenvollzugriff (Systemeinstellungen › Datenschutz & Sicherheit › Festplattenvollzugriff), öffnen Sie es neu und fügen Sie diesen Block in einem Admin-Account ein. ditto kopiert jeden com.apple.TCC-Ordner unverändert mit TCC.db-wal, TCC.db-shm und MDMOverrides.plist und behält die Struktur Library/… und Users/<name>/… bei.

Terminal · zsh / bash · admin
C=~/Desktop/tcc_case; mkdir -p "$C"
sudo ditto "/Library/Application Support/com.apple.TCC" "$C/Library/Application Support/com.apple.TCC"
for u in /Users/*; do
  d="$u/Library/Application Support/com.apple.TCC"
  [ -d "$d" ] && sudo ditto "$d" "$C/Users/$(basename "$u")/Library/Application Support/com.apple.TCC"
done
R="/private/var/root/Library/Application Support/com.apple.TCC"
sudo test -d "$R" && sudo ditto "$R" "$C$R"
sudo ditto -c -k --keepParent "$C" ~/Desktop/tcc_case.zip

Sie erhalten ~/Desktop/tcc_case und tcc_case.zip. Legen Sie eines davon auf der Seite ab.

Wenn Sie dem Terminal Festplattenvollzugriff geben, wird dadurch selbst eine Zeile in die System-TCC.db geschrieben: Notieren Sie die Uhrzeit, damit Ihre eigene Freigabe nicht mit der des Angreifers verwechselt wird.

Stolperfallen

  • Ohne Festplattenvollzugriff für den kopierenden Prozess (Terminal, Agent, Collector) schlägt die Kopie mit „Operation not permitted“ fehl oder bleibt leer.
  • Sichern Sie TCC.db-wal zusammen mit TCC.db. Tools, die nur TCC.db kopieren (tcc.yaml von UAC, Aftermath), verpassen die noch im WAL liegenden Änderungen und die darin enthaltene Historie.
  • Jeder Account hat eine eigene TCC.db, auch root unter /private/var/root.
  • Öffnen Sie Beweismittel nie mit sqlite3 im Lese-/Schreibmodus: Beim Schließen wird das WAL per Checkpoint in TCC.db übernommen und die -wal-Datei entfernt – damit ist die Historie gelöscht, die dieses Tool wiederherstellt. Arbeiten Sie auf Kopien und hashen Sie diese vorher.
  • Eine Kopie, die während eines Schreibvorgangs von tccd entsteht, kann inkonsistent sein; das Tool spielt nur WAL-Frames mit gültigen Prüfsummen nach und listet den Rest in der Historie.

Was ist TCC.db?

Transparency, Consent and Control (TCC) ist das macOS-Framework, das entscheidet, ob ein Programm Kamera, Mikrofon, Bildschirm, Tastaturereignisse, Bedienungshilfen-APIs, geschützte Ordner, Festplattenvollzugriff oder Automation per Apple Events nutzen darf. Der Daemon tccd speichert jede bestehende Entscheidung in SQLite-Datenbanken namens TCC.db: eine für das System und eine pro Benutzer.

Jede Zeile ist eine Entscheidung für ein Programm (Bundle-ID oder Pfad) und einen Dienst, mit der Entscheidung (erlaubt, abgelehnt, eingeschränkt), ihrem Grund, der Code-Anforderung des Programms und dem Zeitpunkt der letzten Änderung. Sie ist ein Berechtigungsregister, kein Nutzungsprotokoll.

Wo sie gespeichert ist

  • /Library/Application Support/com.apple.TCC/TCC.db: System-Datenbank (durch SIP und TCC geschützt), meist Festplattenvollzugriff, Bedienungshilfen, Bildschirmaufnahme, Eingabeüberwachung.
  • ~/Library/Application Support/com.apple.TCC/TCC.db für jeden Benutzer: Kamera, Mikrofon, Ordner, Wechselmedien, Automation und mehr.
  • TCC.db-wal neben jeder Datenbank: das Write-Ahead-Log mit aktuellen Änderungen und älteren Kopien von Seiten.
  • /Library/Application Support/com.apple.TCC/MDMOverrides.plist: über MDM-Konfigurationsprofile (PPPC) verteilte Freigaben.

Warum sie für Ermittlungen wichtig ist

  • Zeigt, welche Programme alles lesen (Festplattenvollzugriff), den Bildschirm beobachten, Tastatureingaben mitschneiden oder die Oberfläche steuern konnten – einschließlich eines Terminals oder Skript-Hosts, über den alles andere läuft.
  • Datiert die letzte Änderung jeder Entscheidung (Unix-Sekunden, UTC): Eine Häufung von Freigaben im Zeitfenster eines Angriffs ist ein starker Hinweis.
  • Pfad-Clients in temporären, freigegebenen oder versteckten Ordnern und ad-hoc-signierte Code-Anforderungen deuten auf abgelegte Tools hin.
  • Das WAL und freie Seiten können Freigaben bewahren, die später mit tccutil reset entfernt wurden.

Grenzen

  • Eine Zeile zeigt eine Entscheidung, nicht deren Nutzung: TCC.db protokolliert nicht jede Kamera-Aktivierung oder jeden Dateizugriff. Belege für einzelne Anfragen finden sich im Unified Log (Subsystem com.apple.TCC).
  • last_modified ist nur die letzte Änderung; der Zeitpunkt der ersten Freigabe geht verloren, wenn eine Zeile aktualisiert wird.
  • Entfernte Zeilen überdauern nur, bis SQLite den Platz wiederverwendet; eine fehlende Zeile beweist nicht, dass eine Berechtigung nie erteilt wurde.
  • Die auth_reason-Werte und einige Spalten (flags, pid, boot_uuid) sind von Apple nicht dokumentiert; das Tool zeigt Rohwerte neben den Interpretationen der Community.

So sichern Sie die Dateien

  • Kopieren Sie den kompletten Ordner /Library/Application Support/com.apple.TCC und für jeden Benutzer den Ordner ~/Library/Application Support/com.apple.TCC unter Beibehaltung der Pfade aus einem Terminal mit Festplattenvollzugriff (siehe „So kommen Sie an Ihre Daten“).
  • Sichern Sie TCC.db-wal mit jeder TCC.db; tcc.yaml von UAC und Aftermath kopieren nur TCC.db.
  • Binden Sie bei einem Image das Data-Volume schreibgeschützt ein und archivieren Sie dieselben Ordner.

FAQ

Werden meine TCC-Datenbanken irgendwohin hochgeladen?

Nein. Der Parser ist in Rust geschrieben, zu WebAssembly kompiliert und läuft in einem Web Worker in Ihrem Browser. Es gibt keinen Upload-Endpunkt; Tabellen, Befunde und Exporte werden lokal erzeugt.

Welche macOS-Versionen werden unterstützt?

Jedes Layout der Tabelle access: Mojave und Catalina (allowed, prompt_count), Big Sur bis Ventura (auth_value, auth_reason, auth_version) und ab Sonoma (pid, pid_version, boot_uuid, last_reminded). Spaltennamen werden aus dem Schema jeder Datenbank gelesen, unbekannte Spalten werden unverändert angezeigt.

Brauche ich die -wal- und -shm-Dateien?

Bringen Sie die -wal-Datei mit: Sie kann die neuesten Entscheidungen und ältere Versionen von Zeilen enthalten, und das Tool spielt sie nach, wie SQLite es tut. Die -shm-Datei ist nur ein Index des WAL und wird nicht benötigt.

Was bedeutet auth_value 2?

Erlaubt. 0 steht für abgelehnt, 1 für unbekannt und 3 für eingeschränkt. Unter Mojave und Catalina hatte die Tabelle stattdessen eine Spalte allowed (1 = erlaubt), die das Tool auf dieselben Entscheidungen abbildet.

Was ist die Spalte csreq?

Eine kompilierte Codesignatur-Anforderung, die das Programm identifiziert, für das die Entscheidung gilt. Das Tool dekodiert sie in Text wie identifier "com.apple.Terminal" and anchor apple und zeigt die Team-ID oder den cdhash von ad-hoc-signiertem Code.

Kann es gelöschte Berechtigungen wiederherstellen?

Bei jüngeren Änderungen oft: Mit tccutil reset oder über die Systemeinstellungen entfernte Zeilen können in WAL-Frames, in den vom WAL ersetzten Seitenversionen und in freien Seiten überdauern. Sie erscheinen im Tab Historie, bis SQLite den Platz wiederverwendet.

Über den Parser

TCC Parser ist eine unabhängige Rust-Implementierung, kompiliert zu WebAssembly. Er liest SQLite-Dateien selbst, anhand der öffentlichen Spezifikationen für Dateiformat und WAL (sqlite.org), und kann daher die -wal-Datei nachspielen, auflisten, was das WAL ersetzt hat, und Zeilen aus freien Seiten extrahieren – was eine normale SQLite-Abfrage nicht zeigt. Die Spalten werden aus dem jeweiligen Schema jeder Datenbank gelesen, sodass Layouts aus der Mojave-Ära, der Big-Sur-Ära sowie ab Sonoma alle dekodiert werden. Code-Anforderungen (csreq) werden in die von Apple dokumentierte Anforderungssprache dekodiert. Die Bedeutungen von auth_reason sind von der Community dokumentiert, nicht von Apple veröffentlicht; überprüfen Sie wichtige Schlussfolgerungen auf einem Test-Mac mit derselben Version und in den Unified Logs.

Schritt für Schritt: TCC.db samt WAL in einen kostenlosen Browser-Parser laden, Befunde lesen, Berechtigungen und Verlauf prüfen, Zeitraum setzen, exportieren.
Wie sich die Tabelle access in TCC.db von Mojave über Big Sur bis Sonoma verändert hat: allowed, auth_value, auth_reason, pid, last_reminded und Nebentabellen.
So lesen Sie die Blobs csreq und indirect_object_code_identity in TCC.db: kompilierte Code-Anforderungen, anchor, identifier und ad hoc signierte Clients.