Dans cet article, nous allons aborder le fonctionnement du système de fichier NTFS, certaines de ces particularités et nous finirons par faire un focus sur le métafichier système $MFT et l’importance qu’il pourrait avoir dans le cadre d’une réponse à incident/analyse forensique.

Une spécification officiel du système de fichier NTFS n’ayant pas été publiée par Microsoft, les informations contenus dans ce article sont basés sur des travaux de rétro-ingénierie menés notamment par Linux NTFS group et ayant été confirmés après observation du contenu sur disque d’un volume formaté en NTFS.

Avant de commencer à parler du métafichier $MFT, il est nécessaire de poser quelques bases concernant l’agencement et le fonctionnement des périphériques de stockage et systèmes de fichier.

Secteurs et clusters

Un secteur est la plus petite unité/espace adressable d’un disque permettant la lecture et l’écriture de données.

Un cluster est une série ou chaîne contigu de secteurs dont le nombre par cluster est en puissance de 2 (1, 2, 4, 8, 16…).

Historiquement, la taille standardisée d’un secteur d’un disque dur est de 512 octets mais, les disques durs modernes transitent vers une taille de secteur de 4k (4096 octets). De nombreux disques avec une taille de secteur de 4K continuent à émuler une taille de secteur de 512 octets au niveau du système de fichier (disques 512e) même si des disques avec une taille de secteur de 4K native dites 4kn existent sur le marché.

La quantité de données à stocker étant toujours en augmentation, dans le but d’améliorer leur efficacité, les disques de grande capacité dans les environnements d’entreprise sont de type 512e ou 4kn.

Le calcul de l’adresse d’un secteur dans un système de fichier peut se faire en utilisant la formule suivante :

Adresse de secteur = Adresse du cluster * Nombre de secteur par cluster

Structure d’un disque dur

Volumes et partitions

Une partition est une sous-division physique d’un périphérique de stockage.

Un volume est une unité de données indépendante identifiable par un nom (volume label), ne pouvant contenir qu’un seul système de fichier (NTFS, Ext4, Btrfs, FAT32..) qui occuper une partition ou un disque en partie ou dans sa totalité.

En prenant en exemple la capture d’écran suivante, on dispose d’un disque dur (Disque 0) avec 3 partitions :

  • Une première partition de 200 Mo
  • Une seconde partition de 49,16 Go
  • Une troisième partition de récupération de 529 Mo

Et un seul volume NTFS identifiable par le volume label C: occupant tout l’espace disponible de la seconde partition.

Exemple d’agencement d’un disque sous Windows

NTFS

NTFS (New Technology File System) est un système de fichier qui a été introduit par Microsoft avec Windows NT 3.1 en 1993 en remplacement des systèmes de fichier FAT16 et FAT32. Sa version 3.1 est celle qui est actuellement utilisée par les systèmes d’exploitation pour ordinateur de bureau Windows 10 et supérieure et systèmes d’exploitation pour serveurs Windows Server 2012 et supérieure.

Propriétés du système de fichier NTFS

Un volume formaté en NTFS dispose par défaut des propriétés suivantes :

  • Une taille de partition maximale de 16 Eo (1 Eo = 10^18 octets)
  • Une capacité du volume NTFS minimale de 400 Mo
  • Une taille de secteur de 512 octets et de cluster de 4096 octets contenant 8 secteurs mais modifiable au moment de l’installation du système
  • Gestion des fichiers de taille allant jusqu’à 16 To (1 To = 10^12 octets)
  • Support natif de la compression et du chiffrement sans utilisation d’un programme tiers
  • Gestion de l’UTF-16 permettant l’attribution de noms dans différentes langues aux fichiers et répertoires
  • Tolérance aux pannes : Les modifications effectuées sur le système de fichier sont journalisées dans le métafichier système $Logfile permettant de revenir à un état ultérieur avec peu de perte si il y a eu dysfonctionnement au moment de l’écriture sur disque
  • Sauvegarde périodique et régulière des données de l’utilisateur avec Volume Shadow Copy Service (VSS)
  • Possibilité d’appliquer des permissions flexibles sur chaque fichier et répertoire du système de fichier
  • Les noms des fichiers etrépertoires sont case-sensitive et le système est case-preserving
  • Tout élément du système de fichier est un fichier, y compris le secteur de démarrage qui est contenu dans le métafichier système $Boot

