Skip to content

Recopilar QuarantineEventsV2: UAC, Aftermath, Velociraptor

Cómo recopilar QuarantineEventsV2 de macOS, sus archivos -wal y -journal, los xattr de cuarentena y .LastGKReject a mano o con UAC, Aftermath y Velociraptor.

Publicado el 6 min de lectura

TL;DR. En un Mac encendido, la recopilación más rápida son tres comandos lanzados desde un Terminal con acceso total al disco: copiar ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2* (el * arrastra los archivos -wal y -journal), volcar los atributos de cuarentena con xattr -r -l -x y tomar .LastGKReject si existe. UAC, Aftermath y Velociraptor recogen la base; ninguno recoge los valores de los atributos de cuarentena, así que añada usted el listado xattr. Calcule primero los hashes y trabaje sobre copias.

Qué recopilar

Una recopilación completa de la cuarentena tiene tres partes:

  1. La base de cada usuario: QuarantineEventsV2 y sus acompañantes -wal y -journal. Estos pueden contener cambios confirmados recientes y copias antiguas de páginas, que es donde sobreviven los registros borrados (vea recuperar registros borrados).
  2. Los valores de atributos de los archivos de las carpetas que le interesan: com.apple.quarantine y kMDItemWhereFroms. Llevan el UUID que une un archivo con su fila en la base.
  3. .LastGKReject, el registro que guarda Gatekeeper del último elemento que rechazó. Puede no existir, o existir y estar vacío.

Lo más sencillo: copiar a mano en un Mac encendido

Abra Terminal, compruebe que tiene acceso total al disco y ejecute los comandos siguientes. Añada sudo cuando necesite leer carpetas de otros usuarios.

Usuario actual

mkdir -p ~/qcase
cp -p ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2* ~/qcase/
xattr -r -l -x ~/Downloads ~/Desktop ~/Documents ~/Library/LaunchAgents > ~/qcase/xattr_$(id -un).txt 2>/dev/null

cp -p conserva las marcas de tiempo y los permisos; el * final copia la base junto con cualquier archivo -wal o -journal. El listado xattr -r -l -x registra cada atributo extendido como volcado hexadecimal, que conserva los bytes exactos. ~/Library/LaunchAgents está en la lista a propósito: un archivo descargado dentro de una carpeta de arranque automático es una de las pistas que conviene revisar.

Todos los usuarios

Como root, para copiar la base de cada usuario en su propia carpeta:

