Skip to content

Collecter QuarantineEventsV2 : UAC, Aftermath, Velociraptor

Collecter QuarantineEventsV2 (macOS), ses fichiers -wal et -journal, les xattr de quarantaine et .LastGKReject, à la main, avec UAC, Aftermath ou Velociraptor.

Publié le 6 min de lecture

TL;DR. Sur un Mac allumé, la collecte la plus rapide tient en trois commandes lancées depuis un Terminal disposant de l’accès complet au disque : copier ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2* (le * embarque les fichiers -wal et -journal), extraire les attributs de quarantaine avec xattr -r -l -x, et récupérer .LastGKReject s’il existe. UAC, Aftermath et Velociraptor collectent tous la base ; aucun ne collecte les valeurs des attributs de quarantaine, ajoutez donc vous-même le listing xattr. Calculez les empreintes d’abord, travaillez sur des copies.

Ce qu’il faut collecter

Une collecte complète pour la quarantaine comporte trois parties :

  1. La base de chaque utilisateur : QuarantineEventsV2 et ses compagnons -wal et -journal. Ceux-ci peuvent contenir des modifications validées récentes et d’anciennes copies de pages, là où survivent les enregistrements supprimés (voir récupérer les enregistrements supprimés).
  2. Les valeurs d’attributs des fichiers situés dans les dossiers qui vous intéressent : com.apple.quarantine et kMDItemWhereFroms. Elles portent l’UUID qui relie un fichier à sa ligne dans la base.
  3. .LastGKReject, la trace que garde Gatekeeper du dernier élément qu’il a refusé. Il peut ne pas exister, ou exister et être vide.

Le plus simple : copier à la main sur un Mac allumé

Ouvrez Terminal, vérifiez qu’il dispose de l’accès complet au disque et lancez les commandes ci-dessous. Ajoutez sudo pour lire les dossiers des autres utilisateurs.

Utilisateur courant

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 conserve les horodatages et les droits ; le * final copie la base avec tout fichier -wal ou -journal. Le listing xattr -r -l -x enregistre chaque attribut étendu sous forme de dump hexadécimal, qui conserve les octets exacts. ~/Library/LaunchAgents figure volontairement dans la liste : un fichier téléchargé qui se trouve dans un dossier de démarrage automatique fait partie des pistes à vérifier.

Tous les utilisateurs

En root, pour copier la base de chaque utilisateur dans son propre dossier :

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

Répétez le listing xattr pour chaque utilisateur dont les dossiers comptent.

Le dernier refus de Gatekeeper

Le fichier .LastGKReject a connu deux chemins dans les sources d’Apple ; essayez les deux :

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

Seul le dernier refus est conservé, et le fichier peut être absent. Il peut aussi exister sans contenir aucun refus : sur un système macOS 26.6 réel, /private/var/db/.LastGKReject était absent et /private/var/db/SystemPolicyConfiguration/.LastGKReject était une petite property list XML contenant un dictionnaire vide. Quarantine Parser signale ce cas comme « aucun refus enregistré ». Son contenu est détaillé dans .LastGKReject comme preuve Gatekeeper.

UAC

