Skip to content

QuarantineEventsV2 · xattr · AppleDouble · .LastGKReject

¿De dónde viene este archivo?

Suelte la base de datos QuarantineEventsV2 de un Mac, listados de xattr, archivos AppleDouble o .LastGKReject. Obtenga una única cronología de descargas con los flags de cuarentena decodificados, las filas recuperadas del espacio libre y las pistas que merecen una segunda mirada. Se analiza en su navegador con WebAssembly: no se sube nada.

Suelte una colección de Mac, una base QuarantineEventsV2 o una salida de xattr

QuarantineEventsV2 (+ -wal / -journal), listados xattr -l / -r -l -x, archivos AppleDouble ._, .LastGKReject, o toda una carpeta, ZIP o tar.gz de UAC. Varios usuarios a la vez.

El ejemplo es sintético: un portátil ficticio del departamento financiero, FIN-MBP-03, el 14 de septiembre de 2026.

Analizado en su navegador: no se sube nada

Cómo obtener sus datos

Guía completa de recopilación

La procedencia de las descargas se encuentra en la base de datos QuarantineEventsV2 de cada usuario y en los atributos extendidos de los propios archivos. Recopile ambos: la base de datos demuestra la descarga y los atributos la vinculan con los archivos del disco.

  1. Copie con Terminal, o recopile con UAC, Aftermath o Velociraptor
  2. Suelte aquí la carpeta, el ZIP o el tar.gz
  3. Análisis local: nada sale del navegador

En el Mac, conceda a Terminal Acceso total al disco (Ajustes del Sistema › Privacidad y seguridad) y pegue este bloque. Copia su base de datos con sus archivos -wal/-journal, lista los atributos de cuarentena y WhereFroms de Downloads, Desktop, Documents y LaunchAgents como volcados hexadecimales exactos, y copia .LastGKReject si existe.

Terminal · zsh / bash
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
for f in /private/var/db/.LastGKReject /private/var/db/SystemPolicyConfiguration/.LastGKReject; do
  [ -f "$f" ] && cp -p "$f" ~/qcase/"$(basename "$(dirname "$f")")_LastGKReject"
done

Todo queda en ~/qcase. Suelte esa carpeta en la página.

Todas las cuentas del Mac (contraseña de administrador, Terminal con Acceso total al disco): bases de datos en qcase/Users/<name>, un solo listado para todas las carpetas de inicio más los LaunchAgents y LaunchDaemons del sistema.

