IPBUF安全漏洞报告
English
CVE-2026-44166 CVSS 7.6 高危

CVE-2026-44166 PocketBase OAuth账户劫持漏洞

披露日期: 2026-05-12

漏洞信息

漏洞编号
CVE-2026-44166
漏洞类型
账户接管
CVSS评分
7.6 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
PocketBase

相关标签

PocketBaseOAuth2账户接管认证绕过高危

漏洞概述

PocketBase 是一个用 Go 编写的开源后端。在 0.22.42 和 0.37.4 之前的版本中存在一个安全漏洞。如果攻击者知道受害者的电子邮件地址,攻击者可以利用 OAuth2 提供商(例如提供商 A)预先创建并链接一个未验证的 PocketBase 用户。当受害者稍后使用不同的 OAuth2 提供商(提供商 B)注册或受邀注册时,攻击者预先创建的用户将自动与受害者关联,被升级为“已验证”状态,并且其旧密码会被重置。这可能导致攻击者劫持受害者的账户。

技术细节

该漏洞的核心在于 PocketBase 处理多 OAuth 提供商账户关联时的逻辑缺陷。系统设计上允许将不同的 OAuth 提供商身份(如 Google 和 GitHub)关联到同一个 PocketBase 用户账户上,但不允许同一提供商的多个账户关联。攻击者利用这一特性,首先获取目标受害者的邮箱地址。攻击者使用 OAuth 提供商 A 对该邮箱进行认证,此时 PocketBase 会创建一个未验证的用户记录。随后,当受害者使用 OAuth 提供商 B 尝试注册或登录时,系统识别到该邮箱已存在。由于系统允许不同提供商的关联,它会自动将提供商 B 的身份信息绑定到攻击者预先创建的账户上。这一绑定过程不仅验证了账户,还会重置账户凭证,从而使攻击者获得该账户的完全控制权。

攻击链分析

STEP 1
信息收集
攻击者获取受害者的电子邮件地址。
STEP 2
预先注册
攻击者使用 OAuth2 提供商 A(如 Google)以受害者的邮箱创建一个未验证的 PocketBase 账户。
STEP 3
受害者操作
受害者使用不同的 OAuth2 提供商 B(如 GitHub)尝试注册或登录该应用。
STEP 4
自动关联
PocketBase 系统检测到邮箱已存在,自动将提供商 B 的身份与攻击者创建的账户关联,并验证账户。
STEP 5
账户接管
攻击者利用已验证的账户身份,通过密码重置功能或其他方式获得账户的完全访问权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # This is a conceptual PoC to demonstrate the attack flow. # Actual exploitation requires valid OAuth app credentials and victim interaction. TARGET_URL = "https://example.com/api/collections/users/records" VICTIM_EMAIL = "[email protected]" print(f"[+] Target: {TARGET_URL}") print(f"[+] Victim Email: {VICTIM_EMAIL}") # Step 1: Attacker initiates OAuth flow with Provider A (e.g., Google) # and creates an unverified account for the victim's email. print("[1] Attacker creates unverified account via OAuth Provider A...") # attacker_oauth_token = get_oauth_token_provider_a() # data = {"email": VICTIM_EMAIL, "provider": "google", "token": attacker_oauth_token} # r = requests.post(TARGET_URL + "/auth-with-oauth2", json=data) print("[!] Unverified user created (simulated).") # Step 2: Victim decides to sign up using OAuth Provider B (e.g., GitHub) print("[2] Victim initiates sign up via OAuth Provider B...") # victim_oauth_token = get_oauth_token_provider_b() # data = {"email": VICTIM_EMAIL, "provider": "github", "token": victim_oauth_token} # Step 3: System automatically links Provider B to the existing user created by Attacker # and marks the account as verified. print("[3] System auto-links Provider B to the existing user...") print("[!] Account is now verified and linked to attacker's initial record.") # Step 4: Attacker can now reset the password or access the account print("[4] Attacker resets password via API...") print("[!] Account takeover successful.")

影响范围

PocketBase < 0.22.42
PocketBase < 0.37.4

防御指南

临时缓解措施
建议管理员立即检查并更新 PocketBase 至最新安全版本。在未升级前,应加强对新用户注册和 OAuth 关联日志的审计,一旦发现同一邮箱在短时间内通过不同 OAuth 提供商进行关联尝试,应立即触发警报。

参考链接

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