Akamai übernimmt LayerX, um die Kontrolle der KI-Nutzung in jedem Browser durchzusetzen. Weitere Informationen

Untersuchung der Lösung: KI-gestützte Ursachenanalyse von CVE-2025-60719

Maor Dahan

Dec 08, 2025

Maor Dahan

Maor Dahan

Verfasser

Maor Dahan

Maor Dahan is a Senior Security Researcher at Akamai with more than a decade of experience in the cybersecurity industry. He specializes in operating system internals, vulnerability research, and malware analysis. Maor also has extensive experience designing and developing advanced detection and prevention mechanisms for innovative security products such as EDR, EPP, and virtualization-based security.

Teilen

Zusammenfassung

Die Forscher von Akamai haben eine neue KI-Funktion für die sofortige Ursachenanalyse entwickelt. Das Tool ist ein überwachtes Multi-Agent-System und wurde PatchDiff-AI genannt. In diesem Blogbeitrag verwenden wir es für eine tiefgreifende Analyse von CVE-2025-60719, die fast alle Windows-Versionen betrifft. 

  • Die Schwachstelle: Es handelt sich um eine UAF-Sicherheitsanfälligkeit (Use-After-Free) im Windows-Treiber für Zusatzfunktionen (afd.sys) für WinSock, die durch eine Race-Bedingung verursacht wird.

  • Auswirkungen: Lokale Berechtigungseskalation; ein Angreifer mit niedrigen Berechtigungen kann den Kernelspeicher manipulieren und Systemberechtigungen erhalten

  • Hauptursache: Der Treiber konnte nicht verhindern, dass ein Socket-Endpunkt ungebunden (freigegeben) wird, während andere Vorgänge (wie Transfer, GetInformation, oder Connect) aktiv die Dereferenzierung der zugehörigen Objekte durchführten.

  • Die Lösung: Microsoft hat einen Synchronisationsbarrieremechanismus (AfdPreventUnbind / AfdReallowUnbind) hinzugefügt, um den Endpunktstatus bei kritischen Vorgängen explizit zu sperren.

Lesen Sie weiter, um zu erfahren, wie das Tool PatchDiff-AI verwendet werden kann, um die Ursache einer Patch-Tuesday-Schwachstelle mit potenziell großen Auswirkungen schnell zu analysieren und Sicherheitsteams in die Lage zu versetzen, Day-One-Schwachstellen besser zu erkennen und abzuwehren.

Die Schwachstelle

CVE-2025-60719 stellt einen erheblichen Fehler im Netzwerk-Stack des Windows-Kernels dar, insbesondere innerhalb von afd.sys, dem Grundpfeiler hinter der Winsock-API. Ein erfolgreicher Exploit ermöglicht einen Prozess mit geringen Berechtigungen, Systemberechtigungen zu erhalten. Wir haben jedoch unseren Exploit innerhalb eines AppContainer-Prozesses getestet, und er scheiterte aufgrund unzureichender Berechtigungen. 

Die Sicherheitslücke betrifft viele Windows-Produkte, einschließlich aller folgenden Windows-Versionen:

  • Windows Server – 2008 SP2 (x86/x64), 2008 R2 SP1, 2012, 2012 R2, 2016, 2019, 2022, 2022 23H2, 2025

  • Windows 11 – 23H2, 24H2, 25H2 

  • Windows 10 – Versionen 1607, 1809, 21H2, 22H2 

  • Andere nicht mehr angebotene Versionen

So ein breites Spektrum betroffener Versionen erhöht die Angriffsfläche erheblich.

Ursachenanalyse

Mit PatchDiff-AI können wir schnell den Sicherheitspatch analysieren, der laut Herstellerhinweis die Schwachstelle behebt. Die Ergebnisse des Tools deuten darauf hin, dass die relevanten Codeänderungen die Methoden AfdSocketTransfer*, AfdGetInformation, AfdBind und AfdConnect umfassen.