Terminal · admin
for u in /Users/*; do
  f="$u/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2"
  sudo test -f "$f" || continue
  d=~/qcase/Users/"$(basename "$u")"
  mkdir -p "$d" && sudo sh -c 'cp -p "$1"* "$2/"' _ "$f" "$d"
done
sudo sh -c 'xattr -r -l -x /Users/*/Downloads /Users/*/Desktop /Users/*/Documents /Users/*/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons 2>/dev/null' > ~/qcase/xattr_all_users.txt
sudo chown -R "$(id -un)" ~/qcase

Trampas habituales

  • Sin Acceso total al disco, las copias desde Terminal pueden fallar con «Operation not permitted» (Desktop, Documents, Downloads y partes de ~/Library están protegidos por TCC).
  • Nunca abra la base de datos original con sqlite3 ni con una interfaz gráfica: puede hacer un checkpoint del WAL o reescribir páginas y destruir registros borrados. Calcule el hash, copie y analice la copia.
  • zip y cp a soportes que no son de Mac descartan los atributos extendidos; conserve el listado de xattr o use ditto si necesita los propios atributos.
  • Las horas están en UTC: la base de datos usa la hora absoluta de Mac y el atributo segundos Unix en hexadecimal; ambas se convierten por usted.

¿Qué es QuarantineEventsV2?

Cuando una aplicación que participa en la cuarentena de archivos (Safari, Chrome, Mail, Mensajes, AirDrop, aplicaciones en sandbox) escribe un archivo descargado, macOS le añade el atributo extendido com.apple.quarantine y Launch Services agrega una fila a la base de datos SQLite QuarantineEventsV2 del usuario: hora, aplicación que descargó, URL de datos, página de origen y remitente en el caso del correo.

El atributo viaja con el archivo; la fila de la base de datos suele permanecer después de borrar el archivo. El UUID al final del atributo une ambos. Juntos responden a la primera pregunta de muchas investigaciones en Mac: ¿de dónde vino este archivo, cuándo y se llegó a abrir?

Qué lee esta herramienta

  • ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 (tabla LSQuarantineEvent), con sus archivos -wal (frames confirmados aplicados, checksums verificados) y -journal; las copias lsquarantine_<user> de Aftermath; varios usuarios a la vez.
  • Valores de com.apple.quarantine de la salida de xattr -p, xattr -l, xattr -r -l y xattr -r -l -x, pegados o como archivos de texto; valores de kMDItemWhereFroms en esos mismos listados.
  • Archivos AppleDouble ._ (volúmenes exFAT, FAT y SMB, y carpetas __MACOSX de los ZIP del Finder), que guardan una copia de los atributos.
  • .LastGKReject (último rechazo de Gatekeeper: hora, ruta del elemento según su marcador, XProtectMalwareType) y resultados de Velociraptor MacOS.System.QuarantineEvents.
  • Carpetas, ZIP y colecciones tar.gz como archivos de UAC, salida de Aftermath y ZIP de colecciones de Velociraptor.

Qué responde

  • Qué aplicaciones descargaron qué, desde qué URL y página, y cuándo: en una sola cronología, por agente y por dominio.
  • Qué archivos del disco corresponden a qué descarga (unión por UUID), incluido cada archivo extraído de un archivo comprimido en cuarentena.
  • Qué elementos aprobó el usuario a través de Gatekeeper (flag 0x0040) y qué elemento rechazó Gatekeeper por última vez.
  • Si se borraron filas: los registros que siguen en el espacio libre, en páginas de la freelist, en frames antiguos del WAL o en el journal de rollback se recuperan y se marcan.
  • Pistas que conviene revisar: archivos comprimidos, imágenes de disco, instaladores y scripts de dominios poco vistos, servicios de intercambio de archivos y de paste, archivos descargados en carpetas LaunchAgents, WhereFroms sin cuarentena.

Límites

  • La base de datos no guarda el nombre local del archivo; solo el UUID del xattr vincula un archivo con su fila. Las descargas hechas con curl, wget, scp o git no dejan ningún rastro de cuarentena.
  • Apple no documenta los bits de los flags. Los nombres proceden de declaraciones de código abierto (WebKit, código Security y copyfile de Apple); los bits desconocidos se muestran como desconocidos.
  • Las filas sin URL y los UUID de atributo sin fila son habituales en versiones recientes de macOS y no son sospechosos por sí mismos.
  • La recuperación de filas borradas depende de la configuración de SQLite y de las escrituras posteriores: no encontrar ninguna no demuestra nada. Las filas recuperadas pueden estar incompletas.
  • Los hallazgos son pistas para un analista, no veredictos. Las marcas de tiempo se muestran en UTC o en la zona horaria de su navegador.

Cómo recopilar

  • Lo más rápido: el bloque de Terminal de arriba (Acceso total al disco) copia la base de datos con sus archivos -wal/-journal, lista los atributos de cuarentena con xattr -r -l -x y copia .LastGKReject.
  • UAC: artefacto files/system/quarantine_events.yaml, incluido en los perfiles ir_triage y full. Aftermath: copias en bruto en Artifacts/raw/lsquarantine_<user>. Velociraptor: MacOS.System.QuarantineEvents, o Generic.Collectors.File para los archivos en bruto.
  • Calcule primero el hash de los archivos y trabaje sobre copias; nunca abra la base de datos original con sqlite3, que puede modificarla.

Preguntas frecuentes

¿Se suben mis archivos?

No. El parser está escrito en Rust compilado a WebAssembly y se ejecuta en un Web Worker de su navegador. Las bases de datos, los listados y los archivos comprimidos nunca salen de su equipo; al cerrar la pestaña se olvidan.

¿Dónde está la base de datos QuarantineEventsV2?

En ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 de cada usuario. Cópiela junto con los archivos -wal y -journal que haya a su lado, desde un Terminal con Acceso total al disco, o recopílela con UAC, Aftermath o Velociraptor.

¿Cómo vinculo un archivo con su registro de descarga?

Lea su atributo com.apple.quarantine (xattr -p com.apple.quarantine archivo). El último campo es un UUID; la fila LSQuarantineEventIdentifier correspondiente contiene la URL, la página de origen y el agente. Suelte aquí la base de datos y un listado de xattr y la unión se hace por usted.

¿Qué significa el flag de cuarentena 0083 o 00c3?

El primer campo es un campo de bits hexadecimal que Apple no documenta. 0x0001 suele interpretarse como descarga, 0x0002 como escrito por una aplicación en sandbox, 0x0080 como translocación y 0x0040 como aprobado por el usuario a través de Gatekeeper, así que 00c3 es 0083 más la aprobación. Confírmelo en un sistema con la misma versión de macOS antes de basarse en ello.

¿Se pueden recuperar eventos de cuarentena borrados?

A veces. Cuando se borra una fila, SQLite suele dejar sus bytes en el espacio libre hasta que se reutilizan. La herramienta extrae esos registros mediante carving, junto con copias más antiguas en el WAL o en el journal de rollback, y los marca como recuperados. No encontrar ninguno no demuestra nada.