¿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.