Hunt-Benito/ash-authentication-oauth2-oidc-account-takeover-cve-2026-49757-email-based-user-matching
GitHub: Hunt-Benito/ash-authentication-oauth2-oidc-account-takeover-cve-2026-49757-email-based-user-matching
针对 AshAuthentication OAuth2/OIDC email 匹配导致的账户接管漏洞(CVE-2026-49757)的 Python 概念验证工具,完整演示了攻击链及三种修复策略。
Stars: 0 | Forks: 0
# CVE-2026-49757 — AshAuthentication OAuth2/OIDC 账户接管
**CVE-2026-49757** 的概念验证 —— 这是 [AshAuthentication](https://hex.pm/packages/ash_authentication) 中的一个严重漏洞。其 OAuth2/OIDC 回调通过 **email 地址** 而不是 `(strategy, sub)` 身份对来匹配本地用户账户,从而导致未经身份验证的账户接管。
| 字段 | 值 |
|---|---|
| **CVE** | CVE-2026-49757 |
| **CVSS 4.0** | 9.2 (严重) |
| **CWE** | CWE-290 (通过欺骗绕过身份验证) |
| **GHSA** | GHSA-777c-2fxx-qr28 |
| **受影响版本** | `ash_authentication >= 0.1.0, < 4.14.0` 和 `>= 5.0.0-rc.0, < 5.0.0-rc.10` |
| **已修复版本** | `4.14.0`, `5.0.0-rc.10` |
## 攻击概述
1. 受害者在使用 AshAuthentication 的目标应用程序上注册
2. 攻击者使用受害者的 email 在任何受支持的 OAuth 提供商处注册
3. 攻击者通过 OAuth 登录 —— 应用程序通过 email 进行匹配,并为**受害者的**账户创建 session
不需要受害者的任何凭据。攻击者只需要受害者的 email 地址以及目标所接受的任何 OAuth 提供商上的一个账户。
## 环境要求
- Python 3.8+
- 仅需标准库(无需 pip install)
## 用法
```
# 交互模式(推荐)
python3 exploit.py
# 非交互模式(管道输入)
echo | python3 exploit.py
```
## PoC 演示内容
### 阶段 1:存在漏洞的处理器(Email 匹配)
使用 `upsert_identity: :unique_email` 模拟 AshAuthentication 的 `IdentityChange.change/3`:
- 受害者使用 `admin@target-app.com` 注册(角色:admin)
- 受害者关联 Google OAuth 账户(sub:`google-victim-real-12345`)
- 攻击者使用 `admin@target-app.com` 在 Keycloak 上注册(email_verified:false)
- 攻击者发起 OAuth 登录 → **应用程序通过 email 匹配** → 攻击者获得受害者的 session
### 阶段 2:已修复的处理器 —— `:reject` 策略(默认)
使用 `(strategy, sub)` 查找模拟修复后的 `UserResolver`:
- 在 `user_identities` 中找不到攻击者的 sub(`keycloak-attacker-fake-789`)
- `on_untrusted_email_match: :reject` 阻止登录
- **攻击已被阻止**
### 阶段 3:已修复的处理器 —— `:confirm` 策略
- 攻击者尝试使用受害者的 email 进行 OAuth 登录
- 系统向**受害者的** email 发送确认 token
- 只有在受害者确认后才会关联身份
- **攻击已被阻止**(攻击者无法控制该 email 收件箱)
### 阶段 4:已修复的处理器 —— `trust_email_verified? = true`
- 合法用户通过 Google 登录且 `email_verified: true` → 自动关联成功
- 攻击者通过 Keycloak 登录且 `email_verified: false` → 被阻止
- **在为受信任的提供商保留便利性的同时,为不受信任的提供商提供安全性**
## 文件
| 文件 | 描述 |
|---|---|
| `exploit.py` | 主 PoC 脚本 —— 运行所有 4 个阶段 |
| `vulnerable_handler.py` | 模拟的 OAuth 回调处理器(含漏洞版本 + 已修复版本) |
## 修复方案(ash_authentication >= 4.14.0)
1. **`UserResolver` 模块** —— 通过 `(strategy, sub)` 身份而不是 email 解析用户
2. **`on_untrusted_email_match` 选项** —— 针对未知 sub 提供 `:reject`(默认)、`:confirm` 或 `:warn`
3. **`trust_email_verified?` 选项** —— 针对特定提供商的标志,对于 GitHub/Google/Auth0/Slack/Apple 默认为 `true`
4. **Identity 唯一键** —— 从 `(strategy, uid, user_id)` 更改为 `(strategy, uid)`
5. **Upsert 限制** —— 发生冲突时永不更新 `user_id`
6. **编译时警告** —— 针对没有 `identity_resource` 的 strategy
## 参考
- [NVD — CVE-2026-49757](https://nvd.nist.gov/vuln/detail/CVE-2026-49757)
- [GHSA-777c-2fxx-qr28](https://github.com/team-alembic/ash_authentication/security/advisories/GHSA-777c-2fxx-qr28)
- [OpenID Connect Core §5.7 — Claim 稳定性](https://openid.net/specs/openid-connect-core-1_0.html#ClaimStability)
- [Hex.pm 上的 AshAuthentication](https://hex.pm/packages/ash_authentication)
## 免责声明
本 PoC 仅用于教育和防御性测试目的。请仅对您拥有或获得明确授权的系统进行测试。
标签:OAuth2, OIDC, PoC, Python, 无后门, 暴力破解, 身份认证绕过, 逆向工具