Zum Inhalt springen

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

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

ArtefaktPfadHinweise
Quarantäne-Datenbank~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2Eine pro Benutzer, SQLite, einzige Tabelle LSQuarantineEvent
Quarantäne-xattrcom.apple.quarantine an der Datei selbstAuf 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 VersionenVon 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:

SpalteBedeutung
LSQuarantineEventIdentifierUUID (Primärschlüssel), entspricht dem letzten Feld des xattr
LSQuarantineTimeStampEreigniszeit, Mac Absolute Time (REAL)
LSQuarantineAgentBundleIdentifierBundle-ID der herunterladenden App
LSQuarantineAgentNameAnzeigename des Agents
LSQuarantineDataURLStringURL der heruntergeladenen Daten
LSQuarantineOriginURLStringVerweisende oder Ursprungsseite
LSQuarantineOriginTitleTitel des Ursprungs, falls erfasst
LSQuarantineSenderName, LSQuarantineSenderAddressAbsender, von Agents wie Mail befüllt
LSQuarantineTypeNumberQuarantänetyp von Launch Services (Web-Download, E-Mail-Anhang usw.)
LSQuarantineOriginAliasAlias-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 Sie 978307200 fü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 QUARANTINE von mac_apt (Datenbank und .LastGKReject): python mac_apt.py -o out MOUNTED /Volumes/evidence QUARANTINE.
  • Plugin ls_quarantine von 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 curl nachgeladene 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 kMDItemWhereFroms im Spotlight-Speicher.
  • Der Wechsel des Flags von 0083 auf 00c3 setzt 0x0040 (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