
Notepad++ CVE-2026-52886 — session.xml backupFilePath starts_with() path traversal (GHSA-rqfm-pw34-r7j6)
starts_with()Notepad++ — Lectura arbitraria de archivos mediante traversal de backupFilePath en session.xml
PowerEditor/src/Notepad_plus.cpp (restauración de sesión — validación de backupFilePath)session.xml)Notepad++ valida el atributo backupFilePath durante la restauración de sesión usando una comparación de prefijo de cadena bruta mediante std::wstring::starts_with(), sin normalizar la ruta primero. Una ruta manipulada que comienza con el prefijo legítimo del directorio de respaldo pero contiene secuencias de traversal ..\ supera la verificación, aunque se resuelve a una ubicación arbitraria cuando el sistema operativo abre el archivo — cargando el contenido de cualquier archivo legible en una pestaña del editor.
Al iniciar con el modo de instantánea (respaldo) habilitado, Notepad++ restaura la sesión anterior desde session.xml. Se espera que el backupFilePath de cada entrada se encuentre dentro del directorio de respaldo de la aplicación. El control de integridad solo verifica que la ruta almacenada comience con la cadena esperada del directorio de respaldo. Debido a que la comparación se realiza sobre la cadena cruda, sin normalizar, un atacante antepone el prefijo legítimo y luego sale del directorio con secuencias ..\.
La verificación comprueba un prefijo textual; el uso abre la ruta resuelta por el sistema operativo. Ambos difieren una vez que está presente ..\.
| Operación | Origen | Comportamiento |
|---|---|---|
| VERIFICACIÓN | Cadena bruta backupFilePath | starts_with(backupDir) — pasa si coincide el prefijo |
| USO | Ruta resuelta por el SO | Las secuencias ..\ colapsan a una ubicación arbitraria |
Precondición: Acceso de escritura a session.xml, modo de instantánea/respaldo habilitado.
Pasos:
session.xml, inyectando un backupFilePath manipulado:
<backupDir>\..\..\..\..\Users\victim\.ssh\id_rsa<backupDir>\ satisface starts_with(), por lo que la validación pasa...\; se abre el archivo objetivo.Resultado: Exfiltración de solo lectura — el contenido del archivo objetivo es visible en el editor, incluidos archivos sensibles como claves SSH, archivos de configuración de entorno y almacenes de credenciales.
.env / de configuración, almacenes de credenciales — cualquier archivo legible por el usuarioRequisitos:
session.xmlbackupFilePath: prefijo del directorio de respaldo + secuencias de traversal ..\ + ruta del archivo objetivoAl inyectar la ruta manipulada y lanzar la aplicación, el archivo objetivo se carga en una pestaña del editor.
La corrección (commit 7e66f36) realiza una normalización adecuada de la ruta antes de la validación, por lo que las secuencias ..\ se colapsan antes de la comparación de prefijo — la ruta verificada y la ruta usada ahora coinciden.