Aller au contenu

ExécutionJournaux

Traces de Gatekeeper et XProtect sous macOS

Gatekeeper, XProtect et XProtect Remediator laissent journaux et bases qui montrent quel code a été évalué, approuvé, signalé ou supprimé.

Emplacement
/var/db/SystemPolicyConfiguration/ExecPolicy
Prouve
Si macOS a évalué, autorisé, bloqué ou neutralisé un programme donné, et quels comportements il a signalés
Horodatages
Unified log : affiché dans le fuseau enregistré avec chaque entrée sauf si --timezone est passé ; dt de XPdb : date-heure textuelle ; ExecPolicy : secondes Unix
Accès
root ; accès complet au disque ; XPdb est un Data Vault à partir de 26.2
Rétention
Unified log : quelques jours à quelques semaines ; bases : jusqu'à leur reconstruction (variable)
Collecte
Aftermath, mac_apt, UAC, log collect, sysdiagnose

Ce que c'est

Gatekeeper est la politique macOS qui contrôle le code en quarantaine lors de son premier lancement : signature, Developer ID, notarisation et signatures XProtect. Il est implémenté par syspolicyd. XProtect est l'anti-malware à signatures d'Apple (règles YARA et données associées dans XProtect.bundle). XProtect Remediator est un ensemble de scanners de XProtect.app qui s'exécutent périodiquement et peuvent supprimer des logiciels malveillants connus. À partir de macOS 13 Ventura, le XProtect Behavior Service (règles Bastion) enregistre, sans les bloquer, les processus qui touchent des emplacements sensibles.

Aucun de ces mécanismes ne tient un historique unique et ordonné. Les preuves sont réparties entre le unified log, plusieurs bases SQLite et des plists de version.

Où il se trouve

ArtefactCheminmacOSProtection
Base Gatekeeper et politique d'exécution/var/db/SystemPolicyConfiguration/ExecPolicyDocumentée depuis 10.14 ; table provenance_tracking à partir de 13root
Base des tickets de notarisation/var/db/SystemPolicyConfiguration/TicketsDocumentée depuis 10.14root
Base de politique Gatekeeper/var/db/SystemPolicy (table authority) ; /var/db/SystemPolicyConfiguration/SystemPolicy sur les versions récentesAncienne, emplacement variable selon la versionroot
Dernier rejet Gatekeeper/private/var/db/SystemPolicyConfiguration/.LastGKReject ; versions plus anciennes : /private/var/db/.LastGKRejectChemin actuel dans le code Security d'Apple depuis macOS 15 ; chemin historique avantroot
Données Gatekeeper/private/var/db/gkopaque.bundle ; gke.bundle dans /private/var/db ou /var/db/SystemPolicyConfiguration selon la versionVersions actuellesroot
Données XProtect (historique)/Library/Apple/System/Library/CoreServices/XProtect.bundle10.15-14 ; solution de repli sur 15 et ultérieurSIP
Données XProtect (principal)/var/protected/xprotect/XProtect.bundle15 Sequoia et ultérieurSIP
XProtect Remediator/Library/Apple/System/Library/CoreServices/XProtect.app12.3 et ultérieurSIP
Base du Behavior Service/var/protected/xprotect/XPdb13 Ventura et ultérieurroot
Base du Behavior Service (déplacée)/var/protected/xprotect/db/XPdbXProtectPayloads 156 et ultérieurData Vault à partir de 26.2
JournauxUnified log (/private/var/db/diagnostics)Toutesroot pour la lecture

À partir de macOS 26.2, le dossier db est un Data Vault que même root ne peut pas ouvrir sur le système en cours d'exécution ; des chercheurs indiquent qu'il est lisible depuis un volume Data monté (Recovery ou snapshot local). L'attribut étendu com.apple.provenance (11 octets) présent sur les bundles d'applications contient une clé vers provenance_tracking.

Ce qu'il prouve

  • Qu'une application a été évaluée par Gatekeeper, et si elle a été acceptée ou rejetée (entrées de journal de syspolicyd, .LastGKReject).
  • Qu'un utilisateur a explicitement outrepassé Gatekeeper (entrées de journal ; événement Endpoint Security ES_EVENT_TYPE_NOTIFY_GATEKEEPER_USER_OVERRIDE à partir de macOS 15).
  • Qu'une application a été autorisée à s'exécuter pour la première fois après téléchargement, et son cdhash à ce moment (provenance_tracking, Ventura et ultérieur).
  • Que XProtect Remediator a détecté ou neutralisé une menace nommée (catégorie de journal XPEvent.structured ; événements ES ES_EVENT_TYPE_NOTIFY_XP_MALWARE_DETECTED / ..._REMEDIATED à partir de macOS 13).
  • Qu'un processus a déclenché une règle du Behavior Service, avec les empreintes et team IDs de l'exécutable et du processus responsable (XPdb).
  • Quelles versions d'XProtect et de Remediator étaient installées (Info.plist des bundles).

Un verdict propre de Gatekeeper ou d'XProtect ne prouve pas que le code est bénin ; les signatures ne couvrent que des familles connues.

Champs clés

