
Análise aprofundada da confusão de tipos no CLFS do Windows (CVE-2022-24481) com explicação da causa raiz, fluxo de exploração, detalhes de gadgets de kernel e PoC funcional de escalonamento local de privilégios.
Type confusion
clfs.sys
Como a lógica de validação para rgContainers[0] não é estrita, após forjar rgContainers[0], ClientContext se sobrepõe à estrutura ContainerContext. Se os dados falsificados forem aceitos, após CloseHandle, CClfsLogFcbPhysical::FlushMetadata restaura os dados de ClientContext.
Após forjar rgContainers[0], ClientContext se sobrepõe à estrutura ContainerContext. Se os dados falsificados forem aceitos, após CloseHandle, CClfsLogFcbPhysical::FlushMetadata restaura os dados de ClientContext. Como as estruturas se sobrepõem, esse processo altera ContainerContext->pContainer para os dados forjados. Finalmente, quando CClfsBaseFilePersisted::RemoveContainer é chamado, ele dispara uma chamada indireta de função-membro, executa um gadget específico e leva à elevação de privilégio.
createlog cria um novo arquivo de log.
Adicione uma entrada Container.
Crie um link simbólico X:\ que aponte para o diretório atual.
Limpe o intervalo cbSymbolName_start -> cbSymbolName_end.
Defina cbSymbolName_start como X:\N.
Copie os dados em ContainerContext_start -> New_cbSymbolName_end para ClientContext.
Atualize rgContainers[0] para que aponte para o novo local de ContainerContext_start.
Atualize o novo valor de ContainerContext->pContainer.
Recalcule a soma de verificação.
Localize o endereço do gadget na memória do kernel.
Construa a tabela virtual falsa.
Execute a configuração de memória restante.
CClfsLogFcbPhysical::Initialize
00000001C0002EDB armazena os dados de ClientContext.
Após CloseHandle, CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata é executado.
Ele copia os dados forjados de volta para ClientContext. Como ClientContext se sobrepõe a ContainerContext, ContainerContext->pContainer é sobrescrito com os dados forjados.
CClfsBaseFilePersisted::RemoveContainer então executa nosso gadget, resultando em uma escrita de 16 bytes em um endereço arbitrário.
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
Rotina de inicialização CClfsLogFcbPhysical::Initialize(0x??7c) para abrir o arquivo
bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F
Este código armazena a memória de ClientContext.

Após CloseHandle, CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata é executado.
bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46
Isso restaura os dados de ClientContext.

CClfsBaseFilePersisted::RemoveContainer
bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
Use o ponteiro da tabela virtual forjada para alcançar o gadget.

Observe que, se o arquivo forjado falhar, a abertura do arquivo falhará e GetLastError revelará o motivo. Nesse caso, o fluxo de exploração não pode continuar.
CClfsBaseFilePersisted::RemoveContainer

CLFS!ClfsEarlierLsn
nt!SeSetAccessStateGenericMapping

nt!SeSetAccessStateGenericMapping

movdqu xmmword ptr [rax+8], xmm0 grava 16 bytes em [rax+8] (XMMWORD, 128 bits).
Após a execução sequencial, o resultado é gravar os dados de 16 bytes de poi(rdx) 0xFFFFFFFF em poi(poi(rcx+0x48)+0x8).
rcx é o local do ponteiro da tabela virtual, e esse local está sob nosso controle.
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