
# Notepad++ CVE-2026-52886 — обход пути через starts_with() в backupFilePath в session.xml (GHSA-rqfm-pw34-r7j6)
starts_with()Notepad++ — произвольное чтение файлов через обход backupFilePath в session.xml
PowerEditor/src/Notepad_plus.cpp (восстановление сеанса — проверка backupFilePath)session.xml)При восстановлении сеанса Notepad++ проверяет атрибут backupFilePath с помощью сравнения префикса необработанной строки через std::wstring::starts_with(), без предварительной нормализации пути. Специально сформированный путь, начинающийся с легитимного префикса каталога резервных копий, но содержащий последовательности обхода ..\, проходит проверку, однако при открытии файла операционной системой разрешается в произвольное расположение — содержимое любого читаемого файла загружается во вкладку редактора.
При запуске с включённым режимом моментальных снимков (резервных копий) Notepad++ восстанавливает предыдущий сеанс из session.xml. Ожидается, что backupFilePath каждой записи находится в каталоге резервных копий приложения. Контроль целостности лишь убеждается, что сохранённый путь начинается с ожидаемой строки каталога резервных копий. Поскольку сравнение выполняется над необработанной, ненормализованной строкой, атакующий добавляет легитимный префикс в начало, а затем выходит за пределы каталога с помощью последовательностей ..\.
Проверка тестирует текстовый префикс; использование открывает путь, разрешённый ОС. Эти два значения расходятся, как только присутствует ..\.
| Операция | Источник | Поведение |
|---|---|---|
| ПРОВЕРКА | Необработанная строка backupFilePath | starts_with(backupDir) — проходит при совпадении префикса |
| ИСПОЛЬЗОВАНИЕ | Путь, разрешённый ОС | Последовательности ..\ сворачиваются в произвольное расположение |
Предварительное условие: право записи в session.xml, включён режим моментальных снимков / резервных копий.
Шаги:
session.xml, внедрив специально сформированный backupFilePath:
<backupDir>\..\..\..\..\Users\victim\.ssh\id_rsa<backupDir>\ удовлетворяет starts_with(), поэтому проверка проходит...\; целевой файл открывается.Результат: эксфильтрация только для чтения — содержимое целевого файла отображается в редакторе, включая чувствительные файлы, такие как SSH-ключи, файлы конфигурации окружения и хранилища учётных данных.
.env / конфигурации, хранилища учётных данных — любой файл, читаемый пользователемТребования:
session.xmlbackupFilePath: префикс каталога резервных копий + последовательности обхода ..\ + путь к целевому файлуВнедрение специально сформированного пути и запуск приложения загружают целевой файл во вкладку редактора.
Исправление (коммит 7e66f36) выполняет корректную нормализацию пути перед проверкой, поэтому последовательности ..\ сворачиваются до сравнения префиксов — проверяемый и используемый пути теперь совпадают.