Comparé à ses prédécesseurs FAT16 et FAT32, NTFS apporte un lot de fonctionnalités permettant l’avènement d’un système de fichier plus robuste et des possibilités d’extension des tailles de secteurs et de fichiers.

La commande système Windows fsutil peut être utilisé pour recueillir des informations sur le système de fichier d’un volume comme suit :

Résultat de la commande système Windows fsutil

Allocation des secteurs et clusters

L’allocation des secteurs et clusters dans le système de fichier NTFS est réalisée en utilisant un algorithme de type Best-Fit. C’est-à-dire que la donnée à stocker est placée à l’endroit qui permettra une utilisation la plus efficace possible de l’espace disponible même si cet espace n’est pas le premier espace ou le suivant disponible. Donc, si une donnée de petite taille doit être écrite sur disque, les clusters faisant partie de petits groupes de clusters non alloués seront alloués pour cette donnée au lieu d’allouer de grands groupes de clusters dans lesquels des fichiers volumineux pourraient être stockés.

Métafichiers systèmes du système de fichier

Tout étant fichier dans le système de fichier NTFS, les informations nécessaires au bon fonctionnement du système sont elles aussi stockées dans des fichiers qui sont appelés les métafichiers du système (System Metadata Files).

Un métafichier est un fichier différent d’un fichier classique car il ne va contenir des données de l’utilisateur mais des informations servant au fonctionnement des différents mécanismes du système ou des informations décrivant les données contenues dans les fichiers des utilisateurs. Dans le cas du système de fichier, un métafichier système est donc un métafichier permettant le bon fonctionnement du système de fichier lui-même (File System Metadata File).

Ces métafichiers du système de fichier se trouvent dans le répertoire root du volume NTFS, commencent par un “$” suivi de la première lettre du nom du métafichier en majuscule et disposent d’ACLs système les rendant invisible aux yeux des utilisateurs classique du système.

Malgré le fait que tout soit fichier, chaque fichier dispose d’une structure différente et des outils différents peuvent être nécessaire pour prendre en compte la structure de chaque fichier et procéder à son analyse.

La liste des métafichiers du système de fichier NTFS est la suivante :

  • $MFT
  • $MFTMirr
  • $LogFIle
  • $Volume
  • $AttrDef
  • $Bitmap
  • $Boot
  • $BadClus
  • $Secure
  • $Upcase
  • $Extend

Structure du système de fichier NTFS

Le système de fichier NTFS n’impose pas de stricte exigence d’agencement. L’agencement du système de fichier peut être différent selon la version d’NTFS mais Windows suit certaines lignes directrices :

Les premiers secteurs sont obligatoirement alloués au métafichier du système de fichier $Boot contenant les instructions nécessaires au démarrage de la machine. Ensuite, suivant la version du système d’exploitation et l’implémentation d’NTFS, l’allocation des secteurs pour les différents métafichiers du système de fichier et données des utilisateurs peut être différente.

Un exemple ici où l’agencement est différent selon la version du système d’exploitation

NTFS layout, file system forensic analysis, Brian carrier

Tout secteur suivant les secteurs alloués aux métafichiers du système de fichier peut être alloué aux données des utilisateurs.

Parmis les métafichiers du système de fichier listés précedemment, nous allons retrouver le métafichier qui nous intéresse ici, $MFT

$MFT

Le métafichier $MFT (Master File Table) est au coeur du système de fichier NTFS et est un des plus important métafichiers du système.

$MFT est un métafichier qui maintient une entrée que l’on qualifie de $MFT entry ou de file record pour chaque fichier et répertoire du système de fichier. Chaque fichier ou répertoire existant dans le système de fichier dispose donc systématiquement d’une entrée correspondante dans le métafichier $MFT.

Le secteur alloué sur disque où débute le métafichier $MFT est indiqué dans le secteur de boot qui est stocké dans le métafichier $Boot qui lui-même est toujours localisé dans le premier secteur du système de fichier.

Selon la version du système d’exploitation Windows, sont alloués au métafichier $MFT les clusters suivants les clusters alloués au fichier $Boot ou les clusteurs se situant au milieu du volume NTFS.

