Skip to content

Flags de com.apple.quarantine: leer el xattr de cuarentena

Cómo decodificar un valor com.apple.quarantine: bits como 0083 y 00c3, marca de tiempo hexadecimal, agente y UUID, con fuente y confianza para cada flag.

Publicado el 7 min de lectura

TL;DR. Un valor com.apple.quarantine tiene cuatro campos, flags;time;agent;uuid, por ejemplo 0083;66f7c2a1;Safari;6E4C2B1A-.... Los flags son un campo de bits hexadecimal que Apple no documenta; el código abierto de WebKit y de Apple Security nombra los bits importantes, y 0x0040 significa que el usuario aprobó el elemento a través de Gatekeeper. El time son segundos Unix en hexadecimal (UTC), el agent es la aplicación que descargó y el UUID une el archivo con su fila en QuarantineEventsV2.

El formato del valor

El atributo de cuarentena es un atributo extendido llamado com.apple.quarantine. Su valor es una cadena de texto corta con cuatro campos separados por punto y coma:

0083;66f7c2a1;Safari;6E4C2B1A-...
CampoEjemploSignificado
flags0083Campo de bits hexadecimal, ver la tabla de flags
time66f7c2a1Segundos Unix en hexadecimal, UTC
agentSafariNombre de la aplicación que escribió el archivo
uuid6E4C2B1A-...Se une con LSQuarantineEventIdentifier; puede estar vacío

Los bits de flags, con fuentes y nivel de confianza

Apple no documenta públicamente estos flags. La tabla indica de dónde procede cada nombre y cada valor, para que pueda ponderar sus conclusiones. Más detalles en la entrada del glosario flags de cuarentena.

BitNombreFuenteConfianza
0x0001QTN_FLAG_DOWNLOADWebKit QuarantineSPI.h (código abierto)Alta
0x0002QTN_FLAG_SANDBOXWebKit QuarantineSPI.hAlta
0x0004QTN_FLAG_HARDWebKit QuarantineSPI.h; policyengine.cpp de Apple Security trata esos archivos como en cuarentena estrictaAlta
0x0040QTN_FLAG_USER_APPROVED (QTN_FLAG_ASSESSMENT_OK en Apple Security)WebKit QuarantineSPI.h; policyengine.cpp lo activa cuando el usuario anula el bloqueo o aprueba mediante GatekeeperAlta
0x0080QTN_FLAG_TRANSLOCATENombre presente en las fuentes libsecurity_translocate y copyfile de Apple; valor tomado de redeclaraciones de tercerosMedia
0x0100QTN_FLAG_DO_NOT_TRANSLOCATEIgual que el anteriorMedia
Cualquier otro bit, p. ej. 0x0020DesconocidoNingunaSe indica como desconocido

Algunas notas sobre el significado. El código Security de Apple considera que los archivos en cuarentena estricta, creados por fuentes en sandbox sin privilegio de descarga, quedan rechazados para su ejecución. La App Translocation es lo que ocurre cuando una aplicación en cuarentena se abre desde una ubicación inesperada: se ejecuta desde un montaje aleatorio de solo lectura, con rutas bajo /private/var/folders/.../AppTranslocation/. Y el valor 0x0040 para «assessment OK / aprobado por el usuario» coincide en todas las fuentes, por eso el flag de aprobación del usuario es el bit más útil en una investigación.

Valores comunes y cómo leerlos

ValorBitsLectura
00810x0080 + 0x0001Descarga, bit de translocación
00830x0080 + 0x0002 + 0x0001Descarga, sandbox, bit de translocación
00820x0080 + 0x0002Archivo escrito por una aplicación en sandbox, sin bit de descarga
00c30x0080 + 0x0040 + 0x0002 + 0x0001Como 0083, más aprobado por el usuario
00c10x0080 + 0x0040 + 0x0001Como 0081, más aprobado por el usuario
01830x0100 + 0x0080 + 0x0002 + 0x0001Como 0083, más el bit de no translocar
00860x0080 + 0x0004 + 0x0002Cuarentena estricta, sandbox, bit de translocación

El patrón más revelador es un cambio en el mismo archivo: 0083 que pasa a 00c3 significa que el usuario lo aprobó a través de Gatekeeper. Si solo tiene una instantánea, 00c3 o 00c1 siguen mostrando que hubo una aprobación en algún momento.

Los demás campos: hora, agente, UUID

Hora

El segundo campo son segundos Unix, en hexadecimal, en UTC. Para convertirlo en macOS:

