DateizugriffNetzwerkAusführung
QuarantineEventsV2 und Quarantäne-xattr unter macOS
QuarantineEventsV2 und das Attribut com.apple.quarantine zeigen, was von welcher URL, mit welcher App und wann geladen wurde, oft noch nach dem Löschen.
- Speicherort
- ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2
- Belegt
- Welche Dateien ein Benutzer heruntergeladen hat, von welcher URL und Ursprungsseite, mit welcher App und wann
- Zeitstempel
- Datenbank: Mac Absolute Time (UTC); xattr: Unix-Sekunden in Hex (UTC)
- Zugriff
- Besitzender Benutzer oder root; Full Disk Access für das Sicherungstool empfohlen
- Aufbewahrung
- Bis zur Löschung oder Bereinigung (keine dokumentierte automatische Löschung)
- Sicherung
- Aftermath, mac_apt, UAC, Velociraptor
- Quarantine ParserBrowser
- mac_aptCLI · Open Source
- PlasoCLI · Open Source
- VelociraptorPlattform · Open Source
- sqlite3CLI · in macOS enthalten
Was es ist
Zwei verknüpfte Artefakte erfassen Downloads unter macOS. Wenn eine App, die an der Datei-Quarantäne teilnimmt (Browser, Mail, Nachrichten, AirDrop, Apps in der Sandbox), eine Datei schreibt, hängt macOS das erweiterte Attribut com.apple.quarantine an. Launch Services schreibt zudem eine Zeile in eine SQLite-Datenbank pro Benutzer, QuarantineEventsV2, mit Download-URL, Ursprungsseite und herunterladendem Agent.
Das xattr wandert mit der Datei, die Datenbankzeile bleibt zurück, wenn die Datei gelöscht wird. Zusammen sind sie der Standardweg, um die Frage „Woher stammt diese Datei?“ zu beantworten.
Wo es liegt
| Artefakt | Pfad | Hinweise |
|---|---|---|
| Quarantäne-Datenbank | ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 | Eine pro Benutzer, SQLite, einzige Tabelle LSQuarantineEvent |
| Quarantäne-xattr | com.apple.quarantine an der Datei selbst | Auf Volumes ohne native xattrs in AppleDouble-Dateien ._ gespeichert |
| Letzte Ablehnung durch Gatekeeper | /private/var/db/SystemPolicyConfiguration/.LastGKReject auf aktuellem macOS; /private/var/db/.LastGKReject auf älteren Versionen | Von syspolicyd geschrieben; mac_apt QUARANTINE sucht in einem Image nur den alten Pfad, übergeben Sie die aktuelle Datei daher direkt |
Die Datenbank hat Name und Speicherort über die modernen macOS-Versionen hinweg beibehalten. Ihr Besitzer kann sie lesen; sichern Sie sie für alle Benutzer als root, mit Full Disk Access für das Sicherungstool.
Was es belegt
- Dass eine URL von einem benannten Agent (
com.apple.Safari,com.google.Chrome,com.apple.mail) zu einem bestimmten Zeitpunkt heruntergeladen wurde. - Die Seite, die zum Download führte (
LSQuarantineOriginURLString), und bei Mail den Absender. - Dass eine bestimmte Datei auf der Platte aus einem bestimmten Download stammt (die UUID im xattr entspricht
LSQuarantineEventIdentifier). - Ob eine Datei in Quarantäne geöffnet und über Gatekeeper freigegeben wurde (Flag für Benutzerfreigabe im xattr).
Es erfasst weder den lokalen Speicherpfad noch den Dateinamen und deckt keine Downloads mit curl, wget, scp, git oder anderen Tools ab, die nicht teilnehmen. Das Fehlen eines Eintrags ist ein schwacher Beleg.
Wichtige Felder
Tabelle LSQuarantineEvent:
| Spalte | Bedeutung |
|---|---|
LSQuarantineEventIdentifier | UUID (Primärschlüssel), entspricht dem letzten Feld des xattr |
LSQuarantineTimeStamp | Ereigniszeit, Mac Absolute Time (REAL) |
LSQuarantineAgentBundleIdentifier | Bundle-ID der herunterladenden App |
LSQuarantineAgentName | Anzeigename des Agents |
LSQuarantineDataURLString | URL der heruntergeladenen Daten |
LSQuarantineOriginURLString | Verweisende oder Ursprungsseite |
LSQuarantineOriginTitle | Titel des Ursprungs, falls erfasst |
LSQuarantineSenderName, LSQuarantineSenderAddress | Absender, von Agents wie Mail befüllt |
LSQuarantineTypeNumber | Quarantänetyp von Launch Services (Web-Download, E-Mail-Anhang usw.) |
LSQuarantineOriginAlias | Alias-Blob, meist leer |
Wert des xattr flags;timestamp;agent;UUID, zum Beispiel 0083;66f7c2a1;Safari;<UUID>. Von Forschenden dokumentierte Flag-Bits (Apple dokumentiert sie nicht öffentlich) sind unter anderem 0x0001 Download, 0x0002 Sandbox, 0x0004 harte Quarantäne und 0x0040 vom Benutzer freigegeben.
Zeitstempel
LSQuarantineTimeStamp: Mac Absolute Time, Sekunden seit 2001-01-01 00:00:00 UTC. Addieren Sie978307200für Unix-Zeit.- Zeitstempel im xattr: hexadezimale Unix-Sekunden, UTC.
SELECT datetime(LSQuarantineTimeStamp + 978307200, 'unixepoch') AS event_utc,
LSQuarantineAgentBundleIdentifier, LSQuarantineDataURLString,
LSQuarantineOriginURLString, LSQuarantineEventIdentifier
FROM LSQuarantineEvent ORDER BY LSQuarantineTimeStamp;
xattr -p com.apple.quarantine ./sample.dmg
date -u -r $((16#66f7c2a1))
Aufbewahrung
Eine automatische Löschung ist nicht dokumentiert: Einträge sammeln sich typischerweise über die gesamte Lebensdauer des Benutzerprofils an, was sie wertvoll macht, nachdem die heruntergeladene Datei entfernt wurde. Benutzer, Bereinigungstools und Angreifer können Zeilen mit sqlite3 löschen oder die ganze Datei entfernen. Das xattr geht verloren, wenn es mit xattr -d/xattr -c entfernt wird, wenn eine Datei auf ein Dateisystem oder einen Dienst kopiert wird, der erweiterte Attribute verwirft, oder wenn ein Archiv mit einem Tool entpackt wird, das die Quarantäne nicht weitergibt.
Sicherung
# Every user's database (root, collector with Full Disk Access)
for u in /Users/*; do
f="$u/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2"
[ -f "$f" ] || continue
d="./case/qe_$(basename "$u")"
mkdir -p "$d" && sudo cp -p "$f"* "$d/"
done
# Preserve xattrs when copying suspect files
ditto --extattr ./suspect.pkg ./case/files/
- Aftermath sichert die LSQuarantine-Datenbank.
- UAC:
files/system/quarantine_events.yaml(Datenbank pro Benutzer). - Velociraptor:
MacOS.System.QuarantineEvents. - Dead-Box: vom eingehängten Data-Volume kopieren; zuerst hashen, mit Kopien arbeiten.
Auswertung
- sqlite3 mit der obigen Abfrage.
- Plugin
QUARANTINEvon mac_apt (Datenbank und.LastGKReject):python mac_apt.py -o out MOUNTED /Volumes/evidence QUARANTINE. - Plugin
ls_quarantinevon Plaso:log2timeline.py --parsers 'sqlite/ls_quarantine' --storage-file qe.plaso ./case. - Eine Datei ihrem Eintrag zuordnen:
SELECT * FROM LSQuarantineEvent
WHERE LSQuarantineEventIdentifier = '<UUID from xattr>';
Quarantine Parser liest QuarantineEventsV2 samt -wal (und stellt gelöschte Zeilen wieder her), Listings des xattrs com.apple.quarantine und .LastGKReject im Browser und verknüpft jede Datei auf dem Datenträger mit ihrem Download-Eintrag; es wird nichts hochgeladen.
Tipps für die Untersuchung
- Ein verdächtiges Binärprogramm ohne Quarantäne-xattr, aber mit passendem Datenbankeintrag deutet darauf hin, dass das Attribut gezielt entfernt wurde.
- Eine mit
curlnachgeladene zweite Stufe hinterlässt keine Quarantänespur; wechseln Sie zur Shell-Historie, zu den Unified Logs und zu FSEvents. - Korrelieren Sie Daten-URLs mit dem Safari-Verlauf oder Chrome/Firefox sowie mit
kMDItemWhereFromsim Spotlight-Speicher. - Der Wechsel des Flags von
0083auf00c3setzt0x0040(vom Benutzer freigegeben): Das Objekt wurde geöffnet und zugelassen. Behandeln Sie die Bedeutung der Flags als unterstützenden Beleg. - Lücken in einer sonst dichten Zeitleiste oder eine Datenbank, die viel kleiner ist, als der Browserverlauf vermuten lässt, können auf manuelles Löschen hinweisen; prüfen Sie WAL und freie Seiten.
- Verwechslungen der Epochen zwischen xattr (Unix, hex) und Datenbank (Mac Absolute Time) führen zu Fehlern von 31 Jahren.
- Zu den Gatekeeper-Entscheidungen, die auf den Download folgen, siehe Gatekeeper und XProtect und den Leitfaden zu Quarantäne und Gatekeeper.
Siehe auch
Verwandte Artefakte
Ausführliche Leitfäden
Glossar
- Quarantine Attribute (com.apple.quarantine)Englisch
- GatekeeperEnglisch
- Mac Absolute TimeEnglisch