Skip to content

.LastGKReject: Gatekeeper-Ablehnungen als Beweismittel

Was .LastGKReject festhält, wenn Gatekeeper ein Objekt blockiert, wo die Datei liegt, wie man sie sichert und mit dem Download verknüpft.

Veröffentlicht am 7 Min. Lesezeit

TL;DR. Wenn Gatekeeper die Ausführung eines Objekts verweigert, schreibt syspolicyd eine kleine Property List namens .LastGKReject. Sie enthält ein Lesezeichen (Bookmark) auf das abgelehnte Objekt, aus dem sich Zielpfad und Volume lesen lassen, einen TimeStamp und eine Zahl XProtectMalwareType. Nur die letzte Ablehnung wird aufbewahrt, und die Datei existiert unter Umständen gar nicht. Ist sie aber vorhanden, macht sie aus einem unter Quarantäne gestellten Download einen konkreten, datierten Startversuch, den macOS blockiert hat.

Was Gatekeeper prüft

Gatekeeper ist im Daemon syspolicyd implementiert. Beim ersten Start von Code unter Quarantäne prüft er die Codesignatur, ob der Code mit einer Developer ID signiert ist, ob er notarisiert ist, und er führt XProtect aus. Die Verbindung zum Rest dieser Serie ist das Quarantäne-Attribut: Die Prüfungen hängen am Wert com.apple.quarantine, den die herunterladende App oder das Archivierungsprogramm auf der Datei hinterlassen hat. Der Leitfaden zu den Flags erklärt diesen Wert im Detail.

Zwei Ausgänge hinterlassen Spuren. Genehmigt der Benutzer ein Objekt, erhält das Attribut das Benutzerfreigabe-Flag 0x0040, sodass aus einem Wert wie 0083 der Wert 00c3 wird. Seit macOS 15 gibt es die alte Umgehung per Control-Klick nicht mehr; Ausnahmen laufen über die Systemeinstellungen. Lehnt Gatekeeper das Objekt ab, protokolliert syspolicyd den Fehlschlag in .LastGKReject.

Was .LastGKReject ist

.LastGKReject ist eine Property List im XML- oder Binärformat, die syspolicyd schreibt, wenn Gatekeeper ein Objekt ablehnt. Im quelloffenen Security-Code von Apple übernimmt das PolicyEngine::recordFailure. Zwei Eigenschaften bestimmen, wie man sie liest:

  • Nur die letzte Ablehnung bleibt erhalten. Jede neue Ablehnung ersetzt den vorherigen Eintrag.
  • Sie existiert möglicherweise nicht. Ein Mac, auf dem Gatekeeper nie etwas abgelehnt hat oder auf dem die Datei gelöscht wurde, hat schlicht keine.

Die Datei kann auch existieren und leer sein. Auf einem live untersuchten System mit macOS 26.6 fehlte /private/var/db/.LastGKReject, während /private/var/db/SystemPolicyConfiguration/.LastGKReject als für alle lesbare, 181 Byte große XML-Property-List mit einem leeren Dictionary vorhanden war. Quarantine Parser meldet diesen Fall als „keine Ablehnung verzeichnet“. Das ist eine Beobachtung an einem einzelnen System, keine dokumentierte Regel.

Wo sie liegt

Apples Quellen nennen zwei Orte; prüfen Sie beide:

QuellePfad
Ältere Apple-Quellen/var/db/.LastGKReject (= /private/var/db/.LastGKReject)
Aktuelle Apple-Quellen/var/db/SystemPolicyConfiguration/.LastGKReject

Beide liegen in Systemverzeichnissen; zum Lesen braucht man Root-Rechte.

Die Schlüssel

Das Plugin QUARANTINE von mac_apt liest drei Schlüssel, und Quarantine Parser liest dieselben Informationen:

  • BookmarkData: ein Lesezeichen auf das abgelehnte Objekt. Ein Lesezeichen ist eine serialisierte Dateireferenz, kein einfacher Pfad-String; das Tool liest daraus Zielpfad und Volume.
  • TimeStamp: wann die Ablehnung protokolliert wurde.
  • XProtectMalwareType: eine Zahl. mac_apt schreibt diese Zuordnung Patrick Wardle zu: 2 unsignierte App/unsigniertes Programm, 3 verändertes Bundle, 5 signierte App, 7 veränderte App. Die Zuordnung ist berichtet, nicht von Apple dokumentiert.