La zone MFT

À la création du système de fichier, un petit espace en utilisant des groupes de clusters de petite taille est alloué au métafichier $MFT. Au fil du temps, de plus en plus de données seront stockées sur disque, le système de fichier va s’accroître, le métafichier $MFT va s’élargir et nécessiter plus d’espace et donc plus de clusters pour exister dans le système. Si l’espace disque regroupant les clusters autour du métafichier $MFT est déja alloué, alors, il y a un risque que le métafichier $MFT soit fragmenté et dégrade les performances du système de fichier. Pour empêcher cela, NTFS réserve une partie du système de fichier autour du métafichier $MFT qui est appelé la zone MFT.

La zone MFT est une collection de clusters consécutifs qui sera utilisée en cas de besoin pour élargir le métafichier $MFT. Par défaut 12.5% de l’espace disponible dans le système de fichier est alloué à la zone MFT. Si le reste du système de fichier est rempli, alors la zone MFT sera utilisée pour stocker des fichiers, répertoires de l’utilisateur.

Le pourcentage de l’espace disponible à allouer à la zone MFT peut être augmenté en modifiant la clé de registre HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem\NtfsMftZoneReservation.

Les entrées MFT

Les 16 premières entrées ($MFT entry ou file record) du métafichier $MFT sont réservées aux métafichiers du système de fichier dont on retrouve la liste ci-dessous, y compris le métafichier $MFT lui-même qui occupe la première entrée et dispose d’une adresse file number de 0.

The standard NTFS file system metadata files, file system forensic analysis, Brian carrier

Une entrée du métafichier $MFT peut avoir une taille maximal de 1024 octets mais seulement les 42 premiers octets ont une utilisation défini. Si un fichier est trop volumeux pour être stocké dans une seule entrée $MFT d’une taille maximal d'1ko, alors il sera stocké dans plusieurs entrées $MFT.

Quand des entrées $MFT additionnels sont allouées à un fichier n’étant pas suffisament petit pour être stocké dans une seule entrée, l’entrée $MFT originel devient ce que l’on appelle une entrée BaseMFT. Les entrées additionnels sont alors qualifiées d’entrées non-Base et disposent de l’adresse de la BaseMFT en tant que valeur d’un de leur attributs.

L’entrée BaseMFT elle dispose d’un attribut de type $ATTRIBUTE_LIST qui contient la liste de tous les attributs de l’entrée et dans quelle entrée $MFT on peut les retrouver.

Windows ne supprime pas les entrées $MFT une fois crées. Néamoins, quand le fichier correspondant à une entrée a été supprimé sur disque, cette entrée dans le métafichier $MFT est marquée comme étant non allouée et peut être réutilisée pour attribuer une entrée $MFT à un autre fichier.

Une entrée $MFT est contituée d’attributs et un fichier peut avoir jusqu’a 65563 attributs qui peuvent disposer d’entrées $MFT supplémentaires pour être stockées.

Attributs

Les 42 premiers octets de la structure de donnée d’une entrée MFT contiennent 12 champs structurés et les 982 octets restant sont non structurés et peuvent être remplis d’attributs.

Un attribut est une petite structure de donnée dont le but est de stocker des informations se rapportant à une entrée $MFT comme par exemple le nom d’un fichier, le contenu d’un fichier s’il ne dépasse pas 1ko, l’horodatage….

Les différents attributs qui peuvent être stockés dans les derniers 982 octets d’une entrée $MFT sont les suivants :

Attributes types, file system forensic analysis, Brian carrier

Un attribut peut porter un nom différent du nom de son type. Par exemple, un attribut dont le type est nommé $DATA peut avoir un nom propre qui est $DATA, MYDATA, donnée1….

La majorité des entrées $MFT disposent des attributs $FILE_NAME et $STANDARD_INFORMATION qui sont toujours résidents.

L’attribut $FILE_NAME d’une entrée $MFT représentant un fichier va contenir le nom, la taille et des informations temporelles sur le fichier.

L’attribut $STANDARD_INFORMATION contient des informations temporelles, des informations sur le propriétaire du fichier et des information de sécurité (droits). Il est présent pour chaque fichier et dossier car il contient les données nécessaires à la mise en place des droits et des quotas. Il contient aussi l’USN (Update Sequence Number) pour la dernière entrée qui a été crée pour le fichier quand le journal des changements est utilisé. Nous aborderons le journal des changements dans la dernière partie de cet article.

