
Technische Analyse von CVE-2026-52885: eine TOCTOU-Race-Condition in Notepad++ v8.9.6.2, die eine beliebige Befehlsausführung durch Umgehung der HMAC-Integrität ermöglicht. Enthält Grundursache, Angriffsszenario, PoC und Patch-Analyse.
Notepad++ v8.9.6.2 — Angreifergesteuerte UserCommand-Ausführung durch HMAC-Race-Condition
| GHSA | GHSA-qm4c-qg8p-qfcr |
| CVE | CVE-2026-52885 |
| Schweregrad | Hoch |
| Betroffen | v8.9.6.2 |
| Behoben | v8.9.6.4 |
| Patch-Commit | 4f7563c |
| Betroffene Datei | PowerEditor/src/NppCommands.cpp :4328–4359 |
| Plattform | Windows 11 Pro x64 |
| Erforderliche Berechtigung | Standardbenutzer (Schreibzugriff auf shortcuts.xml) |
| Forscher | v3s9er |
| Offengelegt | 2026-06-05 |
Notepad++ v8.9.6.2 führte eine HMAC-SHA256-Integritätsprüfung auf shortcuts.xml ein, um die Einschleusung beliebiger UserCommand-Einträge zu verhindern.
Die Prüfung weist einen TOCTOU-Fehler auf: Der HMAC wird zum Zeitpunkt der Auslösung gegen die Datei auf der Festplatte verifiziert, aber der ausgeführte Befehl wird aus dem In-Memory-Vektor _userCommands gelesen, der beim Start geladen wird. Diese beiden Quellen werden nie wieder synchronisiert.
Ein Angreifer, der in shortcuts.xml schreiben kann, kann vor dem Start einen bösartigen Befehl platzieren, Notepad++ diesen in den Speicher laden lassen, die legitime Datei auf der Festplatte wiederherstellen und dann den Befehl auslösen. Die HMAC-Prüfung besteht (die Festplatte ist sauber), aber die schädliche Nutzlast wird ausgeführt (der Speicher ist veraltet).
Der Integritätsmechanismus validiert die aktuelle shortcuts.xml auf der Festplatte, während die Befehlsausführung eine zuvor geladene In-Memory-Repräsentation verwendet. Da die beiden Datenquellen unabhängig sind, kann ein Angreifer die Datei vor dem Start ändern, sie in den Speicher parsen lassen, dann die Originaldatei vor der Befehlsausführung wiederherstellen – was dazu führt, dass die HMAC-Prüfung besteht, während die schädliche Nutzlast ausgeführt wird.
NppCommands.cpp Zeilen 4328–4359:
// TIME OF CHECK — reads on-disk file
std::string currentHMAC = computeHMAC(
getMachineGUID(),
getFileContent(nppParams.getShortcutsPath().c_str())
);
if (currentHMAC != nppGUI._shortcutsXmlHmacInConfig) { return; }
// validated against DISK
// TIME OF USE — reads in-memory vector (loaded at startup, never refreshed)
int i = id - ID_USER_CMD;
const vector<UserCommand>& cmds = nppParams.getUserCommandList();
UserCommand ucmd = cmds[i];
Command cmd(string2wstring(ucmd.getCmd(), CP_UTF8));
cmd.run(_pPublicInterface->getHSelf()); // executes payload from MEMORY
| Operation | Quelle | Zeitpunkt |
|---|---|---|
| PRÜFUNG (HMAC) | Datei auf Festplatte | Zum Zeitpunkt der Auslösung |
| NUTZUNG (Ausführung) | Speichervektor | Beim Start geladen |
| LÜCKE | Angreifergesteuert | Start → Auslösung |
Voraussetzung: Schreibzugriff auf shortcuts.xml
notepad++.exe%AppData%\Notepad++\Schritte:
shortcuts.xml auf der Festplatte mit einer bösartigen Version (cmd = calc.exe)_userCommands wird aus der bösartigen Datei befülltshortcuts.xml auf der Festplatte wieder her — HMAC stimmt nun mit config.xml übereinWM_COMMAND(21000) (ID_USER_CMD+0) oder drücke Strg+Alt+P_userCommands[0] aus dem Speicher → calc.exe wird ausgeführtErgebnis: Ausführung von angreifergesteuerten Befehlen unter den Berechtigungen des aktuellen Benutzers. Kein Admin, keine UAC, keine Benutzerwarnung.
Siehe poc_8962_toctou.ps1.
Anforderungen:
doLocalConf.xml im Notepad++-Verzeichnis vorhanden (Portable-Modus)config.xml mit einem gültigen HMAC für die legitime shortcuts.xml.\poc_8962_toctou.ps1 -NppPath "C:\path\to\notepad++.exe"
Verifiziert: calc.exe gestartet (PID 35932), Festplatte zeigt durchgehend legitime shortcuts.xml.
Der Fix (Commit 4f7563c) verschiebt die HMAC-Validierung in den Startvorgang, zusammen mit der anfänglichen Datei-Parse. Prüfung und Nutzung arbeiten nun gleichzeitig auf demselben Objekt, wodurch das TOCTOU-Fenster beseitigt wird.
| v8.9.6.2 (anfällig) | v8.9.6.4 (behoben) | |
|---|---|---|
| HMAC-Prüfung | Zum Zeitpunkt der Auslösung, erneutes Lesen der Festplatte | Beim Start, gleiche Bytes wie beim Parsen |
| Befehlsquelle | Speicher geladen beim Start | Speicher validiert beim Start |
| TOCTOU-Fenster |
| Zeit | Ereignis | Zustand |
|---|
| T+0,0s | Angreifer schreibt BÖSARTIGE shortcuts.xml | Festplatte=BÖSARTIG |
| T+0,0s | Angreifer startet Notepad++ | Festplatte=BÖSARTIG |
| T+0,1s | Notepad++ liest shortcuts.xml → _userCommands[0]="calc.exe" | Speicher=BÖSARTIG |
| T+4,2s | Notepad++ vollständig geladen | Speicher=BÖSARTIG |
| T+4,2s | Angreifer stellt LEGITIME shortcuts.xml wieder her | Festplatte=LEGITIM / Speicher=BÖS |
| T+4,7s | Angreifer sendet WM_COMMAND(21000) | |
| T+4,7s | HMAC-Prüfung: liest LEGITIME Datei von Festplatte → BESTANDEN | PRÜFUNG OK |
| T+4,7s | Ausführung: liest _userCommands[0] aus SPEICHER → calc.exe | AUSBEUTUNG |
| T+4,7s | calc.exe gestartet (PID 35932) | BESTÄTIGT |
| Art | Beliebige Befehlsausführung |
| Admin erforderlich | Nein |
| UAC-Eingabeaufforderung | Nein |
| Erkennbarkeit | Niedrig — Festplatte zeigt durchgehend legitime Datei; Nutzlast nur im Speicher |
| CVSS (geschätzt) | AV:L / AC:H / PR:L / UI:N / S:U / C:H / I:H / A:H |
| Start → Auslösung |
| Beseitigt |