Ein genauerer Blick zeigt, dass die Ursache dieser Schwachstelle in der Lebenszyklusverwaltung der AFD-Endpunktstruktur (mit dem Namen AFD_ENDPOINT) und der fehlenden Atomarität (Synchronisierung von gleichzeitigen Vorgängen) zwischen dem Abrufen und dem Verwenden eines Objektzeigers liegt.

Zwischen den Zeilen

Das PatchDiff-AI-Tool hob eine Komponente hervor, die direkt mit der Kernlogik der Schwachstelle in Verbindung steht: Den Treiber für Zusatzfunktionen (afd.sys), der die Windows-Kernunterstützung für Netzwerke auf Transportebene implementiert. Es stellt die Winsock-Schnittstelle bereit, verwaltet Netzwerk-Sockets und kümmert sich um andere I/O-bezogene Funktionalitäten.

Die Tool-Analyse basiert auf der gepatchten Version 10.0.26100.7171 im Rahmen des Sicherheitsupdates KB5068861 und wurde mit der anfälligen Version 10.0.26100.6899 getestet, die Teil des KB5066835-Sicherheitsupdates ist.

Insgesamt gibt es fünf modifizierte Funktionen, die alle vom Tool als sicherheitsrelevant eingestuft wurden.

Durch die Analyse der Funktion AfdGetInformation können wir den Codeblock identifizieren, der jetzt geschützt ist, indem der Vorgang zum Aufheben der Bindung blockiert wird. Dies verhindert, dass der Socket freigegeben wird (Abbildung 1). Da wir wissen, dass sich diese Änderung auf den Socket-Lebenszyklus bezieht und seinen Status beeinträchtigt, können wir ziemlich davon ausgehen, dass dies mit einer UAF-Schwachstelle zusammenhängt.

Durch die Analyse der Funktion AfdGetInformation können wir den Codeblock identifizieren, der jetzt geschützt ist, indem der Vorgang zum Aufheben der Bindung blockiert wird. Dies verhindert, dass der Socket freigegeben wird (Abbildung 1). Abb. 1: BinDiff-Ansicht der gepatchten Funktion afd!AfdGetInformation im Vergleich zur vorherigen Version

Treiber für Zusatzfunktion – Schnellstart

Es gibt einige umfassende Artikel über die Funktionsweise des Treibers für Zusatzfunktionen (afd.sys) und dessen Verwendung. Kurz gesagt ist es eine Windows-Komponente, die für die Bereitstellung der Winsock-API verantwortlich ist. Mit dieser Funktion können Prozesse mit geringer Berechtigungsstufe den Netzwerk-Stack für TCP/IP und andere Kommunikationsprotokolle nutzen.

In Abbildung 2 finden Sie viele Referenzbinärdateien, die afd.sys über Eingabe/Ausgabe-Steuerelemente (IOCTLs) aufrufen. Und wir können nachvollziehen, welcher Aufruf mit welcher Schnittstelle verbunden ist, indem wir die Punkte zwischen den Anwendungsaufrufen im Nutzermodus und der Kernel-Modul-Logikaktivierung verbinden. Das wird uns später helfen, direkte Aufrufe an den Treiber durchzuführen und das Verhalten des Treibers zu debuggen, um Fehler zu finden und zu beheben.

