
Глубокий анализ ошибки type confusion в Windows CLFS (CVE-2022-24481) с объяснением первопричины, схемой эксплуатации, деталями kernel-гаджетов и рабочим PoC для локального повышения привилегий.
Путаница типов
clfs.sys
Поскольку логика проверки для rgContainers[0] не является строгой, после подделки rgContainers[0] структура ClientContext перекрывается со структурой ContainerContext. Если поддельные данные принимаются, после CloseHandle функция CClfsLogFcbPhysical::FlushMetadata восстанавливает данные ClientContext.
После подделки rgContainers[0] структура ClientContext перекрывается со структурой ContainerContext. Если поддельные данные принимаются, после CloseHandle функция CClfsLogFcbPhysical::FlushMetadata восстанавливает данные ClientContext. Из-за перекрытия структур этот процесс изменяет ContainerContext->pContainer на поддельные данные. Наконец, при вызове CClfsBaseFilePersisted::RemoveContainer инициируется косвенный вызов функции-члена, который выполняет определённый гаджет и приводит к повышению привилегий.
createlog создаёт новый файл журнала.
Добавьте запись Container.
Создайте символическую ссылку X:\, указывающую на текущий каталог.
Очистите диапазон cbSymbolName_start -> cbSymbolName_end.
Установите cbSymbolName_start в X:\N.
Скопируйте данные из ContainerContext_start -> New_cbSymbolName_end в ClientContext.
Обновите rgContainers[0], чтобы он указывал на новое расположение ContainerContext_start.
Обновите новое значение ContainerContext->pContainer.
Пересчитайте контрольную сумму.
Найдите адрес гаджета в памяти ядра.
Постройте поддельную виртуальную таблицу.
Выполните оставшуюся настройку памяти.
CClfsLogFcbPhysical::Initialize
00000001C0002EDB хранит данные ClientContext.
После CloseHandle выполняется CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata.
Он копирует поддельные данные обратно в ClientContext. Поскольку ClientContext перекрывается с ContainerContext, ContainerContext->pContainer перезаписывается поддельными данными.
Затем CClfsBaseFilePersisted::RemoveContainer выполняет наш гаджет, что приводит к 16-байтовой записи по произвольному адресу.
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) — процедура инициализации при открытии файла
bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F
Этот код сохраняет память ClientContext.

После CloseHandle выполняется CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata.
bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46
Это восстанавливает данные ClientContext.

CClfsBaseFilePersisted::RemoveContainer
bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
Используйте указатель поддельной виртуальной таблицы, чтобы достичь гаджета.

Обратите внимание, что если поддельный файл окажется недействительным, открытие файла завершится ошибкой, и GetLastError покажет причину. В этом случае ход эксплуатации не может продолжаться.
CClfsBaseFilePersisted::RemoveContainer

CLFS!ClfsEarlierLsn
nt!SeSetAccessStateGenericMapping

nt!SeSetAccessStateGenericMapping

movdqu xmmword ptr [rax+8], xmm0 записывает 16 байт по адресу [rax+8] (XMMWORD, 128 бит).
После последовательного выполнения результат заключается в записи 16-байтовых данных из poi(rdx) 0xFFFFFFFF в poi(poi(rcx+0x48)+0x8).
rcx — это местонахождение указателя виртуальной таблицы, и это место находится под нашим контролем.
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