
CVE-2024-6768 — это уязвимость в драйвере Common Log File System (CLFS.sys) Windows, вызванная некорректной проверкой указанных количеств во входных данных. Этот дефект приводит к невосстановимому противоречию, которое запускает функцию KeBugCheckEx и приводит к синему экрану смерти (BSoD). Проблема затрагивает все версии Windows 10 и Windows 11, Windows Server 2016, Server 2019 и Server 2022, несмотря на все установленные обновления. Концепт-эксплойт (PoC) показывает, что, подобрав определённые значения в файле .BLF, непривилегированный пользователь может вызвать крах системы. К потенциальным проблемам относятся нестабильность системы и отказ в обслуживании, поскольку злоумышленники могут использовать эту уязвимость, чтобы многократно вызывать крах затронутых систем, нарушая их работу и потенциально приводя к потере данных.
В двух моих последних исследованиях Common Log File System (CLFS) мне удалось достичь RCE в обоих случаях. (Если вам интересно, вот мои работы по CLFS CVE-2023-28252 и CLFS CVE-2022-37969). Однако, когда я изменил некоторые значения в PoC, над которым работал, я заметил, что это вызвало BSoD на целевой системе. В связи с этим я решил сообщить об этой проблеме. Этот документ помогает понять причины BSoD и содержит рекомендации по его воспроизведению.
Эта уязвимость вызвана некорректной проверкой указанного количества во входных данных (CWE-1284)
которая вызывает невосстановимое противоречие в драйвере CLFS.sys, приводящее к принудительному вызову функции KeBugCheckEx, что позволяет непривилегированному пользователю вызвать BSoD в Windows. В этом документе в качестве примера я использую CLFS.sys версии 10.0.19041.3324, но эта проблема затрагивает все версии вплоть до последней версии Windows 10 и Windows 11 со всеми установленными обновлениями.
Базовый балл: CVSS 4.0: 6.8 средний
Векторная строка 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
Вектор атаки (AV): локальный
Сложность атаки (AC): низкая
Требования к атаке (AT): отсутствуют
Требуемые привилегии (PR): низкие
Взаимодействие с пользователем (UI): отсутствует
Конфиденциальность (VC): отсутствует
Целостность (VI): отсутствует
Доступность (VA): высокая
Конфиденциальность (SC): отсутствует
Целостность (SI): отсутствует
Доступность (SA): отсутствует
Когда система обнаруживает невосстановимое состояние, она вызывает функцию KeBugCheckEx, что приводит к BSoD, как описано Microsoft в этой статье: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-kebugcheckex.

CClfsLogFcbPhysical::FlushLog+6F2 — это адрес в CLFS.sys версии 10.0.19041.3324, по которому происходит вызов KeBugCheckEx:
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
Чтобы приступить к анализу, необходимо знать формат файла .BLF, который обрабатывается уязвимым драйвером Common Log File System — CLFS.sys, расположенным в папке %windir%\system32. Чтобы узнать больше об этом, обратитесь к разделу «Ссылки» в конце этой статьи.
В нашем репозитории с концепт-эксплойтом файл 54.blf содержит специально сформированное значение (0xffffffff00ff01) по смещению 0x1c10.

Это специально сформированное значение находится по смещению 0x38 структуры _CLFS_CLIENT_CONTEXT; оно копируется в CClfsLogFcbPhysical::Initialize в смещение 0x538 структуры CClfsLogFcbPhysical.

Область, выделенная синим цветом ниже, начинающаяся с cidNode = 0xC1FDF006, представляет собой структуру CLFSHASHSYM

Затем, начиная с cidNode == 0xC1FDF007, расположена структура _CLFS_CLIENT_CONTEXT
По смещению 0x38 находится поле lsnOwnerPage, которое будет заполнено специально сформированным значением 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;
};
};
При выполнении PoC формируется значение lsnOwnerPage, вызывается CreateLogFile, и упомянутое значение используется в UpdateCachedOwnerPage, как показано в стеке вызовов ниже:

Это адрес, по которому PoC вызывает CreateLogFile, и с этого момента специально сформированное значение начинает использоваться:



Внутри AddLsnOffset возвращается ulloffset, вычисленный на основе этого специально сформированного значения:

Возвращаемое значение ulloffset равно 0xFFFFFFFF00000000

После этого значение сравнивается, и происходит выход из функции CClfsLogFcbPhysical::UpdateCachedOwnerPage

После этого управление возвращается к PoC в пользовательском режиме, а при выходе вызывается CClfsLogFcbPhysical::FlushLog, когда используется исходное специально сформированное ullofset

Это значение сравнивается в цикле, и если ни на одной итерации оно не совпадает, то, поскольку система находится в невосстановимом состоянии, вызывается KeBugCheck, что приводит к BSoD и перезапуску системы:


Функциональный PoC с исходными кодами и специально сформированным BLF-файлом можно найти в репозитории Fortra на GitHub.
Надеюсь, это окажется полезным. По любым вопросам обращайтесь по адресу [email protected].
Ссылки по Common Log File System (CLFS):