
CVE-2026-42978 — Use-After-Free-Race-Condition in Windows Push Notifications (WpnService). Patch-Diff, Root-Cause-Analyse, TOCTOU-Labor, Sysmon/ETW-Erkennungsregeln.
Race-Condition im Windows-Pushbenachrichtigungsdienst (WpnService), der als NT AUTHORITY\SYSTEM läuft. Ein Angreifer mit lokalem Zugriff kann während des Herunterfahrens der Plattform eine Use-After-Free auslösen und möglicherweise Privilegien erweitern.
WpnService ist der Windows-Pushbenachrichtigungsdienst. Er läuft in Session 0 als LocalSystem innerhalb von svchost.exe -k netsvcs -p. Die gesamte Zustellung von Benachrichtigungen – Toasts, Kacheln, Badges – erfolgt über ihn.
Die Schwachstelle befindet sich in wpncore.dll, genauer gesagt in der Klasse PresentationEndpointFacade. Diese Klasse kapselt alle API-Aufrufe für Benachrichtigungen (Toast-Zustellung, Sitzungsverwaltung, Einstellungsabfragen usw.) und delegiert an PresentationEndpointImpl.
Der Fehler: Während des Herunterfahrens der Plattform wird das NotificationPlatform-Objekt zerstört. Die Facade-Methoden prüfen jedoch nicht, ob ein Herunterfahren im Gange ist – sie greifen auf einen Zeiger auf die Plattform zu, die Plattform wird vom Herunterfahr-Thread freigegeben, und die Facade verwendet einen hängenden Zeiger. Klassischer Use-After-Free-Race.
// PresentationEndpointFacade::ToastUnblockAll — VULNERABLE
long ToastUnblockAll(PresentationEndpointFacade *this) {
// No lock. No shutdown check. Just grab the platform pointer and go.
NotificationPlatformHandle::Get(this + 0x50);
if (platform == NULL) Throw_Hr(...);
// If shutdown frees the platform right here — use-after-free
return PresentationEndpointImpl::UnblockToastsForEachApp(...);
}
Ghidra: angreifbare ToastUnblockAll — keine Synchronisation vor dem Zugriff auf die Plattform
// PresentationEndpointFacade::ToastUnblockAll — PATCHED
long ToastUnblockAll(PresentationEndpointFacade *this) {
if (Feature_4097557817::IsEnabled()) {
AcquireSRWLockShared(&Wns::s_platformLock); // 1. shared lock
if (Wns::s_platformShutdown) // 2. shutdown guard
Throw_Hr(E_APPLICATION_EXITING);
NotificationPlatformHandle::Get(this + 0x50);
// ... do work ...
ReleaseSRWLockShared(&Wns::s_platformLock); // 3. RAII release
} else {
// feature flag off — old behavior preserved for rollback
}
}
Die Behebung fügt drei Dinge hinzu:
AcquireSRWLockShared – gemeinsame Leser-Schreiber-Sperre. Mehrere API-Aufrufe können parallel laufen, aber das Herunterfahren erwirbt eine exklusive Sperre und blockiert alle.s_platformShutdown-Prüfung – wenn das Herunterfahren bereits begonnen hat, sofort mit E_APPLICATION_EXITING abbrechen.wil::unique_storage-Wrapper gehalten, sodass sie auch bei einer Ausnahme freigegeben wird.Das Feature-Flag Feature_4097557817 dient der gestaffelten Bereitstellung über WIL (Windows Internal Library). Es ermöglicht Microsoft, die Behebung schrittweise zu aktivieren und bei Problemen zu deaktivieren.
Dies ist kein Ein-Funktions-Fehler. Das gleiche Sperren+Guard-Muster wurde in 49 Funktionen in wpncore.dll hinzugefügt:
| Kategorie | Funktionen |
|---|---|
| Toast-Operationen | ToastUnblockAll, ToastCreateSession, ToastCloseSession, ToastRequestAllNotifications, ToastSuppress |
| Kachel-Operationen | TileCreateSession, TileCloseSession, TileRequestResourceForeground |
| Registrierung | RegisterApplication, UnregisterApplication, RegisterHandler, UpdateRegistration, RegisterSystemApplication |
| Einstellungen | ChangeAppSetting, QueryAppSetting, QueryGlobalSetting, RegisterSettingCallback, UnregisterSettingCallback |
| Zustellung | Deliver, GetPayloadForNotificationId, Submit, PostScheduledNotification |
| Abfragen | GetRegisteredHandler, GetRegisteredHandlersFromParent, GetSettingsFromHandler, GetAssetsFromHandler |
Jede PresentationEndpointFacade::*-Methode, die auf die Plattform zugreift, erhielt die gleiche Behebung. Die darunterliegenden PresentationEndpointImpl::*-Methoden sind unverändert – das Problem lag nur in der Facade-Schicht.
WpnService läuft als SYSTEM. Wenn der Race gewonnen wird:
NotificationPlatform-Objekts kann zurückgefordert und mit vom Angreifer kontrollierten Daten gefüllt werden (Heap-Spray)NT AUTHORITY\SYSTEMDie eigentliche Ausnutzung – Heap-Spray, Vtable-Hijacking, Erreichen der Codeausführung – liegt außerhalb des Rahmens dieser Forschung. Dieses Repository konzentriert sich auf das Verständnis der Ursache und den Aufbau von Erkennung.
Das Verzeichnis lab/ enthält eine eigenständige C-Demo, die die Fehlerklasse reproduziert, ohne WpnService zu berühren. Es verwendet eine Named-Pipe- und Shared-Memory-Architektur ähnlich wie WpnService.
So funktioniert es:
vulnerable_service.exe liest eine Nachrichtenlänge aus dem Shared Memory, validiert sie, schläft 50 ms und liest die Länge erneut (Double-Fetch).race_attacker.exe setzt eine sichere Länge, löst den Dienst aus und überschreibt dann sofort den Shared Memory mit einem Überlaufwert.Führen Sie vulnerable_service.exe --patched aus, um die Behebung zu sehen: Single-Fetch-Erfassung in eine lokale Variable.
Links: Dienst erkennt Race (5/5). Rechts: Angreifer überschreibt Shared-Memory-Werte.
Erfordert GCC (MinGW). Führen Sie im Verzeichnis lab/ Folgendes aus:
build.bat
Terminal 1:
vulnerable_service.exe
Terminal 2:
race_attacker.exe 5
Vergleichen Sie dann mit vulnerable_service.exe --patched – gleicher Angriff, null erkannte Races.
detection/etw_wpn_monitor.ps1)PowerShell-Skript, das 7 Indikatoren prüft:
powershell -ExecutionPolicy Bypass .\detection\etw_wpn_monitor.ps1
ETW-Monitor: WpnService läuft (PID 6432), keine Abstürze, 100 Ereignisse/Stunde, System gepatcht
detection/sysmon_wpn_race_detect.xml)Sechs Regelgruppen für kontinuierliche Überwachung:
| Regel | Was es erfasst |
|---|---|
WPN_EoP_ChildProcess | svchost (netsvcs) startet cmd/powershell/wscript |
WPN_PipeAccess | Verbindungen zu WPN-bezogenen Named Pipes |
WPN_FileCreation | Dateierstellung in Benachrichtigungsdatenverzeichnissen |
WPN_RegistryTampering | Registrierungsschreibvorgänge auf PushNotifications-Schlüssel |
WPN_ProcessAccess | PROCESS_ALL_ACCESS-Handles auf svchost |
WPN_ThreadInjection | CreateRemoteThread in svchost |
Installieren:
sysmon64.exe -accepteula -i detection\sysmon_wpn_race_detect.xml
Die WpnService-Aktivität wird in Microsoft-Windows-PushNotifications-Platform/Operational protokolliert. Wichtige Ereignisse, die beobachtet werden sollten:
Ereignisanzeige: PushNotifications-Platform-Betriebsprotokoll, Ereignis-ID 1225
Wichtige Erkenntnisse aus dem Diffing von wpncore.dll:
.text-Abschnitt um 18.432 Bytes gewachsen (neuer Sperren/Guard-Code in 49 Funktionen).data-Abschnitt um 96 Bytes gewachsen (neue globale Variablen Wns::s_platformLock und Wns::s_platformShutdown)AcquireSRWLockShared/ReleaseSRWLockShared waren bereits in der Importtabelle~unique_any_t<...ReleaseSRWLockExclusive...> bestätigt Hinzufügung des Sperren-WrappersVollständige Berichte finden Sie in reports/.
CVE-2026-42978 ist Teil eines Clusters von 9 WPN-bezogenen Schwachstellen, die im Juni 2026 behoben wurden:
| CVE | Typ | CWE |
|---|---|---|
| CVE-2026-42977 | EoP | Race Condition |
| CVE-2026-42978 | EoP | Race Condition |
| CVE-2026-42979 | EoP | Race Condition |
| CVE-2026-42991 | EoP | Race Condition |
| CVE-2026-42969 | Informationspreisgabe | Race Condition |
| CVE-2026-42970 | Informationspreisgabe | Race Condition |
| CVE-2026-42973 | Informationspreisgabe | Race Condition |
| CVE-2026-26167 | EoP | — |
| CVE-2026-32160 | EoP | — |
CVE-2026-42978/
├── README.md
├── lab/
│ ├── vulnerable_service.c # Mock-WpnService mit Double-Fetch-Fehler
│ ├── race_attacker.c # Angreifer, der den Double-Fetch ausnutzt
│ └── build.bat # GCC-Build-Skript
├── detection/
│ ├── etw_wpn_monitor.ps1 # 7-Check-PowerShell-Detektor
│ └── sysmon_wpn_race_detect.xml # Sysmon-Regelkonfiguration
├── reports/
│ ├── PE_DIFF_REPORT.txt # PE-Abschnitts-/Import-Diff-Ergebnisse
│ └── FUNCTION_DIFF_REPORT.txt # Funktions-Diff (49 geändert)
└── img/ # Screenshots für dieses README
Dieses Projekt dient der defensiven Sicherheitsforschung. Die Schwachstelle wurde behoben. Es ist kein weaponisierter Exploit-Code enthalten. Das TOCTOU-Labor demonstriert die Fehlerklasse an einem eigenständigen Mock-Dienst – es interagiert nicht mit WpnService oder einer Systemkomponente.
Stellen Sie sicher, dass Ihr Windows auf dem neuesten Stand ist. Wenn etw_wpn_monitor.ps1 Ihr System als ungepatcht meldet – installieren Sie umgehend das kumulative Update von Juni 2026.
Wenn Sie etwas hinzuzufügen haben – bessere Erkennungsregeln, einen Sploit-PoC, eine Ghidra-Versionsverfolgungssitzung, YARA-Signaturen oder die Analyse der verwandten CVEs in diesem Cluster – Pull-Requests sind willkommen.
Ideen für Beiträge:
Eröffnen Sie ein Issue, wenn Sie Fragen haben oder die Forschung diskutieren möchten.
MIT