Chaque répertoire dispose d’un attribut $INDEX_ROOT qui contient des informations concernant les fichiers et dossiers le constituant. Dans le cas d’un répertoire ayant beaucoup de contenu, les attributs $INDEX_ALLOCATION et $BITMAP auquels on peut faire référence en utilisant le nom “$l30” sont aussi utilisés pour stocker des informations concernant le contenu du dossier.

Chaque fichier dispose d’une entrée $MFT avec un attribut de type $DATA qui contient le contenu du fichier. Un fichier volumineux peut avoir plusieurs attributs $DATA auquels on fait référence en tant que ADS (Alternate Data Streams). Dans ce cas, le premier attribut $DATA ne dispose pas de nom qui lui est attribué mais les attributs $DATA additionnels (ADS) en disposent.

Par exemple, pour créer un attribut de type $DATA qui va porter le nom ads1 et qui va contenir la donnée “Hello world” dans l’entrée $MFT du fichier fichier.txt, la commande suivante peut être exécutée depuis une invite de commande windows ou powershell:

echo "Hello world" > fichier.txt:ads1

La valeur (Hello world) de l’attribut de type $DATA dont le nom est ads1 ne sera pas visible en visionnant le contenu du fichier mais sera tout de même présent dans le système de fichier. Cette technique peut servir à cacher du contenu malveillant dans l’entrée $MFT d’un fichier légitime. Elle a déja été utilisée dans certaines campagnes de rançongiciels comme BitPaymer mais est maintenant détéctée par la majorité des outils de détection.

Une entrée MFT avec l’identifiant et les noms des attributs, file system forensic analysis, Brian carrier

Adressage des entrées MFT

Chaque entrée du métafichier $MFT est séquentiellement adressée en utilisant une valeur sur 48 bits appelée file number ($MFT entry address) et la première entrée faisant référence au métafichier $MFT lui-même dispose d’une adresse file number de 0.

Chaque entrée $MFT dispose aussi d’une sequence number sur 16 bits qui est incrémentée quand l’entrée est reallouée à un autre fichier.

Une troisième addresse, la file reference auquel NTFS fait référence pour désigner les entrées $MFT est la combinaison de l’adresse de l’entrée $MFT et du sequence Number.

Nature et types d’attributs

Chaque attribut dispose de sa structure de donnée et est constituée d’une entête et d’un contenu. L’entête est standard et générique à tous les attributs mais le contenu est spécifique au type de l’attribut et peut être de n’importe quel taille.

La nature d’un attribut indiqué dans son entête peut être résident ou non résident.

Dans le cas où le contenu d’un attribut est suffisament petit et peut être stocké directement dans une entrée MFT dont la taille ne peut pas dépasser 1ko, alors il est de nature résident et son entête est immédiatement suivi par son contenu.

Un attribut est de nature non résident si la taille de son contenu dépasse 700 octets. Dans ce cas, son contenu n’est pas stocké directement dans une entrée MFT mais dans des clusters externes dans le système de fichier appelés cluster runs. Alors, l’entête de l’attribut qui elle est stockée dans une entrée MFT fournit les adresses des clusters permettant d’accéder à son contenu.

Les cluster runs sont des clusters contigus auxquelles on fait référence en utilisant l’adresse du premier cluster du run et la longueur du run. Par exemple, le contenu d’un attribut étant trop volumineux pour être stocké dans une entrée $MFT et qui se voit attribuer les cluster runs 80,81,82,83,84 et 85 alors, alors on y fera référence en utilisant l’adresse du premier cluster du run qui est 80 et la longueur 6.

Un correspondante virtuel-logique (VNC-LNC) de clusters fait le lien entre les clusters runs attribués au contenu d’un attribut non résident et les clusters réels sur disque permettant d’accéder au contenu de l’attribut non résident car les vrais clusters contenant les données sur disque n’ont pas les mêmes numéros que les clusters runs.

