
Notepad++ CVE-2026-52886 — session.xml backupFilePath starts_with() path traversal (GHSA-rqfm-pw34-r7j6)
starts_with()Notepad++ — Leitura Arbitrária de Arquivos via Traversal de backupFilePath em session.xml
PowerEditor/src/Notepad_plus.cpp (restauração de sessão — validação de backupFilePath)session.xml)O Notepad++ valida o atributo backupFilePath durante a restauração de sessão usando uma comparação de prefixo de string bruta via std::wstring::starts_with(), sem normalizar o caminho primeiro. Um caminho forjado que começa com o prefixo legítimo do diretório de backup, mas contém sequências de traversal ..\, passa na verificação, porém resolve para um local arbitrário quando o SO abre o arquivo — carregando o conteúdo de qualquer arquivo legível em uma aba do editor.
Ao iniciar com o modo snapshot (backup) habilitado, o Notepad++ restaura a sessão anterior a partir de session.xml. Espera-se que o backupFilePath de cada entrada esteja dentro do diretório de backup do aplicativo. A verificação de integridade apenas confere se o caminho armazenado começa com a string esperada do diretório de backup. Como a comparação ocorre na string bruta, não normalizada, um atacante adiciona o prefixo legítimo no início e então sai do diretório com sequências ..\.
A verificação testa um prefixo textual; o uso abre o caminho resolvido pelo SO. Os dois divergem quando ..\ está presente.
| Operação | Origem | Comportamento |
|---|---|---|
| VERIFICAÇÃO | String bruta backupFilePath | starts_with(backupDir) — passa quando há correspondência de prefixo |
| USO | Caminho resolvido pelo SO | Sequências colapsam para um local arbitrário |
Pré-condição: Acesso de escrita a session.xml, modo snapshot/backup habilitado.
Passos:
session.xml, injetando um backupFilePath forjado:
<backupDir>\..\..\..\..\Users\victim\.ssh\id_rsa<backupDir>\ satisfaz starts_with(), então a validação passa...\; o arquivo alvo é aberto.Resultado: Exfiltração somente leitura — o conteúdo do arquivo alvo fica visível no editor, incluindo arquivos sensíveis como chaves SSH, arquivos de configuração de ambiente e armazenamentos de credenciais.
.env / de configuração, armazenamentos de credenciais — qualquer arquivo legível pelo usuárioRequisitos:
session.xmlbackupFilePath: prefixo do diretório de backup + sequências de traversal ..\ + caminho do arquivo alvoInjetar o caminho forjado e iniciar o aplicativo carrega o arquivo alvo em uma aba do editor.
A correção (commit 7e66f36) realiza a normalização adequada do caminho antes da validação, de modo que as sequências ..\ são colapsadas antes da comparação de prefixo — o caminho verificado e o caminho usado agora estão de acordo.
..\