Lesen Sie XProtectMalwareType als Kategorie der Ablehnung, nicht als Name einer Malware-Familie. Der Wert 2 besagt, dass das abgelehnte Objekt als unsigniert gemeldet wurde; er sagt nicht, was der Code tut.

Wie man sie sichert

Auf einem laufenden Mac kopiert dieser Befehl aus der Sicherungsanleitung, in einem Terminal mit Festplattenvollzugriff ausgeführt, diejenige der beiden Dateien, die existiert:

for f in /private/var/db/.LastGKReject /private/var/db/SystemPolicyConfiguration/.LastGKReject; do
  [ -f "$f" ] && sudo cp -p "$f" ~/qcase/"$(basename "$(dirname "$f")")_LastGKReject"
done

Die Kopien tragen den Namen ihres übergeordneten Verzeichnisses (db_LastGKReject oder SystemPolicyConfiguration_LastGKReject), sodass erkennbar bleibt, von welchem Ort jede stammt. Führen Sie ihn aus, nachdem Sie ~/qcase angelegt und die Quarantäne-Datenbank kopiert haben, wie im Vergleich der Sicherungswerkzeuge gezeigt. Bilden Sie Hashwerte der Kopien, bevor Sie sie analysieren.

Auf einem eingebundenen Image wertet mac_apt sowohl die Quarantäne-Datenbank als auch .LastGKReject aus:

python mac_apt.py -o out MOUNTED /Volumes/evidence QUARANTINE

In Quarantine Parser ziehen Sie die kopierte Datei allein oder zusammen mit der Datenbank und einem xattr-Listing hinein. Das Tool akzeptiert Property Lists in XML und binär, zeigt Zeit, Zielpfad, Volume und XProtectMalwareType an und meldet einen Befund Gatekeeper-Ablehnung. Die Auswertung läuft in Ihrem Browser; nichts wird hochgeladen.

Die Ablehnung mit dem Download verknüpfen

Für sich allein sagt .LastGKReject nur, dass etwas abgelehnt wurde. Ihren Wert bekommt die Datei erst durch die Verknüpfung mit dem Download, der das Objekt geliefert hat. Bei einem Disk-Image hat die typische Kette drei Glieder.

  1. Das Quarantäne-Ereignis. In QuarantineEventsV2 findet sich der Download des Disk-Images: Agent, URL und Zeit. Der Leitfaden zur Datenbank beschreibt die Spalten.
  2. Das eingebundene Volume. Wird ein unter Quarantäne stehendes Disk-Image eingebunden, steht auch sein Inhalt unter Quarantäne; deshalb ist die darin enthaltene App überhaupt durch Gatekeeper gelaufen. Der abgelehnte Pfad liegt unter /Volumes/<Name>/, und das aus dem Lesezeichen gelesene Volume benennt es.
  3. Die abgelehnte App. Der TimeStamp sollte kurz nach dem Download liegen, und der App-Name sollte zum Image passen.

Im synthetischen Beispiel der Website sieht die Kette so aus:

2026-09-14 10:26:30 UTC  QuarantineEventsV2  Safari  https://transfer.example/d/Qm7/sync-agent.dmg
2026-09-14 10:27:05 UTC  .LastGKReject       /Volumes/Sync Agent/SyncAgent.app  XProtectMalwareType 2

Fünfunddreißig Sekunden liegen zwischen Download und Ablehnung, der Volume-Name passt zum Image, und der gemeldete Typ ist „unsignierte App/unsigniertes Programm“. Keiner der oben genannten Schlüssel ist die Quarantäne-UUID; die Verknüpfung beruht also auf Name und Zeit, nicht auf einer gemeinsamen Kennung. Halten Sie das im Bericht fest. Das Ermittlungsbeispiel Schritt für Schritt verfolgt dasselbe Beispiel von Anfang bis Ende.