Table events de XPdb (Ventura et ultérieur) : violated_rule, exec_path, exec_cdhash, exec_signing_id, exec_team_id, exec_sha256, exec_is_notarized, responsible_path, responsible_cdhash, responsible_signing_id, responsible_team_id, responsible_sha256, responsible_is_notarized, reported, profile_hash, dt.

ExecPolicy : provenance_tracking (Ventura et ultérieur) stocke la provenance par application avec le cdhash ; les tables plus anciennes incluent legacy_exec_history_v4, scan_targets_v2 et executable_measurements_v2. Les schémas ne sont pas documentés : inspectez-les avec .tables et .schema.

Plists de version : CFBundleShortVersionString dans le Contents/Info.plist de chaque bundle.

Horodatages

  • Unified log : log show ne suit pas TZ ; sans --timezone, il affiche chaque entrée dans le fuseau horaire enregistré au moment de son écriture. Passez --timezone UTC pour les chronologies (voir Unified Logs).
  • dt de XPdb : date-heure textuelle (par exemple 2023-06-30 06:34:28) ; vérifiez le fuseau horaire sur un système de test.
  • Les heures entières d'ExecPolicy sont des secondes Unix ; les modules ExecPolicy d'APOLLO les convertissent avec UNIXEPOCH.
SELECT dt, violated_rule, exec_path, exec_team_id, responsible_path
FROM events ORDER BY dt DESC;

Rétention

Les entrées du unified log disparaissent avec la rotation du magasin (en général de quelques jours à quelques semaines, selon le volume). XPdb enregistre chaque empreinte de règle unique une fois par processus et par démarrage, et les envoie à Apple : n'attendez pas un historique complet. Les lignes d'ExecPolicy et de SystemPolicy persistent jusqu'à ce que macOS les reconstruise. Les bundles XProtect sont remplacés à chaque mise à jour.

Collecte

# Logs first: they age out
sudo log collect --last 7d --output ./case/system.logarchive
# Databases (root, Full Disk Access)
sudo ditto /var/db/SystemPolicyConfiguration ./case/spc
# Older releases keep SystemPolicy and .LastGKReject in /var/db (the ditto above copies the current .LastGKReject)
sudo cp -p /var/db/SystemPolicy /private/var/db/.LastGKReject ./case/ 2>/dev/null
# db/ is a Data Vault on 26.2+: copy it from a snapshot or from Recovery
sudo cp -p /var/protected/xprotect/XPdb* /var/protected/xprotect/db/XPdb* ./case/ 2>/dev/null
spctl --status
  • Aftermath collecte les données du XProtect Behavior Service (depuis l'ancien chemin /var/protected/xprotect/XPdb, pas db/XPdb), les versions d'XProtect et l'état de Gatekeeper.
  • UAC files/system/xprotect.yaml collecte les fichiers Info.plist d'XProtect, d'XProtect Remediator et de MRT.
  • sysdiagnose inclut une archive de journaux.

Analyse

  • log sur un système live ou un .logarchive :
log show ./case/system.logarchive --info \
  --predicate 'subsystem == "com.apple.XProtectFramework.PluginAPI" AND category == "XPEvent.structured"'
log show ./case/system.logarchive --info --predicate 'subsystem == "com.apple.syspolicy.exec"'
log show ./case/system.logarchive --info --predicate 'process == "syspolicyd"'
  • Plugin XPROTECT de mac_apt (fichiers de diagnostic XProtect et base du Behavior Service) et plugin QUARANTINE (.LastGKReject).
  • sqlite3 pour XPdb et ExecPolicy, sur des copies.
  • Évaluer un échantillon sur un Mac d'analyse : spctl --assess --type execute -vv <app>, codesign -dv --verbose=4 <app>.

Unified Log Parser ouvre dans le navigateur une .logarchive, les dossiers diagnostics et uuidtext ou un export log show, applique des règles de triage DFIR et exporte en CSV ou Timesketch ; rien n'est envoyé.

Quarantine Parser lit .LastGKReject avec la base de quarantaine, ce qui permet de relier un rejet à son téléchargement.

Conseils d'investigation

  • Reconstituez la chaîne : événement de quarantaine, puis évaluation Gatekeeper, puis ligne provenance_tracking, puis persistance launchd.
  • À partir de macOS 15, le contournement par Contrôle-clic a disparu ; les dérogations passent par les Réglages Système, si bien qu'une dérogation utilisateur est un acte délibéré qui mérite d'être documenté.
  • responsible_path dans XPdb désigne souvent l'application parente (Terminal, un navigateur, un installeur), ce qui aide à attribuer l'activité.
  • Sur 26.2 et ultérieur, /var/protected/xprotect/XPdb peut être ancien ou obsolète : vérifiez le sous-dossier db.
  • Relevez les versions d'XProtect et de Remediator au moment de la collecte : une détection apparue après une mise à jour indique quand la couverture est arrivée, pas quand l'infection a eu lieu.
  • Des chemins sous AppTranslocation dans les journaux signifient qu'une application en quarantaine s'est exécutée depuis un montage aléatoire en lecture seule.
  • Rapprochez les paquets d'installation de l'historique d'installation et les autorisations de confidentialité de TCC.db.

Voir aussi