Fondamentaux de macOS et Linux · Leçon 1 sur 5
macOS : arborescence, plists et comptes
13 min de lecture
Un Mac conserve l'essentiel de sa configuration et une grande partie de l'activité de ses utilisateurs dans des fichiers ordinaires : listes de propriétés, petites bases de données et attributs étendus, répartis dans une arborescence de répertoires différente de celle de Windows et de Linux. Cette leçon présente les répertoires dans lesquels travaille un examinateur, explique comment lire les listes de propriétés et les attributs que macOS associe aux fichiers téléchargés, et indique où le système enregistre sa version, ses noms, son fuseau horaire, ses comptes et son historique d'installation. Elle explique également pourquoi l'acquisition des Mac modernes est généralement logique. La leçon 1.7 a traité des volumes APFS et la leçon 3.1 des formats temporels Apple ; ces deux sujets sont considérés comme acquis ici.
L'arborescence des répertoires
Sous macOS 10.15 Catalina et les versions ultérieures, l'arborescence visible combine le volume System en lecture seule et le volume Data (leçon 1.7). /etc, /var et /tmp sont des liens symboliques vers /private/etc, /private/var et /private/tmp ; une collecte de triage ou un analyseur peut donc afficher l'une ou l'autre forme.
| Chemin | Contenu | Notes pour l'examinateur |
|---|---|---|
/System | Le système d'exploitation, sur le volume System scellé | En lecture seule ; contient SystemVersion.plist |
/Applications | Les applications installées par les utilisateurs et l'App Store | Les applications intégrées d'Apple se trouvent dans /System/Applications depuis Catalina |
/Library | Les paramètres et fichiers de support à l'échelle du système pour tous les utilisateurs | Preferences, Application Support, Logs, éléments de lancement (leçon 6.5) |
/Users/<name> | Les dossiers de départ | Desktop, Documents, Downloads et le dossier masqué Library |
~/Library/Preferences | Les paramètres des applications propres à chaque utilisateur, un plist par application | Nommés d'après l'identifiant de bundle, par exemple com.apple.finder.plist |
~/Library/Application Support | Les données et bases de données propres à chaque application | De nombreuses bases de données de navigateurs et de messageries instantanées (module 4) |
~/Library/Containers/<bundle-id> | Les données des applications en bac à sable | Data/ reproduit la structure d'un dossier de départ ; les préférences de l'application se trouvent donc dans Data/Library/Preferences |
~/Library/Group Containers/<group-id> | Les données partagées par les applications d'un même développeur | Par exemple, group.com.apple.notes contient la base de données de Notes |
~/Library/Caches, ~/Library/Logs | Les caches et journaux d'applications propres à chaque utilisateur | Volatils, mais souvent négligés |
/private/var/db | Les bases de données système | Comptes locaux (dslocal), receipts, .AppleSetupDone, magasins du journal unifié (diagnostics, uuidtext) |
/private/var/log | Les journaux textuels | install.log, system.log |
/private/var/folders | Les dossiers temporaires et de cache propres à chaque utilisateur | /private/var/folders/<2 chars>/<random>/ avec les sous-dossiers T (temporaire), C (cache) et 0 |
/private/etc | La configuration Unix | hosts, sudoers, le lien localtime |
Les applications en bac à sable (toutes les applications de l'App Store, ainsi que des applications intégrées comme Safari dans les versions actuelles) conservent leurs données dans leur conteneur ; recherchez-les donc à cet endroit avant de conclure qu'une application n'a laissé aucune préférence.
Fichiers masqués et attributs étendus
Le Finder masque les noms qui commencent par un point et les éléments portant l'indicateur BSD hidden (défini avec chflags hidden, affiché par ls -lO) ; ~/Library est masqué de cette manière. Les outils d'analyse forensique affichent les deux.
Les attributs étendus (xattrs) sont des éléments de métadonnées nommés, stockés avec un fichier, en dehors de son contenu. xattr -l <file> répertorie leurs noms et leurs valeurs. Deux d'entre eux sont importants dans presque tous les cas :
com.apple.quarantine: ajouté aux fichiers téléchargés par les applications qui prennent en charge la mise en quarantaine (navigateurs, clients de courrier et de messagerie, AirDrop). Sa valeur est une chaîne de texteflags;timestamp;agent;UUID: quatre chiffres hexadécimaux d'indicateurs, l'heure en secondes Unix hexadécimales, le nom de l'application ayant effectué le téléchargement et un UUID qui renvoie à la base de données des événements de quarantaine de l'utilisateur,~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2, laquelle peut contenir l'URL de téléchargement.com.apple.metadata:kMDItemWhereFroms: les URL sources d'un téléchargement, généralement l'URL du fichier et la page référente. Sa valeur est une liste de propriétés binaire contenant un tableau de chaînes.
Les attributs étendus n'existent que sur les systèmes de fichiers qui les prennent en charge, comme APFS et HFS+. Lorsqu'un Mac copie un fichier vers FAT32 ou exFAT, macOS stocke les attributs dans un fichier AppleDouble distinct nommé ._<filename> (signature 00 05 16 07) ; les fichiers ._ présents sur une clé USB montrent donc qu'un Mac y a écrit. La plupart des autres copies (téléversements, nombreux outils d'archivage, outils de copie qui ne préservent pas les xattrs même vers des systèmes de fichiers les prenant en charge) les suppriment sans avertissement. Effectuez la collecte dans un format d'image ou de conteneur qui préserve les xattrs, ou consignez-les avec xattr -l avant la copie.
Listes de propriétés
Une liste de propriétés (plist) sérialise une arborescence de valeurs typées : dictionnaires, tableaux, chaînes, entiers, réels, booléens, dates et données brutes. Elle joue le rôle d'une clé du Registre, mais chaque plist est un fichier distinct. Trois formes sont importantes :
| Forme | Comment la reconnaître | Notes |
|---|---|---|
| XML | Commence par <?xml et une déclaration DOCTYPE plist | Dates sous forme de texte ISO 8601, données en Base64 |
| Binaire | Les 8 premiers octets sont bplist00 | La plupart des plists système et d'applications ; une structure finale de 32 octets pointe vers une table de décalages |
| JSON | Commence par { ou [ | Une option d'exportation de plutil ; ne peut pas représenter les dates ni les données, de sorte que les conversions de tels plists échouent |
Sur un Mac, plutil -p <file> affiche tout plist de manière lisible, et plutil -convert xml1 -o out.xml <file> écrit une copie XML. Sans -o, plutil -convert réécrit le fichier sur place ; ne l'exécutez donc que sur des copies de travail. Sous Linux ou Windows, plistlib de Python lit les plists XML et binaires.
Dans un plist binaire, chaque objet commence par un octet marqueur : les quatre bits de poids fort indiquent le type et les quatre bits de poids faible un code de longueur ou de taille. 0x5n désigne une chaîne ASCII de n caractères, 0x6n une chaîne UTF-16, 0x1n un entier, 0x23 un réel de 8 octets, 0x33 une date, 0x4n des données brutes, 0x8n une référence UID, 0xAn un tableau et 0xDn un dictionnaire. Une date est un nombre à virgule flottante double précision de 8 octets en ordre gros-boutiste, exprimé en Mac Absolute Time.
Deux types d'imbrication sont courants. Une valeur data peut elle-même commencer par bplist00 : un plist à l'intérieur d'un plist, qui doit être décodé à nouveau. De nombreuses applications sérialisent également les objets avec NSKeyedArchiver : le plist comporte les clés $archiver (valeur NSKeyedArchiver), $version, $top et $objects, et les valeurs sont réparties dans le tableau $objects et reliées par des références UID. Lisez ces éléments avec un analyseur assurant la désérialisation plutôt qu'à l'œil nu.
Principaux plists système
| Question | Fichier ou chemin | Clé |
|---|---|---|
| Version et build de macOS | /System/Library/CoreServices/SystemVersion.plist | ProductVersion, ProductBuildVersion |
| Noms de l'ordinateur | /Library/Preferences/SystemConfiguration/preferences.plist | System/System/ComputerName, System/System/HostName (si défini), System/Network/HostNames/LocalHostName |
| Fuseau horaire | /private/etc/localtime (lien symbolique) | Cible du lien, par exemple /var/db/timezone/zoneinfo/Europe/Berlin |
| Ville choisie pour le fuseau horaire | /Library/Preferences/.GlobalPreferences.plist | com.apple.TimeZonePref.Last_Selected_City |
| Dernier utilisateur dans la fenêtre d'ouverture de session | /Library/Preferences/com.apple.loginwindow.plist | lastUserName |
| Ouverture de session automatique | /Library/Preferences/com.apple.loginwindow.plist | autoLoginUser (mot de passe obfusqué dans /private/etc/kcpassword) |
| Réseaux Wi-Fi connus | /Library/Preferences/com.apple.wifi.known-networks.plist | Une entrée par réseau, wifi.network.ssid.<SSID>, avec AddedAt, JoinedByUserAt, JoinedBySystemAt |
| Appareils Bluetooth | /Library/Preferences/com.apple.Bluetooth.plist | Adresses et noms des appareils jumelés |
| Comptes locaux | /private/var/db/dslocal/nodes/Default/users/<name>.plist | uid, home, generateduid, accountPolicyData |
| Administrateurs | /private/var/db/dslocal/nodes/Default/groups/admin.plist | users, groupmembers |
| Installations et mises à jour | /Library/Receipts/InstallHistory.plist | date, displayName, displayVersion, processName |
SystemVersion.plist se trouve sur le volume System et peut être absent d'une collecte du volume Data ; InstallHistory.plist indique alors les versions installées. Le fichier Wi-Fi a remplacé le dictionnaire KnownNetworks de /Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist au cours du cycle de macOS 11 Big Sur ; sur les systèmes plus anciens, lisez plutôt ce fichier. Le fuseau horaire correspond à la cible du lien, et non au contenu du fichier de zone.
Comptes
macOS conserve les comptes locaux dans le nœud local du service d'annuaire, à raison d'un plist binaire par compte sous /private/var/db/dslocal/nodes/Default/users/, lisible uniquement par root sur un système en cours d'exécution. Chaque attribut est un tableau, même pour une valeur unique : uid est ["501"], sous forme de chaîne. Les clés utiles sont name (nom court), realname (nom complet), uid, gid (20, staff, pour les utilisateurs ordinaires), home, shell, generateduid (un UUID qui identifie le compte dans les appartenances aux groupes), authentication_authority et :
accountPolicyData: un plist imbriqué contenantcreationTime,passwordLastSetTime,failedLoginCountetfailedLoginTimestamp. Ces heures sont des secondes Unix stockées sous forme de réels, et non du Mac Absolute Time. Le compteur d'échecs est remis à zéro après la saisie d'un mot de passe correct. Pour l'historique des ouvertures de session, utilisez les journaux unifiés (leçon 6.2).ShadowHashData: un plist imbriqué contenant le hachage du mot de passe,SALTED-SHA512-PBKDF2(entropy,salt,iterations) depuis OS X 10.8. Il prouve qu'un compte possède un mot de passe local ; la récupération des mots de passe sort du cadre de ce cours.
Le premier compte créé dans l'Assistant réglages reçoit l'UID 501, le suivant 502. Les comptes dont le nom commence par _ sont des comptes de services système avec des UID faibles. Dans groups/admin.plist (GID 80), users répertorie les noms courts et groupmembers les valeurs de generateduid ; vérifiez les deux. Sur un Mac en cours d'exécution, dscl . -list /Users UniqueID et dscl . -read /Users/<name> affichent les mêmes données. Un compte mobile est une copie mise en cache localement d'un compte d'annuaire (par exemple Active Directory) ; son attribut authentication_authority contient LocalCachedUser, et son UID provient généralement de l'annuaire et est largement supérieur à 501.
Date d'installation et mises à jour
/private/var/db/.AppleSetupDone est un fichier vide créé lorsque l'Assistant réglages se termine ; ses horodatages indiquent donc quand le système a été configuré. Des configurations ultérieures après des mises à niveau du système d'exploitation peuvent le réécrire ; corroborez-le donc avec le creationTime du premier utilisateur et les entrées les plus anciennes de InstallHistory.plist. Chaque entrée de InstallHistory.plist enregistre une installation : mises à jour de macOS (processName tel que softwareupdated), applications de l'App Store et paquets d'installation. /private/var/db/receipts et /private/var/log/install.log les corroborent.
Collecte sur un Mac moderne
Sur les Mac équipés d'une puce T2 ou Apple silicon, une image physique est illisible en dehors du matériel d'origine (leçon 1.7), et une image complète du système déverrouillé en cours d'exécution est souvent peu réalisable. Les examinateurs effectuent donc une collecte logique de triage sur le Mac allumé et déverrouillé : sudo log collect --output <dest>.logarchive pour les journaux unifiés, ainsi que des copies de fichiers de /Users, /Library et /private/var réalisées avec un outil disposant de l'Accès complet au disque dans Confidentialité et sécurité. Sans cette autorisation, les protections de confidentialité (TCC) bloquent sans avertissement Mail, Messages, Safari et d'autres données protégées. Consignez ce qui n'a pas pu être lu et calculez le hachage des données produites. Exemples gratuits : Aftermath (collecte et analyse open source), mac_apt (analyse les images et les dossiers collectés), APOLLO (bases de données des habitudes de vie, leçon 6.2) et plutil.
Exemple détaillé : décodage de valeurs plist et d'une chaîne de quarantaine
loginwindow. Dans un fichier binaire com.apple.loginwindow.plist, les objets 5C 6C 61 73 74 55 73 65 72 4E 61 6D 65 et 54 61 6C 65 78 apparaissent. Le marqueur 0x5C désigne une chaîne ASCII de 12 caractères : lastUserName. Le marqueur 0x54 désigne une chaîne ASCII de 4 caractères : alex. Le dictionnaire les associe, donc lastUserName = alex.
Date d'InstallHistory. Une entrée dont le displayName est « macOS Sequoia 15.1 » possède un objet date égal à 33 41 C6 6C 84 94 80 00 00. Le marqueur 0x33 désigne une date ; les huit octets suivants sont un nombre à virgule flottante double précision en ordre gros-boutiste :
python3 -c "import struct; print(struct.unpack('>d', bytes.fromhex('41c66c8494800000')))"affiche752421161.0.- Temps Unix = 752 421 161 + 978 307 200 = 1 730 728 361.
python3 -c "import datetime as d; print(d.datetime.fromtimestamp(1730728361, d.timezone.utc))"affiche2024-11-04 13:52:41+00:00, soit 2024-11-04T13:52:41Z.
Quarantaine. xattr -l sur ~/Downloads/tool.dmg affiche com.apple.quarantine: 0083;65f2c1a3;Safari; suivi d'un UUID.
- 0x65F2C1A3 = 6×16^7 + 5×16^6 + 15×16^5 + 2×16^4 + 12×16^3 + 1×16^2 + 10×16 + 3 = 1 710 408 099.
python3 -c "import datetime as d; print(d.datetime.fromtimestamp(0x65f2c1a3, d.timezone.utc))"affiche2024-03-14 09:21:39+00:00; Safari a donc mis le fichier en quarantaine à 2024-03-14T09:21:39Z.
Corroborez cette information avec la ligne portant le même UUID dans QuarantineEventsV2, dont les heures sont exprimées en Mac Absolute Time, et avec l'heure de création APFS du fichier. L'heure de mise en quarantaine est définie par l'application ayant effectué le téléchargement et ne prouve pas que le fichier a été ouvert.
Points clés pour l'examen : Attendez-vous à devoir associer une question à sa source : version dansSystemVersion.plist, noms danspreferences.plist, dernier utilisateur danscom.apple.loginwindow.plist, comptes et appartenance au groupe des administrateurs sousdslocal, installations dansInstallHistory.plist. Préparez-vous à identifier un plist binaire grâce àbplist00, à décoder une date plist en Mac Absolute Time, à convertir le temps Unix hexadécimal d'une chaîne de quarantaine et à expliquer pourquoi les attributs étendus disparaissent lorsque des fichiers sont copiés vers des systèmes de fichiers ne prenant pas en charge les xattrs.
Points essentiels
- Les éléments de preuve relatifs à l'utilisateur se trouvent dans
/Users/<name>/Library(Preferences, Application Support, Containers, Group Containers) et sous/private/var(db,log,folders) ; les applications en bac à sable conservent leurs données dans leur conteneur. com.apple.quarantinecontient des indicateurs, un horodatage Unix hexadécimal, l'agent ayant effectué le téléchargement et un UUID ;kMDItemWhereFromscontient les URL sources. Tous deux ne sont conservés que là où les xattrs sont pris en charge ou transportés dans des fichiers AppleDouble._.- Les plists existent sous forme XML et binaire (
bplist00) ; les dates binaires sont des nombres à virgule flottante double précision Mac Absolute Time en ordre gros-boutiste ; les plists imbriqués et les archives NSKeyedArchiver nécessitent une seconde étape de décodage.plutil -convertsans-oécrase le fichier. - Les comptes locaux sont des plists propres à chaque utilisateur dans
dslocal: le premier utilisateur a l'UID 501, l'appartenance au groupe des administrateurs se trouve dansgroups/admin.plist, et les heures d'accountPolicyDatasont exprimées en secondes Unix. - L'acquisition des Mac modernes est généralement logique, depuis le système en cours d'exécution et déverrouillé, avec l'Accès complet au disque et
log collect.