
Análisis en profundidad de la confusión de tipos en CLFS de Windows (CVE-2022-24481) con explicación de la causa raíz, flujo de explotación, detalles de los gadgets del kernel y PoC funcional de escalada local de privilegios.
Confusión de tipos
clfs.sys
Debido a que la lógica de validación de rgContainers[0] no es estricta, después de falsificar rgContainers[0], ClientContext se superpone con la estructura ContainerContext. Si los datos falsos son aceptados, después de CloseHandle, CClfsLogFcbPhysical::FlushMetadata restaura los datos de ClientContext.
Después de falsificar rgContainers[0], ClientContext se superpone con la estructura ContainerContext. Si los datos falsos son aceptados, después de CloseHandle, CClfsLogFcbPhysical::FlushMetadata restaura los datos de ClientContext. Debido a que las estructuras se superponen, este proceso cambia ContainerContext->pContainer a los datos falsificados. Finalmente, cuando se llama a CClfsBaseFilePersisted::RemoveContainer, se desencadena una llamada indirecta a una función miembro, se ejecuta un gadget específico y se produce una escalada de privilegios.
createlog crea un nuevo archivo de registro.Container.X:\ que apunte al directorio actual.cbSymbolName_start -> cbSymbolName_end.cbSymbolName_start en X:\N.ContainerContext_start -> New_cbSymbolName_end dentro de ClientContext.rgContainers[0] para que apunte a la nueva ubicación de ContainerContext_start.ContainerContext->pContainer.CClfsLogFcbPhysical::Initialize
00000001C0002EDB almacena los datos de ClientContext.
Después de CloseHandle, se ejecuta CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata.
Copia los datos falsificados de vuelta a ClientContext. Debido a que ClientContext se superpone con ContainerContext, ContainerContext->pContainer se sobrescribe con los datos falsificados.
A continuación, CClfsBaseFilePersisted::RemoveContainer ejecuta nuestro gadget, lo que resulta en una escritura de 16 bytes en una dirección arbitraria.
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) rutina de inicialización para abrir el archivo
bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F
Este código almacena la memoria de ClientContext.

Después de CloseHandle, se ejecuta CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata.
bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46
Esto restaura los datos de ClientContext.

CClfsBaseFilePersisted::RemoveContainer
bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
Usar el puntero de tabla virtual falsificado para alcanzar el gadget.

Ten en cuenta que si el archivo falsificado falla, la apertura del archivo fallará y GetLastError revelará el motivo. En ese caso, el flujo de explotación no puede continuar.
CClfsBaseFilePersisted::RemoveContainer

CLFS!ClfsEarlierLsn
nt!SeSetAccessStateGenericMapping

nt!SeSetAccessStateGenericMapping

movdqu xmmword ptr [rax+8], xmm0 escribe 16 bytes en [rax+8] (XMMWORD, 128 bits).
Después de la ejecución secuencial, el resultado es escribir los 16 bytes de datos desde poi(rdx) 0xFFFFFFFF en poi(poi(rcx+0x48)+0x8).
rcx es la ubicación del puntero de la tabla virtual, y esta ubicación está bajo nuestro control.
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