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.
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:
- La base de cada usuario: QuarantineEventsV2 y sus acompañantes
-waly-journal. Estos pueden contener cambios confirmados recientes y copias antiguas de páginas, que es donde sobreviven los registros borrados (vea recuperar registros borrados). - Los valores de atributos de los archivos de las carpetas que le interesan:
com.apple.quarantineykMDItemWhereFroms. Llevan el UUID que une un archivo con su fila en la base. .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.QuarantineEventsconsulta 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.Filecon Root/y un Glob comoUsers/*/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.