
CVE-2024-6768 ist eine Schwachstelle im Common Log File System (CLFS.sys)-Treiber von Windows, die durch eine unzureichende Validierung der angegebenen Mengen in Eingabedaten verursacht wird. Dieser Fehler führt zu einer nicht behebbaren Inkonsistenz, die die Funktion KeBugCheckEx auslöst und einen Blue Screen of Death (BSoD) zur Folge hat. Das Problem betrifft alle Versionen von Windows 10 und Windows 11, Windows Server 2016, Server 2019 und Server 2022, selbst wenn alle Updates installiert sind. Ein Proof of Concept (PoC) zeigt, dass ein nicht privilegierter Benutzer durch das Erstellen spezifischer Werte in einer .BLF-Datei einen Systemabsturz herbeiführen kann. Zu den potenziellen Problemen gehören Systeminstabilität und Denial-of-Service, da böswillige Benutzer diese Schwachstelle ausnutzen können, um betroffene Systeme wiederholt zum Absturz zu bringen, den Betrieb zu stören und möglicherweise Datenverlust zu verursachen.
In den letzten zwei Forschungsarbeiten zum Common Log File System (CLFS) konnte ich in beiden Fällen eine RCE erreichen. (Falls Sie interessiert sind, hier ist die Arbeit zu CLFS CVE-2023-28252 und CLFS CVE-2022-37969). Als ich jedoch einige Werte in dem PoC, an dem ich arbeitete, modifizierte, beobachtete ich, dass dies einen BSoD auf dem Zielsystem auslöste. Folglich entschied ich mich, dieses Problem zu melden. Dieses Dokument hilft, den BSoD zu verstehen und gibt Anleitungen, wie man ihn reproduzieren kann.
Diese Schwachstelle wird durch eine unzureichende Validierung der angegebenen Menge in der Eingabe (CWE-1284) verursacht, was zu einer nicht behebbaren Inkonsistenz im CLFS.sys-Treiber führt und einen Aufruf der KeBugCheckEx-Funktion erzwingt, wodurch ein nicht privilegierter Benutzer einen BSoD in Windows auslösen kann. In diesem Dokument verwende ich CLFS.sys Version 10.0.19041.3324 als Beispiel, aber dieses Problem betrifft alle Versionen bis zur neuesten Version von Windows 10 und Windows 11 mit allen installierten Updates.
Basiswert: CVSS 4.0: 6.8 Mittel
Vektorzeichenfolge 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
Angriffsvektor (AV): Lokal
Angriffskomplexität (AC): Niedrig
Angriffsanforderungen (AT): Keine
Erforderliche Privilegien (PR): Niedrig
Benutzerinteraktion (UI): Keine
Vertraulichkeit (VC): Keine
Integrität (VI): Keine
Verfügbarkeit (VA): Hoch
Vertraulichkeit (SC): Keine
Integrität (SI): Keine
Verfügbarkeit (SA): Keine
Nachdem das System den nicht behebbaren Zustand erkannt hat, ruft es die KeBugCheckEx-Funktion auf, die zu einem BSoD führt, wie von Microsoft in diesem Artikel beschrieben: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-kebugcheckex.

CClfsLogFcbPhysical::FlushLog+6F2 ist die Adresse in CLFS.sys Version 10.0.19041.3324, an der der Aufruf von KeBugCheckEx erfolgt:
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
Um mit der Analyse zu beginnen, ist es notwendig, das .BLF-Dateiformat zu kennen, das von dem anfälligen Common Log File System-Treiber namens CLFS.sys verarbeitet wird, der sich im Ordner %windir%\system32 befindet. Weitere Informationen dazu finden Sie im Referenzabschnitt am Ende dieses Artikels.
In unserem Proof-of-Concept-Repository enthält die Datei 54.blf einen manipulierten Wert (0xffffffff00ff01) an Offset 0x1c10.

Dieser manipulierte Wert befindet sich an Offset 0x38 der Struktur _CLFS_CLIENT_CONTEXT und wird in CClfsLogFcbPhysical::Initialize an Offset 0x538 der Struktur CClfsLogFcbPhysical kopiert.

Die unten blau markierte Zone, die mit cidNode = 0xC1FDF006 beginnt, ist die Struktur CLFSHASHSYM.

Danach, beginnend mit cidNode == 0xC1FDF007, befindet sich die Struktur _CLFS_CLIENT_CONTEXT.
An Offset 0x38 befindet sich das Feld lsnOwnerPage, das mit dem manipulierten Wert 0xffffffff00ff01 gefüllt wird:
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;
};
};
Wenn der PoC ausgeführt wird, manipuliert er den Wert von lsnOwnerPage, ruft CreateLogFile auf, und der genannte Wert wird in UpdateCachedOwnerPage verwendet, wie im folgenden Aufrufstapel zu sehen ist:




Innerhalb von AddLsnOffset wird ein ulloffset zurückgegeben, der aus diesem manipulierten Wert berechnet wurde:

Der zurückgegebene ulloffset ist 0xFFFFFFFF00000000

Danach wird dieser Wert verglichen und die Funktion CClfsLogFcbPhysical::UpdateCachedOwnerPage wird beendet.

Danach kehrt er zum PoC im Benutzermodus zurück, und wenn er beendet wird, ruft er CClfsLogFcbPhysical::FlushLog auf, wenn der ursprüngliche manipulierte ullofset verwendet wird.

Dies wird in einer Schleife verglichen, und wenn es in keinem Zyklus gleich ist, ruft es, da sich das System in einem nicht behebbaren Zustand befindet, KeBugCheck auf, was einen BSoD erzeugt, um das System neu zu starten:


Sie finden den funktionalen PoC mit Quellen und manipulierter BLF auf Fortras GitHub.
Ich hoffe, es ist nützlich. Bei Fragen wenden Sie sich bitte an [email protected].
Common Log File System (CLFS) References: