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, 无后门, 暴力破解, 身份认证绕过, 逆向工具