
Exploit de preuve de concept pour CVE-2024-6768, une vulnérabilité du pilote Windows CLFS.sys provoquant un BSoD via un fichier .BLF contrefait. Comprend le code source et l'analyse technique.
CVE-2024-6768 est une vulnérabilité dans le pilote Common Log File System (CLFS.sys) de Windows, causée par une validation incorrecte des quantités spécifiées dans les données d'entrée. Cette faille conduit à une incohérence irrécupérable, déclenchant la fonction KeBugCheckEx et entraînant un écran bleu de la mort (BSoD). Le problème affecte toutes les versions de Windows 10 et Windows 11, Windows Server 2016, Server 2019 et Server 2022 même avec toutes les mises à jour appliquées. Une preuve de concept (PoC) montre qu'en créant des valeurs spécifiques dans un fichier .BLF, un utilisateur non privilégié peut provoquer un crash système. Les problèmes potentiels incluent l'instabilité du système et le déni de service, car des utilisateurs malveillants peuvent exploiter cette vulnérabilité pour faire planter les systèmes affectés de manière répétée, perturbant les opérations et pouvant entraîner une perte de données.
Lors de mes deux dernières recherches sur le Common Log File System (CLFS), j'ai réussi à obtenir une exécution de code à distance (RCE) dans les deux cas. (Si vous êtes intéressé, voici celle que j'ai faite pour CLFS CVE-2023-28252 et CLFS CVE-2022-37969). Cependant, lorsque j'ai modifié certaines valeurs dans la PoC sur laquelle je travaillais, j'ai observé que cela déclenchait un BSoD sur le système cible. Par conséquent, j'ai décidé de signaler ce problème. Ce document aide à comprendre le BSoD et fournit des conseils sur la façon de le reproduire.
Cette vulnérabilité est produite par une validation incorrecte de la quantité spécifiée en entrée (CWE-1284) qui provoque une incohérence irrécupérable dans le pilote CLFS.sys, forçant un appel à la KeBugCheckEx fonction, ce qui permet à un utilisateur non privilégié de produire un BSoD dans Windows. Dans ce document, j'utilise la version 10.0.19041.3324 de CLFS.sys comme exemple, mais ce problème affecte toutes les versions jusqu'à la dernière version de Windows 10 et Windows 11 avec toutes les mises à jour appliquées.
Score de base : CVSS 4.0 : 6.8 Moyen
Chaîne de vecteur CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Vecteur d'attaque (AV) : Local
Complexité de l'attaque (AC) : Faible
Exigences d'attaque (AT) : Aucune
Privilèges requis (PR) : Faible
Interaction utilisateur (UI) : Aucune
Confidentialité (VC) : Aucune
Intégrité (VI) : Aucune
Disponibilité (VA) : Élevée
Confidentialité (SC) : Aucune
Intégrité (SI) : Aucune
Disponibilité (SA) : Aucune
Après que le système détecte l'état irrécupérable, il appelle la fonction KeBugCheckEx qui conduit à un BSoD comme décrit par Microsoft dans cet article : https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-kebugcheckex.

CClfsLogFcbPhysical::FlushLog+6F2 est l'adresse dans CLFS.sys version 10.0.19041.3324 où l'appel à KeBugCheckEx est produit :
CClfsLogFcbPhysical::FlushLog+6D5
CClfsLogFcbPhysical::FlushLog+6D5 loc_FFFFF8062EED4F35: ; BugCheckParameter2
CClfsLogFcbPhysical::FlushLog+6D5 mov r8d, eax
CClfsLogFcbPhysical::FlushLog+6D8 and [rsp+0A8h+Timeout], 0
CClfsLogFcbPhysical::FlushLog+6DE mov r9, rbx ; BugCheckParameter3
CClfsLogFcbPhysical::FlushLog+6E1 mov edx, 3Ah ; ':' ; BugCheckParameter1
CClfsLogFcbPhysical::FlushLog+6E6 mov ecx, 0C1F5h ; BugCheckCode
CClfsLogFcbPhysical::FlushLog+6EB mov r10, cs:__imp_KeBugCheckEx
CClfsLogFcbPhysical::FlushLog+6F2 call near ptr nt_KeBugCheckEx
Pour commencer l'analyse, il est nécessaire de connaître le format de fichier .BLF, qui est géré par le pilote vulnérable Common Log File System appelé CLFS.sys situé dans le dossier %windir%\system32. Pour en savoir plus, consultez la section des références à la fin de cet article.
Dans notre dépôt de preuve de concept, le fichier 54.blf contient une valeur modifiée (0xffffffff00ff01) à l'offset 0x1c10.

Cette valeur modifiée se trouve à l'offset 0x38 de la structure _CLFS_CLIENT_CONTEXT, elle est copiée dans CClfsLogFcbPhysical::Initialize à l'offset 0x538 de la structure CClfsLogFcbPhysical.

La zone marquée en bleu ci-dessous qui commence par cidNode = 0xC1FDF006 est la structure CLFSHASHSYM

Après cela, commençant par cidNode == 0xC1FDF007 se trouve la structure _CLFS_CLIENT_CONTEXT
À l'offset 0x38 se trouve le champ lsnOwnerPage qui sera rempli avec la valeur modifiée 0xffffffff00ff01 :
struct _CLFS_CLIENT_CONTEXT
{
CLFS_NODE_ID cidNode;
CLFS_CLIENT_ID cidClient;
USHORT fAttributes;
ULONG cbFlushThreshold;
ULONG cShadowSectors;
ULONGLONG cbUndoCommitment;
LARGE_INTEGER llCreateTime;
LARGE_INTEGER llAccessTime;
LARGE_INTEGER llWriteTime;
*CLFS_LSN **lsnOwnerPage; ***// offset 0x38
CLFS_LSN lsnArchiveTail;
CLFS_LSN lsnBase;
CLFS_LSN lsnLast;
CLFS_LSN lsnRestart;
CLFS_LSN lsnPhysicalBase;
CLFS_LSN lsnUnused1;
CLFS_LSN lsnUnused2;
CLFS_LOG_STATE eState;
union
{
HANDLE hSecurityContext;
ULONGLONG ullAlignment;
};
};
Lorsque la PoC est exécutée, elle modifie la valeur de lsnOwnerPage, appelle CreateLogFile et la valeur mentionnée est utilisée dans UpdateCachedOwnerPage comme on le voit dans la pile d'appels ci-dessous :

C'est l'adresse où la PoC appelle CreateLogFile et la valeur modifiée commence à être utilisée :



À l'intérieur de AddLsnOffset retourne un ulloffset calculé à partir de cette valeur modifiée :

Le ulloffset retourné est 0xFFFFFFFF00000000

Après cela, cette valeur est comparée et la fonction CClfsLogFcbPhysical::UpdateCachedOwnerPage se termine

Ensuite, cela retourne à la PoC en mode utilisateur, et lorsqu'elle se termine, elle appelle CClfsLogFcbPhysical::FlushLog lorsque le ulloffset modifié d'origine est utilisé

Ceci est comparé dans une boucle et, si ce n'est pas égal dans un cycle, comme le système est dans un état irrécupérable, il appelle KeBugCheck qui produit un BSoD pour redémarrer le système :


Vous pouvez trouver la PoC fonctionnelle avec les sources et le BLF modifié sur le GitHub de Fortra.
J'espère que cela vous sera utile. Veuillez contacter [email protected] pour toute question.
Références Common Log File System (CLFS) :