
Analyse approfondie de la confusion de type CLFS de Windows (CVE-2022-24481) avec explication de la cause racine, déroulement de l'exploitation, détails des gadgets du noyau et PoC fonctionnel d'élévation de privilèges locaux.
Confusion de type
clfs.sys
Parce que la logique de validation de rgContainers[0] n'est pas stricte, après avoir forgé rgContainers[0], ClientContext chevauche la structure ContainerContext. Si les données forgées sont acceptées, après CloseHandle, CClfsLogFcbPhysical::FlushMetadata restaure les données ClientContext.
Après avoir forgé rgContainers[0], ClientContext chevauche la structure ContainerContext. Si les données forgées sont acceptées, après CloseHandle, CClfsLogFcbPhysical::FlushMetadata restaure les données ClientContext. En raison du chevauchement des structures, ce processus modifie ContainerContext->pContainer pour pointer vers les données forgées. Enfin, lorsque CClfsBaseFilePersisted::RemoveContainer est appelé, cela déclenche un appel indirect de fonction membre, exécute un gadget spécifique et mène à une élévation de privilèges.
createlog crée un nouveau fichier journal.
Ajoutez une entrée Container.
Créez un lien symbolique X:\ pointant vers le répertoire courant.
Effacez la plage cbSymbolName_start -> cbSymbolName_end.
Définissez cbSymbolName_start sur X:\N.
Copiez les données de ContainerContext_start -> New_cbSymbolName_end dans ClientContext.
Mettez à jour rgContainers[0] pour qu'il pointe vers le nouvel emplacement ContainerContext_start.
Mettez à jour la nouvelle valeur ContainerContext->pContainer.
Recalculez la somme de contrôle.
Localisez l'adresse du gadget dans la mémoire du noyau.
Construisez la table virtuelle factice.
Effectuez la configuration mémoire restante.
CClfsLogFcbPhysical::Initialize
00000001C0002EDB stocke les données ClientContext.
Après CloseHandle, CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata s'exécute.
Il copie les données forgées dans ClientContext. Comme ClientContext chevauche ContainerContext, ContainerContext->pContainer est écrasé avec les données forgées.
CClfsBaseFilePersisted::RemoveContainer exécute ensuite notre gadget, ce qui entraîne une écriture de 16 octets vers une adresse arbitraire.
https://zhuanlan.zhihu.com/p/645490730
https://github.com/fr4nkxixi/CVE-2022-24481-POC
https://securelist.com/windows-clfs-exploits-ransomware-cve-2022-24521/111580/
https://starmap.dbappsecurity.com.cn/blog/articles/2022/05/10/cve-2022-24481/
https://www.4awl.net/9646.html
win10_21H2_19044.1620
CClfsLogFcbPhysical::Initialize(0x??7c) routine d'initialisation pour l'ouverture du fichier
bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F
Ce code stocke la mémoire ClientContext.

Après CloseHandle, CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata est exécuté.
bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46
Cela restaure les données ClientContext.

CClfsBaseFilePersisted::RemoveContainer
bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
Utilisez le pointeur de table virtuelle forgée pour atteindre le gadget.

Notez que si le fichier forgé est invalide, l'ouverture du fichier échouera et GetLastError révélera la raison. Dans ce cas, le déroulement de l'exploitation ne peut pas continuer.
CClfsBaseFilePersisted::RemoveContainer

CLFS!ClfsEarlierLsn
nt!SeSetAccessStateGenericMapping

nt!SeSetAccessStateGenericMapping

movdqu xmmword ptr [rax+8], xmm0 écrit 16 octets dans [rax+8] (XMMWORD, 128 bits).
Après exécution séquentielle, le résultat est d'écrire les données de 16 octets de poi(rdx) 0xFFFFFFFF dans poi(poi(rcx+0x48)+0x8).
rcx est l'emplacement du pointeur de table virtuelle, et cet emplacement est sous notre contrôle.
https://github.com/uname1able/CVE-2022-24481.git
winver
win10_21H2_19044.1620

bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
winver
win11_21H2_22000.593

bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x183