
Notepad++ CVE-2026-52886 — session.xml backupFilePath starts_with() path traversal (GHSA-rqfm-pw34-r7j6)
starts_with()Notepad++ — Lettura arbitraria di file tramite traversal di backupFilePath in session.xml
PowerEditor/src/Notepad_plus.cpp (ripristino della sessione — validazione di backupFilePath)session.xml)Notepad++ valida l'attributo backupFilePath durante il ripristino della sessione utilizzando un confronto del prefisso sulla stringa grezza tramite std::wstring::starts_with(), senza normalizzare prima il percorso. Un percorso appositamente costruito che inizia con il prefisso legittimo della directory di backup ma contiene sequenze di traversal ..\ supera il controllo, ma viene risolto in una posizione arbitraria quando il sistema operativo apre il file — caricando il contenuto di qualsiasi file leggibile in una scheda dell'editor.
All'avvio con la modalità snapshot (backup) attiva, Notepad++ ripristina la sessione precedente da session.xml. Ci si aspetta che il backupFilePath di ogni voce risieda nella directory di backup dell'applicazione. Il controllo di integrità verifica solo che il percorso memorizzato inizi con la stringa della directory di backup attesa. Poiché il confronto avviene sulla stringa grezza, non normalizzata, un attaccante antepone il prefisso legittimo e poi esce dalla directory con sequenze ..\.
Il controllo verifica un prefisso testuale; l'uso apre il percorso risolto dal sistema operativo. I due percorsi non coincidono quando è presente ..\.
| Operazione | Sorgente | Comportamento |
|---|---|---|
| CONTROLLO | Stringa grezza backupFilePath | starts_with(backupDir) — supera il controllo in caso di corrispondenza del prefisso |
| USO | Percorso risolto dal sistema operativo |
Pre-condizione: accesso in scrittura a session.xml, modalità snapshot/backup attiva.
Passaggi:
session.xml, iniettando un backupFilePath appositamente costruito:
<backupDir>\..\..\..\..\Users\victim\.ssh\id_rsa<backupDir>\ soddisfa starts_with(), quindi la validazione viene superata...\; il file target viene aperto.Risultato: esfiltrazione in sola lettura — il contenuto del file target è visibile nell'editor, inclusi file sensibili come chiavi SSH, file di configurazione dell'ambiente e archivi di credenziali.
.env / di configurazione, archivi di credenziali — qualsiasi file leggibile dall'utenteRequisiti:
session.xmlbackupFilePath: prefisso della directory di backup + sequenze di traversal ..\ + percorso del file targetL'iniezione del percorso appositamente costruito e l'avvio dell'applicazione caricano il file target in una scheda dell'editor.
La correzione (commit 7e66f36) esegue una corretta normalizzazione del percorso prima della validazione, così le sequenze ..\ vengono collassate prima del confronto del prefisso — il percorso controllato e il percorso utilizzato ora coincidono.
le sequenze ..\ collassano in una posizione arbitraria |