Vulnerability advisory

CVE-2026-81637

Replayable OAuth2 CSRF state retained after a failed callback in AshAuthentication

Published Updated OSV record ↗

Also known as EEF-CVE-2026-81637GHSA-3vcj-gxx8-3p44

Severity
  • CVSS 4.0CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

Affected versions

Repository

Affected commitsFixed by commit
GIT github.com/team-alembic/ash_authentication ↗
c5f589058e04239263f50a1430eb17ea6d5dd1a2 to before bd4352303bc9d72d007f6818775267585a4bcc2fbd4352303bc9d72d007f6818775267585a4bcc2f
3a54be6b32e53ec9f07f9bc19597f06edad61132 to before d6b2be35cf8f0b8ab84e7a934cfb0d91de0a3c17d6b2be35cf8f0b8ab84e7a934cfb0d91de0a3c17
6767fe27eb952e5bc09aa2e5a7d8f96f5a1c424a to before fea75958a081ed337ceb578396174039694c48dffea75958a081ed337ceb578396174039694c48df
Not specifiedc5f589058e04239263f50a1430eb17ea6d5dd1a2
Not specifiedd7f939cd02bd618bcaa304631846fa75ffc419d7
Also listed as affected (172)
  • v4.14.2
  • v5.0.0-rc.13
  • v4.14.1
  • v5.0.0-rc.12
  • v5.0.0-rc.11
  • v5.0.0-rc.10
  • v4.14.0
  • v4.13.7
  • 5.0.0-rc.9
  • 5.0.0-rc.8
  • v5.0.0-rc.7
  • v5.0.0-rc.6
  • v5.0.0-rc.5
  • v5.0.0-rc.4
  • v5.0.0-rc.3
  • v5.0.0-rc.2
  • v5.0.0-rc.1
  • v5.0.0-rc.0
  • v4.13.6
  • v4.13.5
  • v4.13.4
  • v4.13.3
  • v4.13.2
  • v4.13.1
  • v4.13.0
  • v4.12.0
  • v4.11.0
  • v4.10.0
  • v4.9.9
  • v4.9.8
  • v4.9.7
  • v4.9.6
  • v4.9.5
  • v4.9.4
  • v4.9.3
  • v4.9.2
  • v4.9.1
  • v4.9.0
  • v4.8.7
  • v4.8.5
  • v4.8.4
  • v4.8.3
  • v4.8.2
  • v4.8.1
  • v4.8.0
  • v4.7.7
  • v4.7.6
  • v4.7.5
  • v4.7.4
  • v4.7.3
  • v4.7.2
  • v4.7.1
  • v4.7.0
  • v4.6.4
  • v4.6.3
  • v4.6.2
  • v4.6.1
  • v4.6.0
  • v4.5.6
  • v4.5.5
  • v4.5.4
  • v4.5.3
  • v4.5.2
  • v4.5.1
  • v4.4.9
  • v4.4.8
  • v4.4.7
  • v4.4.6
  • v4.4.5
  • v4.4.4
  • v4.4.3
  • v4.4.2
  • v4.4.1
  • v4.4.0
  • v4.3.12
  • v4.3.10
  • v4.3.9
  • v4.3.7
  • v4.3.6
  • v4.3.4
  • v4.3.3
  • v4.3.2
  • v4.3.1
  • v4.3.0
  • v4.2.7
  • v4.2.5
  • v4.2.3
  • v4.2.2
  • v4.2.1
  • v4.2.0
  • v4.1.0
  • v4.0.4
  • v4.0.3
  • v4.0.2
  • v4.0.1
  • v4.0.0
  • v4.0.0-rc.7
  • v4.0.0-rc.6
  • v4.0.0-rc.5
  • v4.0.0-rc.4
  • v4.0.0-rc.3
  • v4.0.0-rc.2
  • v4.0.0-rc.1
  • v4.0.0-rc.0
  • v3.12.4
  • v3.12.3
  • v3.12.2
  • v3.12.1
  • v3.12.0
  • v3.11.16
  • v3.11.15
  • v3.11.14
  • v3.11.13
  • v3.11.12
  • v3.11.10
  • v3.11.9
  • v3.11.8
  • v3.11.7
  • v3.11.6
  • v3.11.5
  • v3.11.4
  • v3.11.3
  • v3.11.2
  • v3.11.1
  • v3.11.0
  • v3.10.8
  • v3.10.7
  • v3.10.6
  • v3.10.5
  • v3.10.4
  • v3.10.2
  • v3.10.1
  • v3.10.0
  • v3.9.6
  • v3.9.5
  • v3.9.4
  • v3.9.3
  • v3.9.2
  • v3.9.0
  • v3.7.9
  • v3.7.8
  • v3.7.6
  • v3.7.5
  • v3.7.4
  • v3.7.3
  • v3.7.2
  • v3.7.1
  • v3.7.0
  • v3.6.1
  • v3.5.3
  • v3.5.2
  • v3.5.1
  • v3.5.0
  • v3.4.2
  • v3.4.1
  • v3.4.0
  • v3.3.1
  • v3.3.0
  • v3.2.2
  • v3.2.1
  • v3.2.0
  • v3.1.0
  • v3.0.4
  • v3.0.3
  • v3.0.2
  • v3.0.1
  • v3.0.0
  • v2.0.1
  • v2.0.0
  • v1.0.0
  • v0.6.1
  • v0.6.0

Description

Insufficient Session Expiration vulnerability in team-alembic AshAuthentication allows an attacker who obtains a victim's OAuth2 state value to replay the callback and sign that victim into an attacker-controlled account.

AshAuthentication.Strategy.OAuth2.Plug.callback/2 clears the stored session_params through a rebinding step inside its with chain, conn <- delete_session(conn, session_key). Elixir evaluates the else block in the scope enclosing the with, so every failure path (the provider returning ?error=access_denied, an invalid code, a token-exchange error, or a registration or sign-in failure) reaches store_authentication_result/2 holding the original connection and the session entry is never removed. The value the module's own comment describes as protection against a CSRF-related attack is therefore consumed only when authentication succeeds, and survives a cancelled or failed attempt until the next request phase or session expiry.

This issue affects ash_authentication: from 0.6.0 before 4.15.0 and from 5.0.0-rc.0 before 5.0.0-rc.14.

References

  • Codex
  • Claude Code
  • VS Code
  • GitHub Copilot
  • Cursor
  • Cline
  • Windsurf
  • Google Anti-gravity
  • OpenCode
  • Pi
  • Gemini CLI
  • Hermes Agent
  • Zed
  • Junie
  • Qwen Code
  • Kiro
  • Kilo Code
  • Factory Droid

Set up GitHits for your agents

Run this command:

<> bash
npx githits@latest init

What happens next:

  1. Opens your browser to authorize GitHits
  2. Asks whether to set up GitHits at the user or project level
  3. Detects your supported AI coding tools
  4. Lets you choose which tools to configure
  5. Configures the selected tools