Existiert das abgelehnte Objekt noch auf dem Datenträger, lesen Sie auch seinen Wert com.apple.quarantine. Ein Flag 00c3 oder 00c1 bedeutet, dass es später freigegeben wurde. Ein Pfad unter /private/var/folders/.../AppTranslocation/ in anderen Spuren bedeutet, dass eine App unter Quarantäne von einem zufälligen, schreibgeschützten Mount aus lief; siehe App Translocation.

Grenzen

  • Ein einziger Eintrag. Jede spätere Ablehnung, auch eine harmlose, überschreibt den Eintrag, der Sie interessiert. Sichern Sie früh.
  • Kein Eintrag heißt nicht unbedenklich. Die Datei wurde vielleicht nie geschrieben oder wurde gelöscht.
  • Undokumentierte Bezeichnungen. Die Zuordnung von XProtectMalwareType stammt aus Forschung Dritter.
  • Eine Ablehnung ist nicht das Ende der Geschichte. Der Benutzer kann das Objekt in den Systemeinstellungen freigegeben haben, oder das Quarantäne-Attribut wurde mit xattr -d com.apple.quarantine entfernt, woraufhin Gatekeeper nichts mehr zu prüfen hat. Suchen Sie nach dem Flag 0x0040 und nach Dateien, die ein WhereFroms behalten, aber ihr Quarantäne-Attribut verloren haben, wie in kMDItemWhereFroms und Quarantäne beschrieben.
  • Das Lesezeichen zeigt dorthin, wo das Objekt war. Das Volume eines Disk-Images verschwindet beim Auswerfen; der Pfad lässt sich dann eventuell nicht mehr auflösen.
  • Keine Quell-URL. Der Eintrag sagt nicht, woher das Objekt kam. Dafür gibt es die Quarantäne-Datenbank und das Attribut.

Wo man sonst suchen kann

  • Unified Logs. syspolicyd führt die Prüfung durch, daher sind seine Log-Einträge rund um den TimeStamp die naheliegende nächste Quelle. Sie können Prüfungen und Ablehnungen zeigen, die .LastGKReject, das nur die letzte enthält, nicht mehr hat.
  • ExecPolicy. Auf aktuellen macOS-Versionen können Dateien ein 11 Byte langes Attribut com.apple.provenance tragen, einen opaken Schlüssel in die ExecPolicy-Tabelle provenance_tracking. Quarantine Parser dekodiert keines von beiden; behandeln Sie sie als Ansatzpunkte für weitere Werkzeuge.
  • Quarantäne-Daten. Die Ereigniszeile des Images, das Attribut auf dem Image und auf jeder Kopie der App sowie aus freiem Speicher wiederhergestellte Einträge, falls eine Zeile gelöscht wurde.

Eine Übersicht dieser Artefakte auf einer Seite bietet das Gatekeeper- und XProtect-Cheat-Sheet auf unserer Schwesterseite.

Häufige Fragen

Listet .LastGKReject alle Objekte auf, die Gatekeeper blockiert hat?

Nein. Die Datei enthält nur die jüngste Ablehnung; eine spätere Ablehnung ersetzt sie. Sie kann auch ganz fehlen, und ihr Fehlen beweist nichts darüber, was blockiert wurde oder nicht.

Wo wird .LastGKReject gespeichert?

Ältere Apple-Quellen verwenden /var/db/.LastGKReject (dieselbe Datei wie /private/var/db/.LastGKReject); aktuelle Apple-Quellen verwenden /var/db/SystemPolicyConfiguration/.LastGKReject. Prüfen Sie beide Orte und kopieren Sie die Datei mit Root-Rechten.

Was bedeutet XProtectMalwareType?

Es ist eine im Eintrag gespeicherte Zahl. mac_apt, das die Zuordnung Patrick Wardle zuschreibt, nennt 2 für eine unsignierte App oder ein unsigniertes Programm, 3 für ein verändertes Bundle, 5 für eine signierte App und 7 für eine veränderte App. Apple dokumentiert diese Werte nicht; behandeln Sie die Bezeichnung als Hinweis, nicht als Urteil.

Verwandte Artikel