Saltar al contenido

EjecuciónRegistros

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

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

ArtefactoRutamacOSProtección
BD de Gatekeeper y de política de ejecución/var/db/SystemPolicyConfiguration/ExecPolicyDocumentada desde 10.14; tabla provenance_tracking desde 13root
BD de tickets de notarización/var/db/SystemPolicyConfiguration/TicketsDocumentada desde 10.14root
BD de política de Gatekeeper/var/db/SystemPolicy (tabla authority); /var/db/SystemPolicyConfiguration/SystemPolicy en versiones recientesDesde hace tiempo; la ubicación varía según la versiónroot
Último rechazo de Gatekeeper/private/var/db/SystemPolicyConfiguration/.LastGKReject; versiones anteriores: /private/var/db/.LastGKRejectRuta actual en el código Security de Apple desde macOS 15; ruta heredada antesroot
Datos de Gatekeeper/private/var/db/gkopaque.bundle; gke.bundle en /private/var/db o en /var/db/SystemPolicyConfiguration según la versiónVersiones actualesroot
Datos de XProtect (heredado)/Library/Apple/System/Library/CoreServices/XProtect.bundle10.15-14; alternativa en 15+SIP
Datos de XProtect (principal)/var/protected/xprotect/XProtect.bundle15 Sequoia+SIP
XProtect Remediator/Library/Apple/System/Library/CoreServices/XProtect.app12.3+SIP
BD del Behavior Service/var/protected/xprotect/XPdb13 Ventura+root
BD del Behavior Service (trasladada)/var/protected/xprotect/db/XPdbXProtectPayloads 156+Data Vault desde 26.2
LogsUnified log (/private/var/db/diagnostics)Todasroot 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_OVERRIDE desde 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 ES ES_EVENT_TYPE_NOTIFY_XP_MALWARE_DETECTED / ..._REMEDIATED desde 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.plist del 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 show no respeta TZ; sin --timezone, imprime cada entrada en la zona horaria registrada cuando se escribió. Usa --timezone UTC para las líneas de tiempo (consulta Unified Logs).
  • dt de XPdb: fecha y hora en texto (por ejemplo 2023-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, no db/XPdb), versiones de XProtect y el estado de Gatekeeper.
  • UAC files/system/xprotect.yaml recopila los archivos Info.plist de 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 XPROTECT de mac_apt (archivos de diagnóstico de XProtect y BD del Behavior Service) y plugin QUARANTINE (.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_tracking y 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_path en XPdb suele indicar la app padre (Terminal, un navegador, un instalador), lo que ayuda a atribuir la actividad.
  • /var/protected/xprotect/XPdb en 26.2+ puede estar desactualizada u obsoleta: revisa la subcarpeta db.
  • 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 AppTranslocation en 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