
Exploit de prueba de concepto para CVE-2024-6768, una vulnerabilidad del controlador Windows CLFS.sys que provoca BSoD mediante un archivo .BLF manipulado. Incluye código fuente y análisis técnico.
CVE-2024-6768 es una vulnerabilidad en el controlador del sistema de archivos de registro común (CLFS.sys) de Windows, causada por una validación incorrecta de las cantidades especificadas en los datos de entrada. Este defecto provoca una inconsistencia irrecuperable, desencadenando la función KeBugCheckEx y dando lugar a una pantalla azul de la muerte (BSoD). El problema afecta a todas las versiones de Windows 10 y Windows 11, Windows Server 2016, Server 2019 y Server 2022 incluso con todas las actualizaciones aplicadas. Una prueba de concepto (PoC) muestra que al modificar valores específicos dentro de un archivo .BLF, un usuario sin privilegios puede inducir un bloqueo del sistema. Los problemas potenciales incluyen inestabilidad del sistema y denegación de servicio, ya que usuarios maliciosos pueden explotar esta vulnerabilidad para bloquear repetidamente los sistemas afectados, interrumpiendo las operaciones y potencialmente causando pérdida de datos.
En las dos últimas investigaciones sobre el sistema de archivos de registro común (CLFS), pude lograr RCE en ambos casos. (Si estás interesado, aquí está el que hice para CLFS CVE-2023-28252 y CLFS CVE-2022-37969). Sin embargo, cuando modifiqué algunos valores en la PoC en la que estaba trabajando, observé que desencadenaba un BSoD en el sistema de destino. En consecuencia, decidí reportar este problema. Este documento ayuda a entender el BSoD y proporciona orientación sobre cómo reproducirlo.
Esta vulnerabilidad se produce por una validación incorrecta de la cantidad especificada en la entrada (CWE-1284)
lo que causa una inconsistencia irrecuperable en el controlador CLFS.sys, forzando una llamada a la función KeBugCheckEx, lo que permite a un usuario sin privilegios producir un BSoD en Windows. En este documento, estoy usando CLFS.sys versión 10.0.19041.3324 como ejemplo, pero este problema afecta a todas las versiones hasta la última versión de Windows 10 y Windows 11 con todas las actualizaciones aplicadas.
Puntuación base: CVSS 4.0: 6.8 Medio
Cadena de vector 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
Vector de ataque (AV): Local
Complejidad del ataque (AC): Baja
Requisitos del ataque (AT): Ninguno
Privilegios requeridos (PR): Bajos
Interacción del usuario (UI): Ninguna
Confidencialidad (VC): Ninguna
Integridad (VI): Ninguna
Disponibilidad (VA): Alta
Confidencialidad (SC): Ninguna
Integridad (SI): Ninguna
Disponibilidad (SA): Ninguna
Después de que el sistema detecta el estado irrecuperable, llama a la función KeBugCheckEx lo que conduce a un BSoD como se describe en este artículo de Microsoft: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-kebugcheckex.

CClfsLogFcbPhysical::FlushLog+6F2 es la dirección en CLFS.sys versión 10.0.19041.3324 donde se produce la llamada a 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
Para comenzar el análisis, es necesario conocer el formato del archivo .BLF, que es manejado por el controlador vulnerable del sistema de archivos de registro común llamado CLFS.sys ubicado en la carpeta %windir%\system32. Para obtener más información sobre esto, consulta la sección de referencias al final de este artículo.
En nuestro repositorio de prueba de concepto, el archivo 54.blf tiene un valor manipulado (0xffffffff00ff01) en el offset 0x1c10.

Este valor manipulado está en el offset 0x38 de la estructura _CLFS_CLIENT_CONTEXT, se copia en CClfsLogFcbPhysical::Initialize al offset 0x538 de la estructura CClfsLogFcbPhysical.

La zona marcada en azul a continuación comienza con cidNode = 0xC1FDF006 es la estructura CLFSHASHSYM

Después de eso, comenzando con cidNode == 0xC1FDF007 se encuentra la estructura _CLFS_CLIENT_CONTEXT
En el offset 0x38 está el campo lsnOwnerPage que se llenará con el valor manipulado 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;
};
};
Cuando se ejecuta la PoC, manipula el valor de lsnOwnerPage, llama a CreateLogFile y el valor mencionado se utiliza en UpdateCachedOwnerPage como se ve en la pila de llamadas a continuación:

Esta es la dirección donde la PoC llama a CreateLogFile y el valor manipulado comienza a ser utilizado:



Dentro de AddLsnOffset devuelve un ulloffset calculado a partir de este valor manipulado:

El ulloffset devuelto es 0xFFFFFFFF00000000

Después de eso, este valor se compara y sale de la función CClfsLogFcbPhysical::UpdateCachedOwnerPage

Después de eso, regresa a la PoC en modo usuario, y cuando sale llama a CClfsLogFcbPhysical::FlushLog cuando se utiliza el ulloffset original manipulado

Esto se compara en un bucle y, si no es igual en ningún ciclo, como el sistema está en un estado irrecuperable, llama a KeBugCheck que produce un BSoD para reiniciarse:


Puedes encontrar la PoC funcional con fuentes y BLF manipulado en el GitHub de Fortra.
Espero que te sea útil. Por favor, contacta a [email protected] con cualquier pregunta.
Referencias del sistema de archivos de registro común (CLFS):