IPBUF安全漏洞报告
English
CVE-2025-65681 CVSS 3.3 低危

CVE-2025-65681: OverhangIO tutor缓存控制缺失导致信息泄露漏洞

披露日期: 2025-11-26

漏洞信息

漏洞编号
CVE-2025-65681
漏洞类型
信息泄露
CVSS评分
3.3 低危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
overhangio/tutor (tutor-open-edx)

相关标签

CVE-2025-65681信息泄露缓存控制缺失overhangio/tutortutor-open-edx会话安全Web安全HTTP头配置本地攻击敏感数据保护

漏洞概述

CVE-2025-65681是Overhang.IO开发的开源在线教育平台管理工具tutor(也称为tutor-open-edx或overhangio/tutor)20.0.2版本中存在的一个信息泄露安全漏洞。该漏洞源于应用程序缺少适当的HTTP缓存控制头(Cache-Control)以及客户端会话检查机制的不完善。在Web应用程序安全设计中,缓存控制头是防止敏感信息被缓存和被未授权方访问的关键安全机制。当这些头信息缺失时,用户的敏感会话数据、认证令牌、个人信息等可能被浏览器或中间代理缓存,导致本地攻击者或其他共享设备的用户能够通过访问浏览器缓存或浏览器的开发者工具获取这些敏感信息。由于该漏洞的CVSS评分为3.3(低危),攻击复杂度较高(需要本地访问),且需要用户交互,但仍然可能对多用户环境下的数据安全造成威胁。建议受影响的用户及时更新到最新版本或采取临时的安全缓解措施。

技术细节

该漏洞的技术根本原因在于tutor-open-edx平台在HTTP响应头配置中缺少必要的Cache-Control指令。在标准的Web安全实践中,Cache-Control头用于指示浏览器和中间缓存如何处理响应内容。对于包含敏感用户信息的页面和API响应,通常应设置Cache-Control: no-store, no-cache, must-revalidate等指令,以防止缓存敏感数据。然而,在tutor 20.0.2版本中,部分响应缺少这些关键头信息,导致浏览器可能将包含会话标识符、用户偏好设置或其他敏感数据的响应缓存到本地磁盘或内存中。此外,客户端会话检查机制的不完善进一步加剧了这一问题,使得攻击者能够在获取缓存数据后更容易地模拟合法用户会话。攻击者利用此漏洞需要满足以下条件:1)能够物理访问或通过恶意软件访问目标用户的设备;2)目标用户已登录tutor平台并访问过敏感页面;3)攻击者需要通过浏览器缓存或网络代理日志获取缓存的敏感信息。一旦成功,攻击者可获取用户的会话令牌、个人学习数据、课程进度等敏感信息,可能用于进一步的身份冒充或数据窃取攻击。

攻击链分析

STEP 1
步骤1
攻击者获得目标用户的设备本地访问权限(如通过恶意软件、物理访问或社会工程学手段)
STEP 2
步骤2
目标用户在tutor平台上登录并访问敏感页面或API端点,浏览器缓存了包含敏感信息的响应
STEP 3
步骤3
由于应用程序缺少Cache-Control: no-store等缓存控制头,受害者的敏感会话数据和用户信息被存储在浏览器缓存中
STEP 4
步骤4
攻击者使用浏览器开发者工具、网络代理或直接访问浏览器缓存存储目录,获取缓存的敏感信息
STEP 5
步骤5
攻击者提取会话令牌、用户ID或其他敏感数据,利用不完善的客户端会话检查机制冒充合法用户
STEP 6
步骤6
攻击者利用窃取的会话信息访问受害者的课程数据、学习进度、个人设置等敏感信息,可能进一步实施数据窃取或身份冒充攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-65681 PoC - Information Disclosure via Missing Cache-Control Headers # Target: overhangio/tutor < 20.0.2 import requests import re from urllib.parse import urljoin def check_missing_cache_control(url): """ Check if the target application is missing Cache-Control headers """ print(f"[*] Checking {url} for missing Cache-Control headers...") # Target endpoints that should have Cache-Control headers sensitive_endpoints = [ "/api/user/v1/accounts/{username}", "/account/settings", "/api/enrollment/v1/enrollment", "/api/courseware/v1/courses/{course_id}" ] results = [] for endpoint in sensitive_endpoints: full_url = urljoin(url, endpoint) try: response = requests.get(full_url, timeout=10) cache_control = response.headers.get('Cache-Control') pragma = response.headers.get('Pragma') has_cache_issue = False issues = [] # Check for missing Cache-Control header if not cache_control: has_cache_issue = True issues.append("Missing Cache-Control header") elif 'no-store' not in cache_control.lower(): has_cache_issue = True issues.append("Cache-Control does not contain 'no-store'") # Check for missing Pragma: no-cache (for HTTP/1.0 compatibility) if not pragma: issues.append("Missing Pragma: no-cache header") result = { 'endpoint': endpoint, 'url': full_url, 'status_code': response.status_code, 'cache_control': cache_control, 'pragma': pragma, 'has_vulnerability': has_cache_issue, 'issues': issues } results.append(result) if has_cache_issue: print(f"[!] VULNERABLE: {endpoint}") print(f" Issues: {', '.join(issues)}") else: print(f"[+] SECURE: {endpoint}") except requests.RequestException as e: print(f"[-] Error checking {endpoint}: {str(e)}") return results def exploit_cache_poisoning(url, session_cookie): """ Attempt to exploit cached sensitive information Note: This requires local access to the victim's browser cache """ print("\n[*] Exploitation requires local browser cache access") print("[*] Attack scenario:") print(" 1. Attacker gains local access to victim's device") print(" 2. Attacker opens browser developer tools or cache directory") print(" 3. Attacker extracts cached API responses with sensitive data") print(" 4. Attacker uses cached session tokens for session hijacking") print("\n[!] This PoC demonstrates the vulnerability but actual exploitation") print("[!] requires access to the victim's browser cache storage.") if __name__ == "__main__": target_url = "https://your-tutor-instance.com" print("=" * 60) print("CVE-2025-65681 - Missing Cache-Control Headers PoC") print("Target: overhangio/tutor < 20.0.2") print("=" * 60) results = check_missing_cache_control(target_url) vulnerable_count = sum(1 for r in results if r['has_vulnerability']) print(f"\n[*] Summary: {vulnerable_count}/{len(results)} endpoints vulnerable")

影响范围

overhangio/tutor < 20.0.2
tutor-open-edx < 20.0.2
overhangio/tutor = 20.0.2 (受影响版本)

防御指南

临时缓解措施
在等待官方安全更新期间,可采取以下临时缓解措施:1)在反向代理层(如Nginx)配置所有经过tutor平台的HTTP响应,强制添加Cache-Control: no-store, no-cache, must-revalidate, private和Pragma: no-cache头;2)修改tutor的配置文件,禁用对敏感页面和API端点的缓存功能;3)在用户侧,建议在使用公共或多用户设备后清除浏览器缓存和Cookie;4)限制对管理界面和敏感API的直接访问,使用VPN或零信任网络访问控制;5)监控和审计异常的访问日志,特别关注来自非预期IP地址或设备的访问请求。虽然这些措施不能完全替代官方补丁,但可以显著降低漏洞被利用的风险。

参考链接

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