
CVE-2026-52885에 대한 기술 분석: Notepad++ v8.9.6.2의 TOCTOU 경쟁 조건으로 인해 HMAC 무결성 우회를 통한 임의 명령 실행이 가능합니다. 근본 원인, 공격 시나리오, PoC 및 패치 분석을 포함합니다.
| GHSA | GHSA-qm4c-qg8p-qfcr |
| CVE | CVE-2026-52885 |
| 심각도 | 높음 |
| 영향을 받는 버전 | v8.9.6.2 |
| 패치된 버전 | v8.9.6.4 |
| 패치 커밋 | 4f7563c |
| 영향을 받는 파일 | PowerEditor/src/NppCommands.cpp :4328–4359 |
| 플랫폼 | Windows 11 Pro x64 |
| 필요 권한 | 표준 사용자 (shortcuts.xml에 쓰기 권한) |
| 연구자 | v3s9er |
| 공개일 | 2026-06-05 |
Notepad++ v8.9.6.2는 shortcuts.xml에 HMAC-SHA256 무결성 검사를 도입하여 임의의 UserCommand 항목 삽입을 방지했습니다.
이 검사에는 TOCTOU 결함이 있습니다. HMAC는 트리거 시점의 디스크 파일을 기준으로 확인되지만, 실행되는 명령은 시작 시 로드된 메모리 내 _userCommands 벡터에서 읽어옵니다. 이 두 소스는 다시 동기화되지 않습니다.
shortcuts.xml에 쓸 수 있는 공격자는 시작 전에 악의적인 명령을 심고, Notepad++가 이를 메모리에 로드하게 한 다음, 디스크의 파일을 정상 파일로 복원한 후 명령을 트리거할 수 있습니다. HMAC 검사는 통과하지만(디스크는 깨끗함), 악의적인 페이로드가 실행됩니다(메모리는 오래된 상태).
무결성 메커니즘은 현재 디스크에 있는 shortcuts.xml을 검증하는 반면, 명령 실행은 이전에 로드된 메모리 내 표현을 사용합니다. 두 데이터 소스가 독립적이기 때문에, 공격자는 시작 전에 파일을 변경하고 메모리에 파싱되도록 한 후, 명령 실행 전에 원래 파일을 복원하여 HMAC 검사를 통과시키면서 악의적인 페이로드가 실행되도록 할 수 있습니다.
NppCommands.cpp 4328–4359행:
// TIME OF CHECK — reads on-disk file
std::string currentHMAC = computeHMAC(
getMachineGUID(),
getFileContent(nppParams.getShortcutsPath().c_str())
);
if (currentHMAC != nppGUI._shortcutsXmlHmacInConfig) { return; }
// validated against DISK
// TIME OF USE — reads in-memory vector (loaded at startup, never refreshed)
int i = id - ID_USER_CMD;
const vector<UserCommand>& cmds = nppParams.getUserCommandList();
UserCommand ucmd = cmds[i];
Command cmd(string2wstring(ucmd.getCmd(), CP_UTF8));
cmd.run(_pPublicInterface->getHSelf()); // executes payload from MEMORY
| 작업 | 소스 | 시점 |
|---|---|---|
| 확인 (HMAC) | 디스크 파일 | 트리거 시 |
| 사용 (실행) | 메모리 벡터 | 시작 시 로드 |
| 갭 | 공격자 제어 | 시작 → 트리거 |
전제 조건: shortcuts.xml에 대한 쓰기 권한
notepad++.exe와 동일한 디렉터리%AppData%\Notepad++\단계:
shortcuts.xml을 악의적인 버전으로 덮어씁니다 (cmd = calc.exe)_userCommands가 악의적인 파일로 채워집니다shortcuts.xml을 복원합니다 — HMAC가 이제 config.xml과 일치합니다WM_COMMAND(21000) (ID_USER_CMD+0)을 보내거나 Ctrl+Alt+P를 누릅니다_userCommands[0]을 읽습니다 → calc.exe 실행결과: 현재 사용자의 권한으로 공격자 제어 명령이 실행됩니다. 관리자 권한, UAC, 사용자 경고가 필요하지 않습니다.
| 시간 | 이벤트 | 상태 |
|---|---|---|
| T+0.0초 | 공격자가 악의적인 shortcuts.xml 작성 | 디스크=악성 |
| T+0.0초 | 공격자가 Notepad++ 실행 | 디스크=악성 |
| T+0.1초 | Notepad++가 shortcuts.xml 읽음 → _userCommands[0]="calc.exe" | 메모리=악성 |
| T+4.2초 | Notepad++ 완전 로드됨 | 메모리=악성 |
| T+4.2초 | 공격자가 정상 shortcuts.xml 복원 | 디스크=정상 / 메모리=악성 |
| T+4.7초 | 공격자가 WM_COMMAND(21000) 전송 | |
| T+4.7초 | HMAC 검사: 디스크에서 정상 파일 읽음 → 통과 | 확인 통과 |
| T+4.7초 | 실행: 메모리에서 _userCommands[0] 읽음 → calc.exe | 익스플로잇 |
| T+4.7초 | calc.exe 생성됨 (PID 35932) | 확인됨 |
| 유형 | 임의 명령 실행 |
| 관리자 필요 | 아니오 |
| UAC 프롬프트 | 아니오 |
| 탐지 가능성 | 낮음 — 디스크에는 항상 정상 파일만 표시됨; 페이로드는 메모리 전용 |
| CVSS (추정) | AV:L / AC:H / PR:L / UI:N / S:U / C:H / I:H / A:H |
요구 사항:
doLocalConf.xml이 있어야 함 (휴대용 모드)shortcuts.xml에 대한 유효한 HMAC가 포함된 config.xml.\poc_8962_toctou.ps1 -NppPath "C:\path\to\notepad++.exe"
확인됨: calc.exe 생성됨 (PID 35932), 디스크에는 항상 정상 shortcuts.xml이 표시됨.
수정 사항 (커밋 4f7563c)은 HMAC 검증을 시작 시점으로 이동하여 초기 파일 파싱과 함께 수행합니다. 이제 확인과 사용이 동일한 객체에 대해 동시에 수행되어 TOCTOU 윈도우가 제거됩니다.
| v8.9.6.2 (취약) | v8.9.6.4 (패치됨) | |
|---|---|---|
| HMAC 검사 | 트리거 시, 디스크 다시 읽기 | 시작 시, 파싱과 동일한 바이트 |
| 명령 소스 | 시작 시 로드된 메모리 | 시작 시 검증된 메모리 |
| TOCTOU 윈도우 | 시작 → 트리거 | 제거됨 |