Accès aux fichiersAnti-forensique
FSEvents (.fseventsd) : journal des changements macOS
Journaux gzip par volume écrits par fseventsd : chemins créés, modifiés, renommés et supprimés, souvent la seule trace d'un fichier effacé.
- Emplacement
- /System/Volumes/Data/.fseventsd/
- Prouve
- Quels chemins ont été créés, modifiés, renommés ou supprimés sur un volume, dans l'ordre des événements
- Horodatages
- Aucun par enregistrement ; estimation à partir du mtime des fichiers journaux et des chemins datés
- Accès
- root ; accès complet au disque sur un système live
- Rétention
- Glissante, purgée par fseventsd (plusieurs mois observés, variable)
- Collecte
- UAC, mac_apt, Disk image, ditto
Outils
Comparer tous les outilsCe que c'est
Le démon fseventsd tient un journal persistant des changements du système de fichiers afin que les applications (Time Machine, Spotlight, clients de synchronisation) puissent demander « qu'est-ce qui a changé sous ce dossier depuis l'événement X ». Chaque volume inscriptible qu'il suit reçoit un dossier caché .fseventsd contenant des fichiers journaux compressés en gzip. Chaque enregistrement comprend un chemin, un identifiant d'événement sur 64 bits et un masque de drapeaux ; les formats récents ajoutent un identifiant de nœud.
Pour l'enquêteur, c'est un historique du volume au niveau des chemins : fichiers créés puis supprimés dans /private/tmp, archive brièvement présente dans ~/Downloads, plist de LaunchAgent écrit puis retiré, ou contenu d'une clé USB. Le guide FSEvents détaille le format ; cette page sert de référence rapide.
Où il se trouve
| macOS | Chemin | Remarques |
|---|---|---|
| 10.15 Catalina et ultérieur | /System/Volumes/Data/.fseventsd/ | Le volume Data contient l'activité utilisateur ; les chemins sont relatifs à la racine du volume Data |
| 10.14 et antérieur | /.fseventsd/ | Volume de démarrage unique |
| Tous, volume externe ou amovible | /Volumes/<name>/.fseventsd/ | Voyage avec le disque |
Dans le dossier :
- Des fichiers journaux aux noms hexadécimaux de 16 chiffres dérivés des identifiants d'événements, qui se trient donc dans l'ordre des événements.
fseventsd-uuid: identifie le flux d'événements du volume. Un nouvel UUID signifie que l'historique a été réinitialisé.no_log(facultatif) : un fichier vide qui indique àfseventsdde ne pas journaliser le volume.
Protection : le dossier appartient à root. Sur un système live, le processus de collecte a aussi besoin de l'accès complet au disque. mac_apt vérifie en outre /private/var/db/fseventsd comme emplacement alternatif.
Ce qu'il prouve
- Qu'un fichier ou dossier portant un nom donné a existé à un chemin de ce volume, même après sa suppression.
- Le type de changement : création, modification, renommage ou déplacement, suppression, changement de permissions ou de propriétaire, ajout ou retrait d'un attribut étendu (par exemple le retrait de
com.apple.quarantine). - L'ordre relatif des changements sur un volume (les identifiants d'événements croissent de façon monotone).
- Qu'un volume amovible a été modifié sur un Mac, et quels chemins y ont été touchés.
Il ne prouve pas :
- Une heure exacte. Les enregistrements ne portent aucun horodatage.
- Quel utilisateur ou quel processus a effectué le changement.
- Le contenu des fichiers. Associez-le aux snapshots APFS, à Time Machine ou au carving.
- L'activité sur des montages en lecture seule ou des partages réseau, qui ne sont pas journalisés.
Champs clés
| Champ | Signification |
|---|---|
Magic de page 1SLD | Page version 1 : chemin, identifiant d'événement (8 octets), drapeaux (4 octets) |
Magic de page 2SLD | Page version 2 (à partir de macOS 10.13 High Sierra) : ajoute l'identifiant de nœud (8 octets) |
Magic de page 3SLD | Page version 3 (à partir de macOS 14 Sonoma) : ajoute un champ supplémentaire de 4 octets, décodé comme identifiant d'utilisateur (fs_uid) par FSEventsParser et laissé inconnu par mac_apt |
| Chemin | Chemin terminé par un octet nul, relatif à la racine du volume, tel qu'il était au moment de la journalisation |
| Identifiant d'événement | Compteur 64 bits par volume ; sert uniquement à l'ordonnancement |
| Drapeaux | Masque de bits du type de changement et du type d'objet |
| Identifiant de nœud | Identifiant de l'objet du système de fichiers (sur APFS, le numéro d'inode) ; relie un fichier à travers ses renommages |
Noms de drapeaux courants renvoyés par les parseurs : Created, Removed, Renamed (mac_apt : RenamedOrMoved), Modified, InodeMetaMod, PermissionChange, ExtendedAttrModified / ExtendedAttrRemoved (mac_apt : XAttrModified / XAttrRemoved), FinderInfoMod, FolderCreated, Exchange, ItemCloned, LastHardLinkRemoved, Mount, Unmount, EndOfTransaction, ainsi que des types d'objets comme FileEvent, FolderEvent, SymbolicLink, HardLink. Les valeurs binaires sur disque diffèrent des constantes publiques FSEventStreamEventFlags de l'API Apple : fiez-vous à un parseur qui décode la structure sur disque.
Horodatages
Les enregistrements n'en contiennent aucun. Estimez l'heure à partir de :
- La date de modification du fichier journal. Un fichier est écrit lorsque
fseventsdvide son tampon : son mtime est donc une borne supérieure pour ses enregistrements, et le mtime du fichier précédent une borne inférieure approximative. - Les chemins datés. Des chemins contenant une date dans leur nom (journaux ayant subi une rotation, noms de snapshots, rapports de diagnostic) qui apparaissent comme
Createdservent d'ancres pour les identifiants d'événements voisins. FSEventsParser s'en sert pour remplir sa colonneapprox_dates_plus_minus_one_day. - La corrélation. Un horodatage réel issu d'un autre artefact pour un chemin (date de naissance APFS, événement de quarantaine, entrée des Unified Logs) date ses voisins.
Présentez toujours les heures FSEvents sous forme d'intervalle et nommez l'ancre utilisée.
Rétention
Pas de durée fixe. fseventsd purge lui-même les anciens fichiers journaux, et l'historique dépend de l'activité et de l'espace du volume. CrowdStrike a signalé des événements d'environ quatre mois sur des systèmes typiques ; les volumes très actifs peuvent en garder beaucoup moins. Un fseventsd-uuid modifié ou un reformatage du volume démarre un nouvel historique. Collectez tôt et préservez les mtime des fichiers.
Collecte
Copiez le dossier entier en conservant les dates de modification (c'est votre seule horloge) :
# Live, as root, from a terminal with Full Disk Access
sudo ditto /System/Volumes/Data/.fseventsd /Volumes/CASE/MBP01/fseventsd
sudo ls -lT /System/Volumes/Data/.fseventsd > /Volumes/CASE/MBP01/fseventsd_listing.txt
- UAC : les profils
ir_triageetfullincluent l'artefactfiles/logs/macos.yaml, qui collecte/.fseventsdet/System/Volumes/*/.fseventsd. - mac_apt : le plugin
FSEVENTSlit le dossier directement depuis une image E01, DMG, brute ou montée. - Aftermath : non collecté par défaut ; ajoutez le dossier avec
--collect-dirs. - Supports amovibles : faites une image du disque ou copiez son
.fseventsdavec le même soin.
Analyse
FSEventsParser (gère 1SLD, 2SLD et 3SLD) produit une base SQLite ainsi que des rapports TSV :
python3 FSEParser_V4.1.py -s /cases/MBP01/fseventsd -t folder -o /cases/MBP01/out -c MBP01
-- FSEventsParser schema: deleted items under a user's Downloads
SELECT id_hex, fullpath, type, flags, approx_dates_plus_minus_one_day, source, source_modified_time
FROM fsevents_sorted_by_event_id
WHERE fullpath LIKE 'Users/%/Downloads/%' AND flags LIKE '%Removed;%'
ORDER BY id;
mac_apt analyse les mêmes données depuis une image, avec une colonne SourceModDate pour chaque enregistrement :
python3 mac_apt.py -o /cases/MBP01/mac_apt E01 /cases/MBP01.E01 FSEVENTS
FSEvents Parser décode dans le navigateur un dossier .fseventsd (ou une collecte UAC, Aftermath ou Velociraptor), avec drapeaux décodés, fenêtres de temps, paires de renommage et export CSV ou Timesketch ; rien n'est envoyé.
Conseils d'investigation
- Appariez les enregistrements
Renamedpar identifiant de nœud (version 2 et ultérieures) pour suivre un fichier à travers renommages et déplacements. - Un
ExtendedAttrRemovedsur un bundle d'application fraîchement téléchargé peut signifier que l'attribut de quarantaine a été retiré. Consultez les événements de quarantaine. - Surveillez les chemins
Library/LaunchAgentsetLibrary/LaunchDaemonspour repérer une persistance éphémère ; voir LaunchAgents et LaunchDaemons. - Un fichier
no_logou unfseventsd-uuidrécent peut relever d'une manœuvre anti-forensique délibérée, ou simplement d'un volume formaté ailleurs. Vérifiez les Unified Logs et les horodatages APFS de ces fichiers. - Sur le volume Data interne, de nouveaux chemins
Volumes/<name>montrent qu'un volume a été monté. Croisez avec le.fseventsdpropre au disque et les traces de périphériques USB. - Coalescence : un même enregistrement peut combiner
Created;Modified;Removed. L'ordre exact au sein d'un enregistrement est irrécupérable. - La sortie analysée dépasse facilement le million de lignes. Filtrez d'abord par chemin (
Users/*/Downloads,private/tmp,Users/Shared,Library/LaunchAgents), puis élargissez. - Dédupliquez avant de rédiger le rapport : FSEventsParser ne déduplique pas, et des fichiers gzip récupérés par carving peuvent répéter des enregistrements.