Fondamentaux de macOS et Linux · Leçon 2 sur 5
Activité macOS : Unified Logs, FSEvents, KnowledgeC et Biome
12 min de lecture
Sur un Mac, la réponse à la question « Qu’a fait cet utilisateur, et quand ? » est répartie entre un journal système binaire, un journal des modifications du système de fichiers, des bases de données d’utilisation et quelques petits fichiers SQLite. Chaque source couvre une facette différente de l’activité et gère le temps différemment ; l’une d’elles ne conserve même aucun horodatage. Cette leçon indique où se trouve chaque source, comment la collecter et l’interroger, quel format temporel elle utilise et comment corroborer une source par une autre. La leçon 6.1 a présenté l’organisation de macOS et les plists, et la leçon 3.1 a traité du format Mac Absolute Time, utilisé par la plupart des sources présentées ici. Les détails ci-dessous changent selon les versions de macOS ; vérifiez donc toujours le comportement sur un système de référence de la même version.
Unified Logging
Depuis macOS 10.12, la quasi-totalité de la journalisation du système et des applications passe par le système Unified Logging. Les messages sont stockés dans des fichiers binaires tracev3 sous /private/var/db/diagnostics, dans les sous-répertoires Persist (la plupart des messages conservés), Special (certains messages conservés plus longtemps), Signpost (marqueurs de performance) et HighVolume (souvent vide). Un fichier tracev3 stocke principalement les arguments de chaque message. Les chaînes de format se trouvent dans /private/var/db/uuidtext, dans des fichiers portant le nom de l’UUID du binaire à l’origine de la journalisation, et le sous-répertoire timesync de diagnostics contient les enregistrements nécessaires pour convertir l’horloge stockée, relative au démarrage, en heure civile. Sans les fichiers uuidtext et timesync, les messages ne peuvent pas être entièrement restitués ni datés ; collectez donc les trois ensembles. L’espace étant limité, la durée de conservation va de quelques jours à quelques semaines selon l’activité du système.
Sur un Mac en fonctionnement, sudo log collect --output case.logarchive rassemble l’ensemble dans un seul paquet .logarchive ; --last 3d ou --start "2026-03-14 00:00:00" limite la plage temporelle. L’analyse utilise log show --archive case.logarchive --predicate '…' --style json. Un prédicat est un filtre portant sur des champs tels que process, subsystem, category et eventMessage, par exemple process == "loginwindow", subsystem == "com.apple.xprotect" ou eventMessage CONTAINS "USBMSC". Sans --info et --debug, ces deux niveaux inférieurs ne sont pas affichés. log show affiche les heures dans le fuseau horaire de la machine d’analyse avec un décalage numérique, par exemple 2026-03-14 06:25:41.208114-0300 ; convertissez-les en UTC avant de les inclure dans votre rapport.
Dans les journaux de production, les chaînes dynamiques qu’un développeur n’a pas déclarées publiques apparaissent sous la forme <private>. Il s’agit d’un choix de journalisation effectué lors de l’écriture de l’événement, et non d’un acte anti-forensique ; la valeur masquée ne peut pas être récupérée ultérieurement à partir du journal.
Points de départ utiles (le libellé des messages change selon les versions ; testez donc d’abord les prédicats) :
| Activité | Prédicat de départ |
|---|---|
| Ouverture de session, verrouillage et déverrouillage | process == "loginwindow" |
| Utilisation de sudo | process == "sudo" (utilisateur, TTY, répertoire de travail, commande) |
| Stockage USB et montages | eventMessage CONTAINS "USBMSC" ; process == "diskarbitrationd" |
| Partage d’écran | process == "screensharingd" (résultat de l’authentification, adresse du client de visualisation) |
| Gatekeeper | process == "syspolicyd" |
| XProtect | subsystem == "com.apple.xprotect" ou le nom du processus XProtect pour cette version |
Sur une machine d’analyse Windows ou Linux, des analyseurs open source tels que la bibliothèque macos-UnifiedLogs de Mandiant et ses exemples d’outils en ligne de commande lisent une archive logarchive, ou une copie de l’ensemble diagnostics et uuidtext, et exportent les données au format CSV ou JSON. Les outils réservés au Mac, tels que log, ne sont pas nécessaires pour travailler hors ligne.
Les anciens journaux texte de /private/var/log existent toujours. system.log contient désormais peu d’informations, mais install.log enregistre les installations et mises à jour de logiciels, avec des heures locales accompagnées d’un décalage UTC.
FSEvents
Le démon fseventsd enregistre les modifications du système de fichiers dans .fseventsd, à la racine de chaque volume accessible en écriture, y compris les disques externes. Sous macOS 10.15 et versions ultérieures, le répertoire pertinent pour les fichiers utilisateur se trouve sur le volume Data (monté sur /System/Volumes/Data sur un système en fonctionnement). La présence de .fseventsd sur le volume FAT32, exFAT ou APFS d’un support USB montre que celui-ci a été monté en écriture sur un Mac.
Chaque fichier de .fseventsd est compressé avec gzip et contient des pages commençant par une signature : 1SLD sur les anciens systèmes, 2SLD à partir de macOS 10.13 (qui ajoute un identifiant de nœud à chaque enregistrement) et une variante ultérieure 3SLD. Chaque enregistrement contient un chemin complet, un identifiant d’événement de 8 octets qui ne fait qu’augmenter, et un champ d’indicateurs de 4 octets avec des bits tels que Created, Removed, Renamed, Modified, InodeMetaMod, FolderCreated et Mount.
FSEvents ne contient aucun horodatage par enregistrement. Les identifiants d’événement indiquent un ordre, pas une heure. L’estimation habituelle repose sur l’heure de modification du fichier gzip lui-même : tous les enregistrements de ce fichier ont été écrits avant celle-ci, et généralement après l’heure de modification du fichier précédent. Réduisez cette fenêtre en trouvant, dans le même fichier, un chemin dont vous connaissez l’heure grâce à une autre source. FSEvents est précieux, car il conserve les noms des fichiers supprimés, y compris ceux des fichiers sur des supports externes, ainsi que les renommages révélant un nom antérieur. Un fichier nommé no_log dans .fseventsd arrête la journalisation pour ce volume. Les analyseurs comprennent FSEventsParser et le module FSEvents de mac_apt.
KnowledgeC
La base de données knowledgeC est un fichier SQLite géré par le framework CoreDuet. Il en existe deux copies : une par utilisateur dans ~/Library/Application Support/Knowledge/knowledgeC.db et une à l’échelle du système dans /private/var/db/CoreDuet/Knowledge/knowledgeC.db. Copiez les fichiers -wal et -shm avec chacune, car les lignes récentes se trouvent souvent encore dans le journal d’écriture anticipée.
Les événements se trouvent dans la table ZOBJECT. ZSTREAMNAME indique le nom du flux, par exemple /app/inFocus (une application au premier plan), /app/usage, /device/isLocked ou /safari/history ; les flux présents varient selon la version. ZVALUESTRING contient la valeur, par exemple l’identifiant de bundle d’une application. ZSTARTDATE, ZENDDATE et ZCREATIONDATE sont au format Mac Absolute Time en UTC, et ZSECONDSFROMGMT enregistre le décalage UTC de l’appareil à cet instant, par exemple -10 800 pour UTC−3.
Sur les versions récentes de macOS, de nombreux flux, notamment celui des applications au premier plan, sont écrits dans Biome à la place. Sous macOS 13 et versions ultérieures, attendez-vous à ce que knowledgeC soit peu renseignée ou dépourvue de flux enregistrés par les anciens systèmes. Un flux /app/inFocus vide à cet endroit ne constitue pas une preuve de suppression.
Biome
Biome stocke les flux dans des dossiers propres à chaque flux sous ~/Library/Biome et, pour les flux système, sous /private/var/db/biome ; les applications au premier plan sont enregistrées dans un flux nommé App.InFocus. Les fichiers utilisent le format SEGB d’Apple : la signature ASCII SEGB dans un en-tête (il existe deux versions de cet en-tête), suivie d’enregistrements dont les charges utiles sont généralement des messages protobuf, avec des heures d’enregistrement au format Mac Absolute Time. La prise en charge par les outils est récente et évolue rapidement. Il existe des analyseurs SEGB open source et des modules Biome dans des outils communautaires, mais testez tout outil sur un fichier connu avant de vous fier à ses résultats.
Téléchargements, navigation et autres activités utilisateur
- Base de données de quarantaine :
~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2(SQLite, sans extension). La tableLSQuarantineEventcontient un UUID (LSQuarantineEventIdentifier),LSQuarantineTimeStamp(Mac Absolute Time), l’agent (LSQuarantineAgentName,LSQuarantineAgentBundleIdentifier),LSQuarantineDataURLString(l’URL du fichier) etLSQuarantineOriginURLString(la page référente). Le fichier téléchargé porte un attribut étenducom.apple.quarantine, par exemple0083;69b52883;Safari;<UUID>: les indicateurs, l’heure du téléchargement en secondes Unix hexadécimales, l’agent et le même UUID. Les lignes subsistent après la suppression du fichier. - Safari :
~/Library/Safari/History.db, oùhistory_itemscontient les URL ethistory_visitscontient chaque visite avecvisit_timeau format Mac Absolute Time. Le module 4 traite des navigateurs. - Éléments récents :
~/Library/Application Support/com.apple.sharedfilelist/contient des fichiers.sfl2(.sfl3sur les versions plus récentes) pour les documents, applications et serveurs récents, ainsi que des listes de documents récents propres à chaque application. Il s’agit de plists archivées contenant des données de signets (chemin, volume) ; l’ordre de la liste indique la récence, mais les éléments ne portent généralement aucun horodatage individuel. OS X 10.11 et 10.12 utilisaient des fichiers.sfldans le même dossier ; les systèmes antérieurs à 10.11 utilisaientcom.apple.recentitems.plistdans~/Library/Preferences. - TCC.db : la base de données des autorisations de confidentialité, par utilisateur dans
~/Library/Application Support/com.apple.TCC/TCC.dbet à l’échelle du système dans/Library/Application Support/com.apple.TCC/TCC.db. La tableaccessrépertorie unservice(tel quekTCCServiceScreenCapture,kTCCServiceAccessibilityoukTCCServiceSystemPolicyAllFilespour l’accès complet au disque), l’applicationclient,auth_value(2 signifie autorisé sous macOS 11 et versions ultérieures) etlast_modifieden secondes Unix. Un outil de contrôle à distance ayant reçu les autorisations d’enregistrement de l’écran et d’accessibilité ressort ici. - Spotlight :
.Spotlight-V100, sur chaque volume indexé, contient l’index des métadonnées, notamment des attributs tels quekMDItemLastUsedDateetkMDItemWhereFroms; des analyseurs tels que le plugin Spotlight demac_aptpeuvent le lire.
Quelle source répond à quelle question
| Question | Source | Chemin | Format temporel |
|---|---|---|---|
| Quand l’utilisateur a-t-il ouvert sa session ou déverrouillé le système ? | Unified Logs | /private/var/db/diagnostics + uuidtext | Restitué avec un décalage ; à convertir en UTC |
| Quels fichiers ont été créés, renommés ou supprimés ? | FSEvents | .fseventsd sur chaque volume | Aucun ; estimation à partir du mtime du fichier gzip |
| Quelle application était au premier plan, et pendant combien de temps ? | knowledgeC / Biome | knowledgeC.db ; ~/Library/Biome | Mac Absolute Time |
| Qu’est-ce qui a été téléchargé, et depuis où ? | Base de données de quarantaine | ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 | Mac Absolute Time (xattr : Unix hexadécimal) |
| Quelles pages ont été visitées ? | Safari | ~/Library/Safari/History.db | Mac Absolute Time |
| Quelle application a obtenu l’accès à l’écran ou au disque ? | TCC | .../com.apple.TCC/TCC.db | Secondes Unix |
Exemple détaillé : un téléchargement, un lancement et une entrée de journal
Un Mac réglé sur UTC−3 est examiné. La base de données de quarantaine contient une ligne pertinente :
| Champ | Valeur |
|---|---|
LSQuarantineTimeStamp | 795 172 867,0 |
LSQuarantineAgentName | Safari |
LSQuarantineOriginURLString | https://www.example.net/support |
LSQuarantineDataURLString | https://downloads.example.net/files/RemoteHelper.dmg |
Conversion de Mac Absolute Time en temps Unix : 795 172 867 + 978 307 200 = 1 773 480 067, soit 2026-03-14T09:21:07Z. En hexadécimal, 1 773 480 067 s’écrit 69b52883, la valeur attendue dans le deuxième champ de l’attribut com.apple.quarantine du fichier.
La base knowledgeC de l’utilisateur contient une ligne /app/inFocus avec ZVALUESTRING = net.example.RemoteHelper, ZSTARTDATE = 795 173 145,0, ZENDDATE = 795 173 412,0 et ZSECONDSFROMGMT = -10 800.
- Début : 795 173 145 + 978 307 200 = 1 773 480 345 = 2026-03-14T09:25:45Z.
- Fin : 795 173 412 + 978 307 200 = 1 773 480 612 = 2026-03-14T09:30:12Z.
- Durée : 795 173 412 − 795 173 145 = 267 s (4 min 27 s).
- -10 800 s correspondent à −3 h ; le début en heure locale était donc 06:25:45. N’appliquez pas le décalage à la valeur stockée ;
ZSTARTDATEest déjà en UTC.
Dans le journal unifié, log show --archive case.logarchive --predicate 'process == "syspolicyd" AND eventMessage CONTAINS "RemoteHelper"' renvoie une évaluation Gatekeeper de /Applications/RemoteHelper.app à 2026-03-14 06:25:41.208114-0300. L’ajout de 3 heures donne 09:25:41Z, quatre secondes avant le passage de l’application au premier plan, ce qui est cohérent avec une vérification par Gatekeeper lors d’un premier lancement. Trois sources indépendantes donnent désormais une même séquence : téléchargement à 09:21:07Z, vérification Gatekeeper à 09:25:41Z, application au premier plan de 09:25:45Z à 09:30:12Z. FSEvents peut y ajouter la création de RemoteHelper.app dans /Applications, mais uniquement sous la forme d’un événement ordonné sans heure propre.
Points clés pour l’examen : Attendez-vous à des questions sur l’emplacement de chaque source, le format temporel qu’elle utilise (Mac Absolute Time pour knowledgeC, Biome, la quarantaine et Safari ; secondes Unix dans TCC et en hexadécimal dans l’attribut de quarantaine ; aucun horodatage dans FSEvents) et la conversion d’une valeur Mac Absolute Time en UTC au format ISO 8601. Sachez pourquoi les fichiers uuidtext et timesync doivent être collectés avec les fichiers tracev3, ce que signifie <private> et pourquoi knowledgeC peut être peu renseignée sur les versions récentes de macOS.
Points essentiels
- Unified Logs : les fichiers tracev3 de
/private/var/db/diagnosticsnécessitentuuidtextet les données timesync ; collectez-les aveclog collect, filtrez-les aveclog show --predicateet convertissez les heures affichées avec leur décalage en UTC. - FSEvents enregistre les chemins, les indicateurs et les identifiants d’événement par volume, y compris les noms supprimés sur les disques externes, mais aucune heure par enregistrement.
- knowledgeC stocke des flux d’utilisation tels que
/app/inFocusau format Mac Absolute Time avecZSECONDSFROMGMT; les versions récentes de macOS en déplacent une grande partie vers les fichiers SEGB de Biome. - La base de données de quarantaine relie l’URL, l’agent et l’heure d’un téléchargement à l’attribut
com.apple.quarantinedu fichier. - TCC.db indique quelles applications ont reçu des autorisations de confidentialité, avec une datation en secondes Unix.
- Corroborez les sources : téléchargement, entrée de journal et enregistrement d’utilisation doivent former une séquence cohérente.
Questions d’entraînement
Vérifiez votre compréhension. Ces questions ne comptent pas pour l’examen.
Connectez-vous pour enregistrer votre progression et reprendre là où vous vous êtes arrêté. C’est gratuit. Se connecter