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
Outils
Comparer tous les outils- Unified Log ParserNavigateur
- Quarantine ParserNavigateur
- logCLI · intégré à macOS
- mac_aptCLI · open source
- sqlite3CLI · intégré à macOS
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
| Artefact | Chemin | macOS | Protection |
|---|---|---|---|
| Base Gatekeeper et politique d'exécution | /var/db/SystemPolicyConfiguration/ExecPolicy | Documentée depuis 10.14 ; table provenance_tracking à partir de 13 | root |
| Base des tickets de notarisation | /var/db/SystemPolicyConfiguration/Tickets | Documentée depuis 10.14 | root |
| Base de politique Gatekeeper | /var/db/SystemPolicy (table authority) ; /var/db/SystemPolicyConfiguration/SystemPolicy sur les versions récentes | Ancienne, emplacement variable selon la version | root |
| Dernier rejet Gatekeeper | /private/var/db/SystemPolicyConfiguration/.LastGKReject ; versions plus anciennes : /private/var/db/.LastGKReject | Chemin actuel dans le code Security d'Apple depuis macOS 15 ; chemin historique avant | root |
| Données Gatekeeper | /private/var/db/gkopaque.bundle ; gke.bundle dans /private/var/db ou /var/db/SystemPolicyConfiguration selon la version | Versions actuelles | root |
| Données XProtect (historique) | /Library/Apple/System/Library/CoreServices/XProtect.bundle | 10.15-14 ; solution de repli sur 15 et ultérieur | SIP |
| Données XProtect (principal) | /var/protected/xprotect/XProtect.bundle | 15 Sequoia et ultérieur | SIP |
| XProtect Remediator | /Library/Apple/System/Library/CoreServices/XProtect.app | 12.3 et ultérieur | SIP |
| Base du Behavior Service | /var/protected/xprotect/XPdb | 13 Ventura et ultérieur | root |
| Base du Behavior Service (déplacée) | /var/protected/xprotect/db/XPdb | XProtectPayloads 156 et ultérieur | Data Vault à partir de 26.2 |
| Journaux | Unified log (/private/var/db/diagnostics) | Toutes | root 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 ESES_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.plistdes 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 showne suit pasTZ; sans--timezone, il affiche chaque entrée dans le fuseau horaire enregistré au moment de son écriture. Passez--timezone UTCpour les chronologies (voir Unified Logs). dtde XPdb : date-heure textuelle (par exemple2023-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, pasdb/XPdb), les versions d'XProtect et l'état de Gatekeeper. - UAC
files/system/xprotect.yamlcollecte les fichiersInfo.plistd'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
XPROTECTde mac_apt (fichiers de diagnostic XProtect et base du Behavior Service) et pluginQUARANTINE(.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_pathdans 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/XPdbpeut être ancien ou obsolète : vérifiez le sous-dossierdb. - 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
AppTranslocationdans 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
Artefacts liés
Guides détaillés
Glossaire
- GatekeeperAnglais
- Quarantine Attribute (com.apple.quarantine)Anglais
- Unified LogsAnglais
- Sealed System Volume (SSV)Anglais