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.
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 :
- La base de chaque utilisateur : QuarantineEventsV2 et ses compagnons
-walet-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). - Les valeurs d’attributs des fichiers situés dans les dossiers qui vous intéressent :
com.apple.quarantineetkMDItemWhereFroms. Elles portent l’UUID qui relie un fichier à sa ligne dans la base. .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.QuarantineEventsinterroge 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.Fileavec Root/et un Glob commeUsers/*/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é.