date -u -r $((16#66f7c2a1))

que muestra Sat Sep 28 08:47:29 UTC 2024.

El agente y el escape \x20

El agente es un nombre de aplicación, no un identificador de bundle. Los espacios se escapan como \x20 en el atributo, así que Microsoft Word aparece como Microsoft\x20Word. Deshaga el escape antes de agrupar por agente.

Hora cero, agente vacío, UUID vacío

Existen valores como 0081;00000000;;: sin hora, sin agente, sin UUID. Se observaron en un sistema macOS 26.6 real y no son sospechosos por sí mismos; simplemente no hay nada que unir.

UUID en minúsculas

En ese mismo sistema, algunos UUID estaban en minúsculas. Compare siempre los UUID sin distinguir mayúsculas y minúsculas. Un UUID de atributo sin fila en la base también es habitual (las descargas de Safari de ese sistema no tenían ninguna en los últimos meses), así que trátelo como una pista, no como un hallazgo.

Cómo se propaga el atributo

  • La Utilidad de Archivo aplica el valor de cuarentena del archivo comprimido, UUID incluido, a cada archivo que extrae. Por tanto, una sola fila de la base puede corresponder a muchos archivos. Los descompresores de terceros pueden no propagarlo.
  • Imágenes de disco: montar una imagen de disco en cuarentena pone su contenido en cuarentena.
  • Las copias dentro de APFS o HFS+ conservan los atributos extendidos. En sistemas de archivos sin xattr (exFAT, FAT, recursos compartidos SMB), macOS escribe archivos AppleDouble ._nombre que los contienen.
  • Los ZIP creados con «Comprimir» del Finder incluyen entradas __MACOSX/._nombre con los atributos.

Cómo se elimina

xattr -d com.apple.quarantine file
xattr -c file

El primer comando elimina el atributo de cuarentena y el segundo todos los atributos extendidos. Ninguno toca la base QuarantineEventsV2. Un xattr -d selectivo deja los demás atributos en su sitio, incluido kMDItemWhereFroms, que pone el navegador; por eso, un archivo con WhereFroms pero sin atributo de cuarentena sugiere que alguien lo quitó. Vea kMDItemWhereFroms frente a la cuarentena.

Leer el atributo

xattr -p com.apple.quarantine file
xattr -l file
xattr -r -l -x ~/Downloads

xattr -p muestra el valor de un atributo, xattr -l lista todos los atributos con sus valores y xattr -r -l -x recorre una carpeta y genera volcados hexadecimales que conservan los bytes exactos (la forma recomendada como prueba). ls -l@ solo muestra los nombres y tamaños de los atributos, no sus valores. Para las URL de WhereFroms a través de Spotlight, use mdls -name kMDItemWhereFroms file.

Quarantine Parser acepta todos estos listados pegados en un cuadro de texto, incluida la salida de find … -exec xattr -p …, además de archivos AppleDouble, y une cada valor con su evento en la base.

Qué prueba «aprobado» y qué no

El bit 0x0040 muestra que el elemento pasó por una aprobación de Gatekeeper. Como el atributo viaja con las copias, esa aprobación no tuvo por qué ocurrir en el Mac que está examinando. El bit no dice cuándo ocurrió, quién hizo clic (una sesión robada da el mismo resultado) ni si el programa llegó a ejecutarse correctamente.

La ausencia de 0x0040 prueba todavía menos. Solo los ejecutables, instaladores y aplicaciones pasan por la aprobación; un documento puede abrirse muchas veces sin llegar a tener ese bit. Para la parte de los rechazos, vea .LastGKReject como prueba de Gatekeeper, y para la parte de la base de datos, análisis forense de QuarantineEventsV2. Hay una chuleta en macforensics.app.

Preguntas frecuentes

¿Qué significa 0083 en com.apple.quarantine?

Leído bit a bit, 0083 es 0x0080 + 0x0002 + 0x0001: el bit de translocación (valor conocido por redeclaraciones de terceros, confianza media), el bit de sandbox y el bit de descarga. Es uno de los valores más comunes en archivos descargados.

¿Qué significa 00c3?

00c3 es 0083 más 0x0040, el bit de aprobación del usuario. Un archivo cuyo valor pasó de 0083 a 00c3 fue aprobado por el usuario a través de Gatekeeper. Apple no documenta públicamente los flags; esta lectura procede del código abierto de WebKit y de Apple Security.

¿Eliminar com.apple.quarantine borra el registro de la descarga?

No. xattr -d com.apple.quarantine o xattr -c solo quitan el atributo del archivo; la fila de QuarantineEventsV2 se mantiene. Un archivo que conserva kMDItemWhereFroms pero no tiene atributo de cuarentena merece una revisión más detallada.

¿Cómo convierto la hora hexadecimal de un valor de cuarentena?

El segundo campo son segundos Unix en hexadecimal, en UTC. En macOS, date -u -r $((16#66f7c2a1)) muestra Sat Sep 28 08:47:29 UTC 2024 para el valor 66f7c2a1.

Artículos relacionados