Evidencias de Gatekeeper y XProtect en macOS
Gatekeeper, XProtect y XProtect Remediator dejan entradas de log y bases de datos que muestran qué código se evaluó, aprobó, marcó o eliminó.
- Ubicación
- /var/db/SystemPolicyConfiguration/ExecPolicy
- Prueba
- Si macOS evaluó, permitió, bloqueó o corrigió un programa concreto, y qué comportamientos marcó
- Marcas de tiempo
- Unified log: se muestra en la zona horaria registrada con cada entrada salvo que se use --timezone; dt de XPdb: fecha y hora en texto; ExecPolicy: segundos Unix
- Acceso
- root; Full Disk Access; XPdb es un Data Vault en 26.2+
- Retención
- Unified log: de días a semanas; bases de datos: hasta que se reconstruyen (varía)
- Adquisición
- Aftermath, mac_apt, UAC, log collect, sysdiagnose
Herramientas
Comparar todas las herramientas- Unified Log ParserNavegador
- Quarantine ParserNavegador
- logCLI · incluido en macOS
- mac_aptCLI · código abierto
- sqlite3CLI · incluido en macOS
Qué es
Gatekeeper es la política de macOS que comprueba el código en cuarentena en su primer lanzamiento: firma, Developer ID, notarización y firmas de XProtect. La implementa syspolicyd. XProtect es el antimalware basado en firmas de Apple (reglas YARA y datos relacionados en XProtect.bundle). XProtect Remediator es un conjunto de escáneres dentro de XProtect.app que se ejecutan periódicamente y pueden eliminar malware conocido. Desde macOS 13 Ventura, el XProtect Behavior Service (reglas Bastion) registra, pero no bloquea, los procesos que acceden a ubicaciones sensibles.
Ninguno de ellos mantiene un historial único y ordenado. La evidencia está repartida entre el unified log, varias bases de datos SQLite y plists de versión.
Dónde se encuentra
| Artefacto | Ruta | macOS | Protección |
|---|---|---|---|
| BD de Gatekeeper y de política de ejecución | /var/db/SystemPolicyConfiguration/ExecPolicy | Documentada desde 10.14; tabla provenance_tracking desde 13 | root |
| BD de tickets de notarización | /var/db/SystemPolicyConfiguration/Tickets | Documentada desde 10.14 | root |
| BD de política de Gatekeeper | /var/db/SystemPolicy (tabla authority); /var/db/SystemPolicyConfiguration/SystemPolicy en versiones recientes | Desde hace tiempo; la ubicación varía según la versión | root |
| Último rechazo de Gatekeeper | /private/var/db/SystemPolicyConfiguration/.LastGKReject; versiones anteriores: /private/var/db/.LastGKReject | Ruta actual en el código Security de Apple desde macOS 15; ruta heredada antes | root |
| Datos de Gatekeeper | /private/var/db/gkopaque.bundle; gke.bundle en /private/var/db o en /var/db/SystemPolicyConfiguration según la versión | Versiones actuales | root |
| Datos de XProtect (heredado) | /Library/Apple/System/Library/CoreServices/XProtect.bundle | 10.15-14; alternativa en 15+ | SIP |
| Datos de XProtect (principal) | /var/protected/xprotect/XProtect.bundle | 15 Sequoia+ | SIP |
| XProtect Remediator | /Library/Apple/System/Library/CoreServices/XProtect.app | 12.3+ | SIP |
| BD del Behavior Service | /var/protected/xprotect/XPdb | 13 Ventura+ | root |
| BD del Behavior Service (trasladada) | /var/protected/xprotect/db/XPdb | XProtectPayloads 156+ | Data Vault desde 26.2 |
| Logs | Unified log (/private/var/db/diagnostics) | Todas | root para leer |
Desde macOS 26.2 la carpeta db es un Data Vault que ni siquiera root puede abrir en el sistema en ejecución; los investigadores indican que se puede leer desde un volumen Data montado (Recovery o un snapshot local). El xattr com.apple.provenance (11 bytes) de los paquetes de aplicación contiene una clave hacia provenance_tracking.
Qué prueba
- Que Gatekeeper evaluó una app y si la aceptó o la rechazó (entradas de log de
syspolicyd,.LastGKReject). - Que un usuario anuló Gatekeeper de forma explícita (entradas de log; Endpoint Security
ES_EVENT_TYPE_NOTIFY_GATEKEEPER_USER_OVERRIDEdesde macOS 15). - Que una app recibió por primera vez permiso para ejecutarse tras la descarga, y su cdhash en ese momento (
provenance_tracking, Ventura+). - Que XProtect Remediator detectó o corrigió una amenaza con nombre (categoría de log
XPEvent.structured; eventos ESES_EVENT_TYPE_NOTIFY_XP_MALWARE_DETECTED/..._REMEDIATEDdesde macOS 13). - Que un proceso activó una regla del Behavior Service, con hashes y team IDs del ejecutable y del proceso responsable (
XPdb). - Qué versiones de XProtect y de Remediator estaban instaladas (
Info.plistdel paquete).
Un veredicto limpio de Gatekeeper o XProtect no prueba que el código sea benigno; las firmas solo cubren familias conocidas.
Campos clave
Tabla events de XPdb (Ventura+): 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+) guarda la procedencia de cada app con su cdhash; entre las tablas más antiguas están legacy_exec_history_v4, scan_targets_v2 y executable_measurements_v2. Los esquemas no están documentados, así que inspecciónalos con .tables y .schema.
Plists de versión: CFBundleShortVersionString en el Contents/Info.plist de cada paquete.
Marcas de tiempo
- Unified log:
log showno respetaTZ; sin--timezone, imprime cada entrada en la zona horaria registrada cuando se escribió. Usa--timezone UTCpara las líneas de tiempo (consulta Unified Logs). dtde XPdb: fecha y hora en texto (por ejemplo2023-06-30 06:34:28); verifica la zona horaria en un sistema de prueba.- Las horas enteras de ExecPolicy son segundos Unix; los módulos de ExecPolicy de APOLLO las convierten con
UNIXEPOCH.
SELECT dt, violated_rule, exec_path, exec_team_id, responsible_path
FROM events ORDER BY dt DESC;
Retención
Las entradas del unified log caducan con el almacén de logs (normalmente de días a unas pocas semanas, según el volumen). XPdb registra cada huella de regla única una vez por proceso y por arranque, y se envía a Apple; no esperes un historial completo. Las filas de ExecPolicy y SystemPolicy persisten hasta que macOS las reconstruye. Los paquetes de XProtect se sustituyen en cada actualización.
Adquisición
# 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 recopila datos del XProtect Behavior Service (desde la ruta antigua
/var/protected/xprotect/XPdb, nodb/XPdb), versiones de XProtect y el estado de Gatekeeper. - UAC
files/system/xprotect.yamlrecopila los archivosInfo.plistde XProtect, XProtect Remediator y MRT. - sysdiagnose incluye un archivo de logs.
Análisis
- log en un sistema en vivo o sobre 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 (archivos de diagnóstico de XProtect y BD del Behavior Service) y pluginQUARANTINE(.LastGKReject). - sqlite3 para XPdb y ExecPolicy, sobre copias.
- Evaluar una muestra en un Mac de análisis:
spctl --assess --type execute -vv <app>,codesign -dv --verbose=4 <app>.
Unified Log Parser abre en el navegador una .logarchive, las carpetas diagnostics y uuidtext o una exportación de log show, aplica reglas de triaje DFIR y exporta a CSV o Timesketch; no se sube nada.
Quarantine Parser lee .LastGKReject junto con la base de datos de cuarentena, de modo que un rechazo puede vincularse con su descarga.
Consejos para la investigación
- Reconstruye la cadena: evento de cuarentena, luego evaluación de Gatekeeper, luego fila de
provenance_trackingy después persistencia en launchd. - Desde macOS 15 ya no existe la omisión con Control-clic; las anulaciones pasan por Ajustes del Sistema, así que una anulación del usuario es un acto deliberado que conviene documentar.
responsible_pathen XPdb suele indicar la app padre (Terminal, un navegador, un instalador), lo que ayuda a atribuir la actividad./var/protected/xprotect/XPdben 26.2+ puede estar desactualizada u obsoleta: revisa la subcarpetadb.- Anota las versiones de XProtect y Remediator en el momento de la adquisición: una detección que aparece tras una actualización indica cuándo llegó la cobertura, no cuándo se produjo la infección.
- Las rutas bajo
AppTranslocationen los logs significan que una app en cuarentena se ejecutó desde un montaje aleatorio de solo lectura. - Correlaciona los paquetes de instalación con el historial de instalaciones y los permisos de privacidad con TCC.db.
Ver también
Artefactos relacionados
Guías detalladas
Glosario
- GatekeeperInglés
- Quarantine Attribute (com.apple.quarantine)Inglés
- Unified LogsInglés
- Sealed System Volume (SSV)Inglés