In Abbildung 2 finden Sie viele Referenzbinärdateien, die afd.sys über Eingabe/Ausgabe-Steuerelemente (IOCTLs) aufrufen. Abb. 2: Diagramm der geschichteten Winsock-Architektur (Quelle: https://recon.cx/2015/slides/recon2015-20-steven-vittitoe-Reverse-Engineering-Windows-AFD-sys.pdf)

In die Logik

Die Schwachstelle ist eine klassische Race-Bedingung, die zu einem UAF-Szenario führt. Sie wirkt sich auf mehrere Dispatch-Routinen aus, darunter AfdSocketTransfer*, AfdGetInformation, AfdBind und AfdConnect.

Das Kernproblem tritt auf, wenn eine Anwendung im Nutzermodus eine bestimmte IOCTL-Anfrage ausgibt, während gleichzeitig der Socket in einem separaten Thread geschlossen wird. In der ungepatchten Version hat der Treiber Zeiger auf den Endpunkt, das Dateiobjekt oder das Geräteobjekt abgerufen und verwendet, ohne sicherzustellen, dass der zugrunde liegende Speicher nicht durch den gleichzeitigen Abschlussvorgang freigegeben wurde. Dadurch wurde ein Fenster erstellt, in dem der Kernel auf einem ungültigen Speicher ausgeführt wurde, sodass ein lokaler Angreifer den Kernel-Speicher beschädigen oder erhöhte Berechtigungen erhalten kann.

Wenn ein Prozess die Funktion afd!AfdGetInformation für eine bestimmte Informationsklasse mit einem Handle eines gebundenen Sockets (Listening) aufruft, werden einige erforderliche Bedingungen geprüft, z. B. der Socket-Typ und seine Protokollschicht. Wenn wir dann dem Anrufablauf folgen, können wir feststellen, dass die zugrunde liegende Funktion einen Switch-Case für die verschiedenen Vorgänge hat, die der Anrufer verwenden kann.

Der anfällige Codeblock befindet sich im Case AFD_MAX_PATH_SEND_SIZE (Abbildung 3). Mit anderen Worten, wenn der anfällige Pfad erreicht wird, muss der Anrufer beim Aufrufen der Schnittstelle die richtigen Werte angeben, und der Socket muss sich in einem verbundenen Zustand befinden.

class AFD_INFORMATION_CLASS(IntEnum):
   AFD_INLINE_MODE = 1  # s: BOOLEAN
   AFD_NONBLOCKING_MODE = 2  # s: BOOLEAN
   AFD_MAX_SEND_SIZE = 3  # q: ULONG
   AFD_SENDS_PENDING = 4  # q: ULONG
   AFD_MAX_PATH_SEND_SIZE = 5  # q: ULONG
   AFD_RECEIVE_WINDOW_SIZE = 6  # q; s: ULONG
   AFD_SEND_WINDOW_SIZE = 7  # q; s: ULONG
   AFD_CONNECT_TIME = 8  # q: ULONG (seconds)
   AFD_CIRCULAR_QUEUEING = 9  # s: BOOLEAN
   AFD_GROUP_ID_AND_TYPE = 10  # q: AFD_GROUP_INFO
   AFD_REPORT_PORT_UNREACHABLE = 11  # s: BOOLEAN
   AFD_REPORT_NETWORK_UNREACHABLE = 12  # s: BOOLEAN
   AFD_DELIVERY_STATUS = 14  # q: SIO_DELIVERY_STATUS
   AFD_CANCEL_TL = 15  # s: void
Fig. 3: Enum of the possible classes AfdGetInformation function’s supported

In Abbildung 4 finden Sie eine dekompilierte Version des gefährdeten Codes (vorher) im Vergleich zum gepatchten Code (nachher).

In Abbildung 4 finden Sie eine dekompilierte Version des gefährdeten Codes (vorher) im Vergleich zum gepatchten Code (nachher). Abb. 4: Vor und nach Anwendung des Patches

Die Race-Bedingung

Der afd.sys-Treiber verwaltet den Lebenszyklus des Endpunkts, und es kann von mehreren Threads gleichzeitig auf das Endpunktobjekt zugegriffen werden. In Abbildung 5 stellt m_Endpoint->State den Socket-Status dar. 

Der afd.sys-Treiber verwaltet den Lebenszyklus des Endpunkts, und es kann von mehreren Threads gleichzeitig auf das Endpunktobjekt zugegriffen werden. In Abbildung 5 stellt m_Endpoint->State den Socket-Status dar. Abb. 5: Die Ausführung bedingt auf die Zustände „bound“ und „connected“ beschränken (Zeile 171)

Um den Socket in einem gültigen Status zu halten, sollte das Kernel-Modul ihn mit äußerster Vorsicht behandeln. In diesem Fall gibt es ein Fenster, in dem der Status durch einen anderen Thread geändert, und schließlich der Endpunkt mithilfe des unbind-Befehls vollständig freigegeben werden kann.

Ein lokaler Angreifer kann dies ausnutzen, indem er ein „Rennen“ (engl. Race) zwischen zwei Threads erstellt:

  • Thread A: Sendet wiederholt anfällige IOCTLs (z. B. IOCTL_AFD_GET_INFORMATION)

  • Thread B: Bindet und hebt die Bindung des Socket-Handles wiederholt auf

Wenn Thread B das Rennen gewinnt, nachdem Thread A den Zeiger abgerufen hat, aber bevor Thread A ihn verwendet, wird Thread A den freien Speicher dereferenzieren.

Bis zum Absturz

Anhand des PatchDiff-AI-Berichts und der anderen Ressourcen können wir verstehen, wie die Funktion afd!AfdGetInformation verwendet wird, und sie mit den richtigen Argumenten aufrufen, um das Rennen zu gewinnen (Abbildung 6).

Abb. 6: „Proof of Concept“-Code, der die Schwachstelle auslöst

In Abbildung 7 finden Sie den Aufrufstack des Absturzes, wenn AfdGetInformation aufgerufen wird, bis eine PageFault-Ausnahme vorliegt.

In Abbildung 7 finden Sie den Aufrufstack des Absturzes, wenn AfdGetInformation aufgerufen wird, bis eine PageFault-Ausnahme vorliegt. Abb. 7: Der Call Stack des fehlerauslösenden Ausführungspfads

Angriffsvektor 

Dies ist ein Fehler bei der Eskalation von lokalen Berechtigungen, der sich nur auf das lokale System auswirkt. Ein Angreifer, der beliebigen Code aus einem lokalen Prozess mit geringer Berechtigung ausführen kann, kann die Race-Bedingung ausnutzen und so höhere Berechtigungen erlangen.

Obwohl das PatchDiff-AI-Tool nicht für die Erstellung eines Exploits vorgesehen ist, kann es beim Verständnis des vermeintlichen Exploit-Verfahrens unterstützen.

  • Initialisierung: Der Angreifer öffnet ein gültiges AfdSocket mit NtCreateFile().

  • Grooming/Spraying: Obwohl für den Absturz nicht unbedingt erforderlich, beinhaltet ein zuverlässiger Exploit für EOP oft Heap Spraying, um den freigewordenen AFD_ENDPOINT durch eine vom Angreifer kontrollierte gefälschte Struktur zu ersetzen.

  • Auslösen: Der Angreifer erzeugt zwei Threads. Thread 1 führt eine Schleife in NtDeviceIoControlFile mit der anfälligen IOCTL (z.B. IOCTL_AFD_GET_INFORMATION) aus. Thread 2 führt bei aufeinanderfolgenden IOCTL_AFD_BIND und IOCTL_AFD_UNBIND eine Schleife aus.

  • Ausführung: Wenn das Rennen gewonnen wird, führt der Kernel einen Aufruf (wie IoGetRelatedDeviceObject) auf dem gefälschten Objekt des Angreifers aus, was eine Kernel-Speichermanipulation zur Folge hat.

So sichern Sie Ihr System

  • Den Patch anwenden: Der einzige effektive Schutz besteht darin, das entsprechende Windows-Sicherheitsupdate zu installieren. Der Patch verstärkt afd.sys, indem es die Barriere zum Freigeben strikt durchsetzt.

  • Abwehr: Die Verwendung eines SIGMA- oder YARA-Regelsatzes zum Identifizieren der Interaktion mit AFD, die auf einen Ausnutzungsversuch hinweisen könnte, kann die Bedrohung reduzieren. Das Verfolgen von Prozessen, die IOCTL-Aufrufe an den afd-Treiber initiieren und versuchen, im Kernel-Pool-Speicher mit wiederholten Aufrufen Heap Spraying durchzuführen, sind in den meisten Fällen ausreichend (Abbildung 8).

  • Erkennung: Da der AFD-Endpunkt (Socket) letztendlich über das Windows-I/O-Subsystem als Datei-Handle zugänglich gemacht wird, können wir IRP-Aufrufe abfangen und auf verdächtige Aktivitäten überwachen, insbesondere bei nicht verbundenen Endpunkten.

import "pe"

rule CVE_2025_60719 {
    meta:
        description = "Detects exploits for CVE-2025-60719 targeting afd.sys"
        author      = "Maor Dahan"
        date        = "2025-12-01"
        reference   = "https://github.com/akamai/CVE-2025-60719-AFD.SYS"

    strings:
        // Core Indicators - The specific device name is strong indicator
        $str_device  = "\\Device\\Afd\\Endpoint" ascii wide
	   $str_device_double  = "\\\\Device\\\\Afd\\\\Endpoint" ascii

        
        // Specific IOCTL constants used in the exploit
        // 0x12003 = IOCTL_AFD_BIND
        $ioctl_str_bind = "0x12003" ascii
        $ioctl_hex_bind = { 03 20 01 00 }
        
        // 0x12113 = IOCTL_AFD_UNBIND
        $ioctl_str_unbind = "0x12113" ascii
        $ioctl_hex_unbind = { 13 21 01 00 }
        
        // 0x1207B = IOCTL_AFD_GET_INFORMATION
        $ioctl_str_info = "0x1207B" ascii
        $ioctl_hex_info = { 7B 20 01 00 }

    condition:
        ($str_device or $str_device_double) and 
        (
            (
                pe.is_pe and
                pe.imports("ntdll.dll", "NtDeviceIoControlFile") and
                all of ($ioctl_hex_*)
            )
        or
            (
                not pe.is_pe and
                (
                    (
		       all of ($ioctl_str_*) or
		       3 of ($ioctl_*)
		   )
                )
            )
        )
}
Fig. 8: Sample YARA rule for identifying potential threats, both binaries and scripts

Abschließende Gedanken

Mithilfe von PatchDiff-AI können Sie die Korrelation zwischen Binäränderungen und der Sicherheitslogik automatisieren und so schnell die Ursache ermitteln, ohne dass Sie in irrelevanten Codeänderungen den Überblick verlieren. So können Sicherheitsteams schnell handeln, um Day-One-Exploits zu verhindern. 

In der Fallstudie CVE-2025-60719 wird die Komplexität des Patchmanagements bei Kernel-Treibern hervorgehoben und erläutert, wie die Analyse des Tools PatchDiff-AI aufschlussreiche Details für verschiedene Zwecke liefern kann.

Maor Dahan

Dec 08, 2025

Maor Dahan

Maor Dahan

Verfasser

Maor Dahan

Maor Dahan is a Senior Security Researcher at Akamai with more than a decade of experience in the cybersecurity industry. He specializes in operating system internals, vulnerability research, and malware analysis. Maor also has extensive experience designing and developing advanced detection and prevention mechanisms for innovative security products such as EDR, EPP, and virtualization-based security.

Tags

Teilen

Verwandte Blogbeiträge

Sicherheitsforschung
Analyse schädlicher CrowdStrike-Domains: Wer ist betroffen und was könnte als Nächstes kommen?
Forscher von Akamai untersuchen den Angriffstraffic auf Websites, die angeblich mit der Abwehr oder Unterstützung des CrowdStrike-BSOD-Vorfalls in Verbindung gebracht werden.
Cybersicherheit
Einschätzung von Akamai zum Patch Tuesday im September 2023
Der Patch Tuesday ist zurück, diesmal mit insgesamt 65 CVEs. Zwei waren kritisch, zwei wurden im freien Internet ausgenutzt – und wir sind da, um Sie mit den wichtigsten Infos zu versorgen.
Cybersicherheit
Einschätzung von Akamai zum Patch Tuesday im September 2024
Es gibt keine bessere Möglichkeit, das neue Schuljahr zu beginnen, als mit einer neuen Charge von CVEs – insgesamt 79 CVEs und vier im freien Internet ausgenutzte Schwachstellen.