Que sont les Unified Logs de macOS ?
Depuis macOS 10.12 Sierra, le noyau, les démons d'Apple et toute app qui utilise os_log écrivent dans un seul système de journalisation. logd stocke les entrées dans des fichiers binaires compressés .tracev3 sous /private/var/db/diagnostics ; le texte de chaque message est reconstitué à partir d'une chaîne de format conservée dans /private/var/db/uuidtext (par binaire) ou dans les fichiers dsc du cache partagé, et des valeurs enregistrées avec l'entrée.
Pour un enquêteur, c'est la trace chronologique la plus riche d'un Mac : connexions et sudo, décisions de confidentialité (TCC), Gatekeeper et XProtect, launchd et éléments de connexion, SSH et partage d'écran, montages de disques — chaque entrée avec son processus, son PID, son sous-système, sa catégorie et un horodatage à la microseconde.
Ce que lit cet outil
- Un .logarchive (issu de log collect ou de sysdiagnose), en dossier ou en ZIP, ou les dossiers bruts diagnostics + uuidtext copiés depuis un Mac ou une image disque, y compris les collectes UAC (.tar.gz) et Velociraptor (ZIP).
- Les blocs tracev3 : en-tête, catalogue, chunksets compressés en LZ4, firehose (log, activity, trace, signpost, loss), chaînes oversize, statedump et simpledump ; heures Mach relatives au démarrage converties en UTC grâce aux enregistrements timesync (bases de temps Intel et Apple silicon).
- Les chaînes de format résolues via les fichiers uuidtext et dsc et rendues comme log show (conversions printf, %{public}/%{private}, décodeurs errno, UUID et mask.hash).
- Les exports de log show : --style ndjson et json (tous les champs), et les styles texte default, compact et syslog, messages multilignes compris.
- Filtres par texte libre ou expression régulière, type, processus, sous-système, catégorie et PID (avec exclusions), plage horaire à la seconde avec bande de densité, règles de tri DFIR, et exports CSV, NDJSON (noms de champs de log show), JSON et Timesketch.
Pourquoi c'est utile en enquête
- Authentification et privilèges : commandes et échecs sudo, su, droits d'autorisation, sessions SSH et partage d'écran, nouveaux comptes locaux.
- Contournement des défenses et persistance : autorisations TCC comme l'accès complet au disque pour Terminal, contournements Gatekeeper, retrait de quarantaine, nouveaux agents et démons de lancement, éléments de connexion et extensions.
- Contexte d'exfiltration : volumes USB montés par DiskArbitration, activité réseau et fichiers dans les mêmes minutes.
- Point d'ancrage de la chronologie : horodatages à la microseconde et UUID de démarrage alignent tous les autres artefacts macOS.
Limites à garder en tête
- Les messages ne sont complets que si les fichiers de chaînes le sont : sans uuidtext ni dsc, le texte ne peut pas être reconstitué (les entrées sont marquées non résolues). Sans timesync, les heures sont approximatives.
- Les valeurs <private> ont été masquées à la journalisation et ne peuvent pas être récupérées. La plupart des messages Info et Debug ne sont jamais écrits sur disque.
- Le magasin tourne selon sa taille et ne garde souvent que quelques jours. L'absence d'entrées ne prouve pas que rien ne s'est passé.
- Le rendu suit l'analyseur open source macos-unifiedlogs, validé ici contre log show (environ 99 % des messages log, activity et state identiques) ; le texte des signposts et certains décodeurs d'objets diffèrent. Vérifiez les entrées clés avec log show avant de vous y fier dans un rapport.
- Tout est gardé dans la mémoire du navigateur : les très gros magasins (plusieurs millions d'entrées) peuvent nécessiter les options d'import pour ne charger qu'une fenêtre horaire.
Comment les collecter
- Sur le Mac : sudo log collect --output hote.logarchive (tout le magasin), puis déposez le paquet ou son ZIP.
- Depuis une image ou un autre outil : copiez /private/var/db/diagnostics et /private/var/db/uuidtext avec leur arborescence (UAC macos_unified_logs, mac_apt UNIFIEDLOGEXPORT, Velociraptor Generic.Collectors.File).
- Si vous n'avez que l'outil d'Apple : log show --archive hote.logarchive --info --debug --timezone UTC --style ndjson > hote.ndjson.
Questions fréquentes
Mes journaux sont-ils envoyés quelque part ?
Non. Les fichiers sont lus par du code WebAssembly qui s'exécute dans un Web Worker de votre navigateur. Rien n'est envoyé à un serveur ; fermer l'onglet oublie tout.
Faut-il un Mac pour l'utiliser ?
Non. Le décodeur tracev3 fonctionne dans tout navigateur récent sous Windows, Linux ou macOS. Il vous faut seulement les fichiers : un .logarchive, ou les dossiers diagnostics et uuidtext d'un Mac ou d'une image disque.
Pourquoi certains messages sont-ils incomplets ou marqués non résolus ?
Le texte d'une entrée vient de chaînes de format stockées dans les fichiers uuidtext et dsc. Si ces fichiers manquent à votre collecte, ou si l'entrée pointe vers une chaîne qu'ils ne contiennent pas, le message ne peut pas être entièrement reconstitué. Collectez le dossier uuidtext, ou un .logarchive qui l'inclut.
Le résultat est-il identique à log show ?
Très proche, mais sans garantie. Le décodeur repose sur l'analyseur open source macos-unifiedlogs de Mandiant, corrigé pour coller à log show (format des nombres, UUID, errno et empreintes masquées). Sur une archive réelle, environ 99 % des messages étaient identiques à log show ; les signposts et quelques types d'objets sont rendus différemment. Pour une preuve, confirmez les entrées importantes avec log show.
Dans quel fuseau horaire sont les heures ?
Les entrées sont converties en UTC à partir de l'heure Mach relative au démarrage grâce aux enregistrements timesync. Le sélecteur UTC / Local ne change que l'affichage ; les exports sont toujours en UTC.
Quelle taille de magasin peut-il traiter ?
Plusieurs millions d'entrées, dans la limite de la mémoire de l'onglet. Pour des magasins plus gros, utilisez les options d'import pour ne garder qu'une fenêtre horaire ou ignorer les signposts, Info ou Debug pendant la lecture.
Peut-il lire la sortie de log show ?
Oui : --style ndjson et json gardent tous les champs ; les styles texte default, compact et syslog fonctionnent aussi, avec moins de détails. Utilisez --timezone UTC pour des heures sans ambiguïté (le style compact n'a pas de décalage UTC).
Les constats de tri prouvent-ils une compromission ?
Non. Ce sont des préréglages qui désignent des entrées à lire (sudo, autorisations TCC, contournements Gatekeeper, nouveaux éléments de lancement, montages USB…). Beaucoup sont courants sur un Mac normal ; jugez-les dans leur contexte.