
Notepad++ CVE-2026-52886 — session.xml backupFilePath starts_with() path traversal (GHSA-rqfm-pw34-r7j6)
starts_with() 접두사 검사 우회Notepad++ — session.xml backupFilePath 탐색을 통한 임의 파일 읽기
PowerEditor/src/Notepad_plus.cpp (세션 복원 — backupFilePath 검증)session.xml에 대한 쓰기 권한)Notepad++는 세션 복원 중 backupFilePath 속성을 std::wstring::starts_with()를 통한 원시 문자열 접두사 비교로 검증하며, 경로를 먼저 정규화하지 않습니다. 정상 백업 디렉터리 접두사로 시작하지만 ..\ 탐색 시퀀스를 포함하는 조작된 경로는 검사를 통과하지만, OS가 파일을 열 때 임의의 위치로 확인되어 읽을 수 있는 모든 파일의 내용이 편집기 탭에 로드됩니다.
스냅샷(백업) 모드가 활성화된 상태에서 시작하면 Notepad++는 이전 세션을 session.xml에서 복원합니다. 각 항목의 backupFilePath는 애플리케이션의 백업 디렉터리 아래에 있어야 합니다. 무결성 검사는 저장된 경로가 기대되는 백업 디렉터리 문자열로 시작하는지만 확인합니다. 비교가 원시적이고 정규화되지 않은 문자열에서 이루어지기 때문에 공격자는 정상 접두사를 앞에 붙이고 ..\ 시퀀스로 디렉터리를 벗어날 수 있습니다.
검사는 텍스트 접두사를 확인하고, 사용은 OS가 확인한 경로를 엽니다. ..\가 존재하면 둘은 일치하지 않습니다.
| 작업 | 소스 | 동작 |
|---|---|---|
| CHECK | 원시 backupFilePath 문자열 | starts_with(backupDir) — 접두사 일치 시 통과 |
| USE | OS 확인 경로 | ..\ 시퀀스가 임의의 위치로 축소됨 |
사전 조건: session.xml에 대한 쓰기 권한, 스냅샷/백업 모드 활성화.
단계:
session.xml을 덮어쓰고 조작된 backupFilePath를 주입합니다:
<backupDir>\..\..\..\..\Users\victim\.ssh\id_rsa<backupDir>\가 starts_with()를 충족하므로 검증이 통과합니다...\ 시퀀스를 축소하여 대상 파일이 열립니다.결과: 읽기 전용 유출 — SSH 키, 환경 구성 파일, 자격 증명 저장소 등 민감한 파일을 포함한 대상 파일 내용이 편집기에 표시됩니다.
.env/구성 파일, 자격 증명 저장소 — 사용자가 읽을 수 있는 모든 파일요구 사항:
session.xml에 대한 쓰기 권한backupFilePath 페이로드: 백업 디렉터리 접두사 + ..\ 탐색 시퀀스 + 대상 파일 경로조작된 경로를 주입하고 애플리케이션을 시작하면 대상 파일이 편집기 탭에 로드됩니다.
수정(커밋 7e66f36)은 검증 전에 적절한 경로 정규화를 수행하므로 ..\ 시퀀스가 접두사 비교 전에 축소됩니다. 이제 검사된 경로와 사용된 경로가 일치합니다.