Vulnerability advisory

EEF-CVE-2026-86688

Session id is not renewed on authentication in ash_authentication, allowing session fixation

Published Updated OSV record ↗

Also known as CVE-2026-86688GHSA-v577-944g-7h3x

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

Affected versions

Repository

Affected commitsFixed by commit
GIT github.com/team-alembic/ash_authentication ↗
a939dde9b917c072cdf10c4b0913a9886a4b0231 to before 872db454405ecad4fcdabd9ff3d8755d1d6a69ae872db454405ecad4fcdabd9ff3d8755d1d6a69ae
Not specified3e1d452cbf1564e87f5f97be882b66fe25af7cfa
Also listed as affected (179)
  • 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
  • v0.5.0
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.3.0
  • v0.2.1
  • v0.2.0

Description

Summary

Session Fixation vulnerability in team-alembic ash_authentication allows an attacker who can plant a session identifier in a victim's browser to hold an authenticated session once that victim signs in.

AshAuthentication.Plug.Helpers.store_in_session/2 writes the authenticated subject into the existing session with Plug.Conn.put_session/3 and never calls Plug.Conn.configure_session(renew: true), so the identifier the visitor arrived with carries into their authenticated session. Every authentication event reaches this one function: the default success/4 injected by AshAuthentication.Phoenix.Controller.__using__/1, the AuthController emitted by mix ash_authentication_phoenix.install, and remember-me auto-login. AshAuthentication.Phoenix.Plug.store_in_session/2 is a defdelegate to it. Logout does not close the window either, because clear_session/2 ends with Plug.Conn.clear_session/1, which clears session contents but leaves the identifier intact, so a planted identifier survives a logout-then-login cycle.

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

Impact

An attacker holding a session identifier they planted before the victim signed in gains that victim's authenticated session, and with it full account takeover, in deployments using a server-side session store.

Workarounds

Call Plug.Conn.configure_session(conn, renew: true) in your own success/4 before store_in_session/2. This is a one-line change in application code and closes the controller sign-in path, though not remember-me auto-login, which does not pass through application code.

Add Plug.Conn.configure_session(conn, drop: true) at sign-out so a planted identifier does not survive a logout-then-login cycle.

Configurations

Exploitation for account takeover requires a server-side session store (ETS, Mnesia, Redis or a database), where the cookie carries a stable session identifier, and a position from which the attacker can plant that cookie in the victim's browser: cookie tossing from a sibling subdomain, an HTTP host without HSTS, or a shared or kiosk browser.

Phoenix defaults to the signed cookie store, and neither package's installer changes it. Under that store the authenticated session lives in the re-signed cookie delivered only to the victim, so a planted pre-authentication copy does not become an authenticated session. Attacker-planted session contents, such as a return_to value, still survive into the authenticated session there.

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