for u in /Users/*; do
  f="$u/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2"
  [ -f "$f" ] || continue
  d="$HOME/qcase/$(basename "$u")"
  sudo mkdir -p "$d" && sudo cp -p "$f"* "$d/"
done

Repita el listado xattr para cada usuario cuyas carpetas importen.

El último rechazo de Gatekeeper

El archivo .LastGKReject ha estado en dos rutas distintas en las fuentes de Apple, así que pruebe ambas:

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

Solo se guarda el último rechazo y el archivo puede faltar. También puede existir sin ningún rechazo dentro: en un sistema macOS 26.6 real, /private/var/db/.LastGKReject no existía y /private/var/db/SystemPolicyConfiguration/.LastGKReject era una pequeña property list XML con un diccionario vacío. Quarantine Parser informa de ese caso como «ningún rechazo registrado». Su contenido se explica en .LastGKReject como prueba de Gatekeeper.

UAC

UAC (Unix-like Artifacts Collector, github.com/tclahr/uac) tiene un artefacto files/system/quarantine_events.yaml que recoge %user_home%/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2. Los perfiles ir_triage y full lo incluyen, porque incluyen files/system/*.

sudo ./uac -p ir_triage /tmp
sudo ./uac -a ./artifacts/files/system/quarantine_events.yaml /tmp

El primer comando ejecuta todo el perfil de triaje y el segundo solo este artefacto. La salida es uac-<hostname>-macos-<timestamp>.tar.gz por defecto (-f zip para un ZIP). UAC no recoge valores xattr, así que ejecute también el comando xattr -r -l -x anterior.

Aftermath

Aftermath (Jamf, github.com/jamf/aftermath) se ejecuta con:

sudo ./aftermath

La salida va a /tmp por defecto; -o elige otra ubicación. Aftermath copia la base de cada usuario en Artifacts/raw/lsquarantine_<username>, sin el -wal. Sus metadatos de archivo listan los nombres de los xattr y kMDItemWhereFroms, no los valores de cuarentena. De nuevo, añada un listado xattr si los valores de los atributos importan.

Velociraptor

Dos enfoques, según lo que necesite:

  • Análisis en el equipo. El artefacto MacOS.System.QuarantineEvents consulta la base en el equipo y devuelve las columnas DownloadTime, DownloadURL, Origin, AgentName, AgentBundle, User y EventUUID. Su glob por defecto es /Users/*/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2. Es rápido, pero solo obtiene lo que devuelve la consulta: ni espacio libre ni acompañantes.
  • Archivos en bruto. Use Generic.Collectors.File con Root / y un Glob como Users/*/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2*. El * final arrastra los acompañantes y conserva el espacio libre que necesita la recuperación.

Si trabaja con ZIP creados por el Finder, MacOS.Forensics.AppleDoubleZip lee las entradas AppleDouble __MACOSX que contienen.

mac_apt y Plaso

El plugin QUARANTINE de mac_apt analiza tanto la base como .LastGKReject. Sobre una imagen montada:

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

Sobre un archivo suelto:

python mac_apt_artifact_only.py -i com.apple.LaunchServices.QuarantineEventsV2 -o out QUARANTINE

Plaso también tiene un plugin SQLite ls_quarantine, útil cuando la base entra en una super-timeline más amplia.

Trampas habituales

Acceso total al disco y TCC

Las protecciones de privacidad de macOS (TCC) pueden impedir que Terminal lea las carpetas de usuario. Conceda acceso total al disco al Terminal que use antes de recopilar; si no, los errores pasan fácilmente desapercibidos, sobre todo cuando 2>/dev/null los oculta. Compruebe que los archivos copiados no estén vacíos.

Acompañantes WAL y journal

Una base copiada sin su -wal puede perder cambios confirmados que todavía no se han volcado al archivo principal en un checkpoint, y además pierde las copias antiguas de páginas. En el sistema macOS 26.6 observado, la base usaba el modo de diario de rollback, así que el acompañante más probable es un archivo -journal. Recoja lo que haya.

AppleDouble en exFAT

Si se copiaron archivos a volúmenes exFAT, FAT o SMB, macOS guarda sus atributos extendidos en archivos AppleDouble ._nombre. Recoja también esos archivos ._: pueden contener el valor de cuarentena y el WhereFroms de un archivo que salió del Mac.

Primero los hashes

Calcule los hashes de los archivos recopilados antes de cualquier análisis y trabaje sobre copias. Abrir una base con sqlite3 puede modificarla (vea recuperar registros borrados).

Atributos extendidos perdidos por el camino

Los atributos extendidos no sobreviven a todos los traslados. Copiar a soportes sin xattr, o con herramientas que los descartan, pierde los valores. El listado de texto xattr -r -l -x es el medio más seguro: es un archivo normal y sobrevive a cualquier transporte.

Cargar la recopilación

Quarantine Parser acepta tal cual el .tar.gz de UAC, el archivo comprimido o la carpeta de Aftermath y los ZIP de recopilación de Velociraptor, además de los resultados analizados de MacOS.System.QuarantineEvents en formato JSON lines y su propia carpeta ~/qcase. Todo se ejecuta en el navegador. La página de inicio también incluye una guía lista para copiar, Cómo obtener sus datos. Para entender lo que ha recopilado, empiece por el análisis forense de QuarantineEventsV2 y los flags de com.apple.quarantine; tiene una referencia rápida en macforensics.app.

Preguntas frecuentes

¿Necesita el Terminal acceso total al disco para copiar QuarantineEventsV2?

Haga la copia desde un Terminal con acceso total al disco y añada sudo para las carpetas de otros usuarios. Sin ese acceso, las protecciones de privacidad de macOS (TCC) pueden bloquear la lectura de las carpetas de usuario y dejarle una recopilación incompleta.

¿Recoge UAC los atributos de cuarentena?

No. El artefacto quarantine_events de UAC copia la base QuarantineEventsV2, pero UAC no recoge valores xattr. Capture por separado los valores com.apple.quarantine con xattr -r -l -x en las carpetas que importan.

¿Por qué copiar también los archivos -wal y -journal?

Pueden contener cambios que aún no están en el archivo principal y copias antiguas de páginas, que es donde sobreviven los registros borrados. El asterisco final del comando cp los copia junto con la base.

¿Puede Quarantine Parser leer directamente una recopilación de UAC o Velociraptor?

Sí. Arrastre tal cual el .tar.gz de UAC, el archivo comprimido o la carpeta de Aftermath, o un ZIP de recopilación de Velociraptor. Todo se procesa en su navegador y no se sube nada.

Artículos relacionados