Par exemple, un fichier existant sur disque dont le nom est fichier.txt et dont la taille du contenu ne dépasse pas 1ko aura une entrée correspondante dans le métafichier $MFT. Dans les 982 derniers octets de cette entrée, il y aura au moins un attribut de type $FILE_NAME dont la valeur sera fichier.txt, un attribut de type $DATA dont la valeur sera le contenu du fichier si il est suffisament petit et un attribut de type $STANDARD_INFORMATION qui contiendra des informations temporels, d’appartenance et de droits.

MFT Entry specification, file system forensic analysis, Brian carrier

Attributs de type SPARSE

L’espace nécessaire au stockage d’un fichier peut être réduit en stockant les valeurs des attributs de type $DATA qui sont de nature non résidant d’une manière différente.

Un attribut de type sparse est un attribut pour lequel les clusters qui vont contenir uniquement des zéros (0) ne seront pas alloués sur disque. Au lieu de cela, un run spécial appelé sparse run est créé. Comparé à un cluster run classique qui va contenir l’adresse du premier cluster du run et la longeur du run, un run sparse va contenir uniquement la longeur du run.

Journalisation des transactions et journal des changements

Dans un but d’amélioration de la fiabilité du système de fichier, NTFS maintient un journal des transactions et des changements survenus dans le système de fichier.

Journal des transactions

Le journal des transactions recueille des informations sur les modifications des métadonnées des fichiers et répertoires avant que les changements ne soient réalisés et recueille à nouveau des informations une fois que les changements ont été réalisés. De cette manière, si le système subit un dysfonctionnement avant que le journal des transactions n’ai pu receuillir des informations sur la bonne réalisation des changements, le système d’exploitation peut, en basant sur ce journal, revenir dans un état fonctionnel du système de fichier permettant d’assurer l’intégrité des fichiers et du fait qu’ils n’aient pas étés impactés par le dysfonctionnement.

L’entrée numéro 2 du métafichier $MFT est alloué au journal des transactions qui porte le nom $LogFile. Cette entrée ne dispose pas d’attributs sépcifiques et les données concernant les modifications des métadonnées sont stockés dans l’attribut $DATA.

Journal des changements

Le journal des changements est un métafichier journalisant les différents changements qui sont réalisés sur les fichiers et répertoires. Il est stocké dans le fichier \$Extend\$UsrJrnl (USN Journal) et peut être utilisé pour déterminer quels fichiers ont subit des changements dans un certain laps de temps.

L’entrée $MFT correspondant au métafichier $UsrJrnl est composée de 2 attributs de type $DATA (des ADS (Alternate Data Stram) donc)

l’attribut $MAX contient des informations basiques à propos du journal et l’attribut $J contient le réel journal des changements sous forme d’une liste d’enregistrements.

Chaque enregistrement contient un nom du fichier, la date et l’heure du changement et le type de changement qui a été réalisé (création, supression, renommange… de fichiers) mais pas la donnée qui a changé.

On peut faire le lien entre les entrées du métafichier $MFT et leurs entrées correspondantes dans le journal des changements en utilisant l’USN que l’on retrouve dans l’attribut $STANDARD_INFORMATION de l’entrée $MFT du fichier qui a changé et dans les enregistrements du journal des changements.

Conclusion

Nous avons abordés dans cet article, le fonctionnement du système de fichier NTFS et le fonctionnement interne du métafichier $MFT.

Nous l’avons vu à travers cet article que le métafichier $MFT est d’importance vitale pour le bon fonctionnement du système de fichier mais aussi, au vu des informations qu’il contient, une bonne source de données permettant de recueillir des informations sur les fichiers et répertoires présents dans un système à un instant précis.

Dans le cadre d’une réponse à incident/analyse forensique, en disposant du métafichier $MFT, les fichiers, répertoires, exécutables malveillants… qu’un attaquant aurait pu crééer ou importer sur une machine et à quel moment peuvent potentiellement être identifiés.

Dans un prochain article, nous aborderons l’analyse du métafichier $MFT en utilisant différents outils.

Références

File system forensic analysis, Brian carrier, 2008

The Hitchhicker’s guide to DFIR, 2022

https://learn.microsoft.com/en-us/troubleshoot/windows-server/backup-and-storage/ntfs-reserves-space-for-mft

http://www.c-jump.com/bcc/t256t/Week04NtfsReview/Week04NtfsReview.html#W01_0010_ntfs