UAC (Unix-like Artifacts Collector, github.com/tclahr/uac) dispose d’un artefact files/system/quarantine_events.yaml qui collecte %user_home%/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2. Les profils ir_triage et full l’incluent, puisqu’ils incluent files/system/*.

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

La première commande lance tout le profil de triage, la seconde uniquement cet artefact. La sortie est par défaut uac-<hostname>-macos-<timestamp>.tar.gz (-f zip pour un ZIP). UAC ne collecte pas les valeurs xattr : lancez aussi la commande xattr -r -l -x ci-dessus.

Aftermath

Aftermath (Jamf, github.com/jamf/aftermath) se lance avec :

sudo ./aftermath

La sortie va par défaut dans /tmp ; -o permet de choisir un autre emplacement. Aftermath copie la base de chaque utilisateur vers Artifacts/raw/lsquarantine_<username>, sans le -wal. Ses métadonnées de fichiers listent les noms des xattr et kMDItemWhereFroms, pas les valeurs de quarantaine. Là encore, ajoutez un listing xattr si les valeurs d’attributs comptent.

Velociraptor

Deux approches, selon le besoin :

  • Analyse sur le poste. L’artefact MacOS.System.QuarantineEvents interroge la base sur le poste et renvoie les colonnes DownloadTime, DownloadURL, Origin, AgentName, AgentBundle, User et EventUUID. Son glob par défaut est /Users/*/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2. C’est rapide, mais vous n’obtenez que ce que renvoie la requête : ni espace libre, ni compagnons.
  • Fichiers bruts. Utilisez Generic.Collectors.File avec Root / et un Glob comme Users/*/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2*. Le * final embarque les compagnons, et vous conservez l’espace libre dont la récupération a besoin.

Si vous traitez des ZIP créés par le Finder, MacOS.Forensics.AppleDoubleZip lit les entrées AppleDouble __MACOSX qu’ils contiennent.

mac_apt et Plaso

Le plugin QUARANTINE de mac_apt analyse à la fois la base et .LastGKReject. Sur une image montée :

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

Sur un fichier isolé :

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

Plaso dispose aussi d’un plugin SQLite ls_quarantine, utile quand la base doit rejoindre une super-timeline plus large.

Pièges

Accès complet au disque et TCC

Les protections de confidentialité de macOS (TCC) peuvent empêcher Terminal de lire les dossiers utilisateur. Accordez l’accès complet au disque au Terminal utilisé avant de collecter ; sinon les erreurs passent facilement inaperçues, surtout quand 2>/dev/null les masque. Vérifiez que les fichiers copiés ne sont pas vides.

Compagnons WAL et journal

Une base copiée sans son -wal peut manquer des modifications validées qui n’ont pas encore été reportées dans le fichier principal par un checkpoint, et vous perdez aussi les anciennes copies de pages. Sur le système macOS 26.6 observé, la base utilisait le mode journal de rollback : le compagnon le plus probable est donc un fichier -journal. Collectez ce qui est présent.

AppleDouble sur exFAT

Si des fichiers ont été copiés sur des volumes exFAT, FAT ou SMB, macOS stocke leurs attributs étendus dans des fichiers AppleDouble ._nom. Collectez aussi ces fichiers ._ : ils peuvent contenir la valeur de quarantaine et le WhereFroms d’un fichier qui a quitté le Mac.

Les empreintes d’abord

Calculez les empreintes des fichiers collectés avant toute analyse et travaillez sur des copies. Ouvrir une base avec sqlite3 peut la modifier (voir récupérer les enregistrements supprimés).

Attributs étendus perdus en route

Les attributs étendus ne survivent pas à tous les transferts. Une copie vers un support sans prise en charge des xattr, ou avec un outil qui les ignore, perd les valeurs. Le listing texte xattr -r -l -x est le transport le plus sûr : c’est un simple fichier, qui survit à n’importe quel transfert.

Charger la collecte

Quarantine Parser accepte tels quels le .tar.gz d’UAC, l’archive ou le dossier d’Aftermath et les ZIP de collecte Velociraptor, ainsi que les résultats analysés de MacOS.System.QuarantineEvents au format JSON lines et votre propre dossier ~/qcase. Tout s’exécute dans le navigateur. La page d’accueil propose aussi un guide prêt à copier, Comment obtenir vos données. Pour comprendre ce que vous avez collecté, commencez par l’analyse forensique de QuarantineEventsV2 et les flags de com.apple.quarantine ; une fiche de référence rapide se trouve sur macforensics.app.

Questions fréquentes

Le Terminal a-t-il besoin de l’accès complet au disque pour copier QuarantineEventsV2 ?

Lancez la copie depuis un Terminal qui dispose de l’accès complet au disque, et ajoutez sudo pour les dossiers des autres utilisateurs. Sans cet accès, les protections de confidentialité de macOS (TCC) peuvent bloquer la lecture des dossiers utilisateur et vous laisser une collecte incomplète.

UAC collecte-t-il les attributs de quarantaine ?

Non. L’artefact quarantine_events d’UAC copie la base QuarantineEventsV2, mais UAC ne collecte pas les valeurs xattr. Capturez séparément les valeurs com.apple.quarantine avec xattr -r -l -x sur les dossiers qui comptent.

Pourquoi copier aussi les fichiers -wal et -journal ?

Ils peuvent contenir des modifications qui ne sont pas encore dans le fichier principal ainsi que d’anciennes copies de pages, là où survivent les enregistrements supprimés. L’astérisque final de la commande cp les copie avec la base.

Quarantine Parser peut-il lire directement une collecte UAC ou Velociraptor ?

Oui. Déposez tel quel le .tar.gz d’UAC, l’archive ou le dossier d’Aftermath, ou un ZIP de collecte Velociraptor. Tout est traité dans votre navigateur et rien n’est envoyé.

Articles liés