IPBUF安全漏洞报告
English
CVE-2025-64762 CVSS 9.1 严重

CVE-2025-64762: AuthKit Next.js库认证响应缺少抗缓存头部导致会话令牌泄露

披露日期: 2025-11-21

漏洞信息

漏洞编号
CVE-2025-64762
漏洞类型
敏感信息泄露
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
authkit-nextjs (WorkOS AuthKit)

相关标签

敏感信息泄露会话令牌泄露缓存安全Next.jsAuthKitWorkOSCDNCVE-2025-64762认证绕过会话劫持

漏洞概述

CVE-2025-64762是AuthKit Next.js库中的一个严重安全漏洞,该库为Next.js应用提供基于WorkOS的认证和会话管理功能。漏洞源于authkit-nextjs 2.11.0及以下版本在处理认证响应时,未能主动应用抗缓存HTTP头部(如Cache-Control、Pragma等)。在启用CDN缓存的生产环境中,经过认证的响应可能被CDN缓存,导致用户的会话令牌(session tokens)被存储在缓存中。当其他用户请求相同资源时,服务器可能返回包含前一个用户会话令牌的缓存响应,从而造成会话令牌泄露。攻击者获取他人的会话令牌后,可以完全接管受害者账户,执行任意操作。值得注意的是,部署在Vercel平台上的Next.js应用默认不受影响,因为Vercel默认不启用CDN缓存,除非开发者手动为认证路径设置缓存头部。该漏洞已在2.11.1版本中修复,通过为所有认证响应添加适当的抗缓存头部来解决此问题。

技术细节

该漏洞的核心问题在于AuthKit中间件在生成认证响应时缺少必要的缓存控制HTTP头部。标准的Web安全最佳实践要求认证响应必须包含明确的缓存禁用指令(如Cache-Control: no-store, no-cache, must-revalidate, private),以防止敏感会话数据被缓存。在未修复的版本中,当Next.js应用配置了CDN(如Cloudflare、AWS CloudFront等)进行响应缓存时,经过身份验证的API响应或页面响应会被CDN存储在缓存服务器上。由于响应中包含Set-Cookie头设置的会话Cookie,这些敏感信息会随缓存响应一起保存。当后续用户请求相同URL时,CDN可能返回包含前用户会话令牌的缓存响应,从而导致会话劫持风险。攻击者只需要找到启用了CDN缓存且使用AuthKit保护的端点,然后通过缓存投毒或直接访问缓存响应即可获取他人的有效会话令牌。修复方案(2.11.1版本)在认证中间件中添加了对所有认证后响应的抗缓存头部强制设置,确保即使应用层忘记设置缓存控制,AuthKit也会保证响应不会被缓存。

攻击链分析

STEP 1
步骤1
攻击者识别使用authkit-nextjs <= 2.11.0且配置了CDN缓存的Next.js应用
STEP 2
步骤2
攻击者通过正常认证流程获取自己的会话令牌,或直接访问认证保护的资源
STEP 3
步骤3
攻击者观察响应头,发现缺少Cache-Control: no-store等抗缓存头部
STEP 4
步骤4
CDN将包含会话令牌的认证响应缓存到边缘节点
STEP 5
步骤5
受害者访问相同资源,CDN返回包含攻击者会话令牌的缓存响应
STEP 6
步骤6
受害者浏览器接受并存储了攻击者的会话令牌,导致账户被接管

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-64762 PoC - 检测AuthKit Next.js缓存泄露漏洞 # 环境要求:已认证用户的会话令牌,目标站点启用CDN缓存 import requests import sys from urllib.parse import urljoin def check_cache_headers(response): """检查响应是否包含抗缓存头部""" cache_control = response.headers.get('Cache-Control', '') pragma = response.headers.get('Pragma', '') # 检查是否存在抗缓存策略 no_store = 'no-store' in cache_control.lower() no_cache = 'no-cache' in cache_control.lower() private = 'private' in cache_control.lower() return no_store or no_cache or 'no-cache' in pragma.lower() def test_caching_vulnerability(base_url, session_cookie): """ 测试认证端点是否存在缓存敏感信息风险 """ # 测试的认证保护端点(通常是需要认证的API或页面) test_endpoints = [ '/api/user/profile', '/api/auth/session', '/dashboard', '/api/settings' ] headers = { 'Cookie': f'session={session_cookie}', 'User-Agent': 'Mozilla/5.0 (Security Scan)' } results = { 'vulnerable': False, 'tested_endpoints': [], 'details': [] } for endpoint in test_endpoints: url = urljoin(base_url, endpoint) try: # 发送第一个请求 response1 = requests.get(url, headers=headers, timeout=10) has_cache_headers1 = check_cache_headers(response1) # 发送第二个请求,检查响应是否可能来自缓存 response2 = requests.get(url, headers=headers, timeout=10) has_cache_headers2 = check_cache_headers(response2) endpoint_result = { 'url': url, 'status_code': response1.status_code, 'has_anti_cache_headers': has_cache_headers1 and has_cache_headers2, 'set_cookie_present': 'Set-Cookie' in response1.headers, 'cache_control': response1.headers.get('Cache-Control', 'Not Set') } results['tested_endpoints'].append(endpoint_result) # 如果认证响应缺少抗缓存头部且包含会话信息,则标记为可能存在漏洞 if (response1.status_code == 200 and not has_cache_headers1 and 'Set-Cookie' in response1.headers): results['vulnerable'] = True results['details'].append( f"[VULN] {url} - Missing anti-cache headers, contains session cookie" ) else: results['details'].append( f"[SAFE] {url} - Has proper cache control headers" ) except requests.RequestException as e: results['details'].append(f"[ERROR] {url} - {str(e)}") return results def main(): if len(sys.argv) < 3: print("Usage: python cve-2025-64762_poc.py <target_url> <session_cookie>") print("Example: python cve-2025-64762_poc.py https://app.example.com 'abc123...'") sys.exit(1) target_url = sys.argv[1] session_cookie = sys.argv[2] print(f"[*] Testing CVE-2025-64762: AuthKit Next.js Cache Token Leak") print(f"[*] Target: {target_url}") print("-" * 60) results = test_caching_vulnerability(target_url, session_cookie) for detail in results['details']: print(detail) print("-" * 60) if results['vulnerable']: print("[!] VULNERABLE: Auth responses lack anti-cache headers") print("[!] Session tokens may be cached by CDN and exposed to other users") print("[!] Recommendation: Upgrade authkit-nextjs to version 2.11.1 or later") return 1 else: print("[+] NOT VULNERABLE: Proper cache control headers are present") return 0 if __name__ == "__main__": sys.exit(main())

影响范围

authkit-nextjs <= 2.11.0

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 禁用CDN缓存功能或为所有认证路径配置Cache-Control: no-store, no-cache, must-revalidate, private头部;2) 在Next.js中间件中为所有认证后的响应添加抗缓存头部;3) 使用Vercel Edge Functions替代标准CDN,利用其原生安全缓存控制;4) 监控CDN日志,检测异常的响应模式或会话令牌泄露迹象。Vercel平台用户默认不受影响,除非手动启用了CDN缓存。

参考链接

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