eef-cve-2026-86688

CVSS 7.4 osv_hex
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.

Timeline
Published
unknown
Last Modified
unknown
CVSS Details

CVSS details not available.

Affected Products

No product information available.

Weaknesses (CWE)
References
Linked Vulnerabilities

No linked vulnerabilities found.

{
  "affected": [
    {
      "database_specific": {
        "source": "https://cna.erlef.org/osv/EEF-CVE-2026-86688.json"
      },
      "package": {
        "ecosystem": "Hex",
        "name": "ash_authentication",
        "purl": "pkg:hex/ash_authentication"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.2.0"
            },
            {
              "fixed": "4.15.0"
            }
          ],
          "type": "SEMVER"
        },
        {
          "events": [
            {
              "introduced": "5.0.0-rc.0"
            },
            {
              "fixed": "5.0.0-rc.14"
            }
          ],
          "type": "SEMVER"
        }
      ],
      "versions": [
        "3.0.3",
        "3.1.0",
        "3.10.0",
        "3.10.1",
        "3.10.2",
        "3.10.3",
        "3.10.4",
        "3.10.5",
        "3.10.6",
        "3.10.7",
        "3.10.8",
        "3.11.0",
        "3.11.1",
        "3.11.10",
        "3.11.11",
        "3.11.12",
        "3.11.13",
        "3.11.14",
        "3.11.15",
        "3.11.16",
        "3.11.2",
        "3.11.3",
        "3.11.4",
        "3.11.5",
        "3.11.6",
        "3.11.7",
        "3.11.8",
        "3.11.9",
        "3.12.0",
        "3.12.1",
        "3.12.2",
        "3.12.3",
        "3.12.4",
        "3.2.0",
        "3.2.1",
        "3.2.2",
        "3.3.0",
        "3.3.1",
        "3.5.0",
        "3.5.1",
        "3.5.2",
        "3.5.3",
        "3.6.0",
        "3.6.1",
        "3.7.0",
        "3.7.1",
        "3.7.2",
        "3.7.3",
        "3.7.4",
        "3.7.5",
        "3.7.6",
        "3.7.8",
        "3.7.9",
        "3.8.0",
        "3.9.0",
        "3.9.1",
        "3.9.2",
        "3.9.3",
        "3.9.4",
        "3.9.5",
        "3.9.6",
        "4.0.0",
        "4.0.0-rc.0",
        "4.0.0-rc.1",
        "4.0.0-rc.2",
        "4.0.0-rc.3",
        "4.0.0-rc.5",
        "4.0.0-rc.6",
        "4.0.1",
        "4.0.2",
        "4.0.3",
        "4.0.4",
        "4.1.0",
        "4.10.0",
        "4.11.0",
        "4.12.0",
        "4.13.0",
        "4.13.1",
        "4.13.2",
        "4.13.3",
        "4.13.4",
        "4.13.5",
        "4.13.6",
        "4.13.7",
        "4.14.0",
        "4.14.1",
        "4.14.2",
        "4.2.0",
        "4.2.1",
        "4.2.2",
        "4.2.3",
        "4.2.4",
        "4.2.5",
        "4.2.6",
        "4.2.7",
        "4.3.0",
        "4.3.1",
        "4.3.10",
        "4.3.11",
        "4.3.12",
        "4.3.2",
        "4.3.3",
        "4.3.4",
        "4.3.5",
        "4.3.6",
        "4.3.7",
        "4.3.8",
        "4.3.9",
        "4.4.0",
        "4.4.1",
        "4.4.2",
        "4.4.3",
        "4.4.4",
        "4.4.5",
        "4.4.6",
        "4.4.7",
        "4.4.8",
        "4.4.9",
        "4.5.0",
        "4.5.1",
        "4.5.2",
        "4.5.3",
        "4.5.4",
        "4.5.5",
        "4.5.6",
        "4.6.0",
        "4.6.1",
        "4.6.2",
        "4.6.3",
        "4.6.4",
        "4.7.0",
        "4.7.1",
        "4.7.2",
        "4.7.3",
        "4.7.4",
        "4.7.5",
        "4.7.6",
        "4.8.0",
        "4.8.1",
        "4.8.2",
        "4.8.3",
        "4.8.5",
        "4.8.6",
        "4.8.7",
        "4.9.0",
        "4.9.1",
        "4.9.2",
        "4.9.3",
        "4.9.4",
        "4.9.5",
        "4.9.6",
        "4.9.7",
        "4.9.8",
        "4.9.9",
        "5.0.0-rc.0",
        "5.0.0-rc.1",
        "5.0.0-rc.10",
        "5.0.0-rc.11",
        "5.0.0-rc.12",
        "5.0.0-rc.13",
        "5.0.0-rc.2",
        "5.0.0-rc.3",
        "5.0.0-rc.4",
        "5.0.0-rc.5",
        "5.0.0-rc.6",
        "5.0.0-rc.7",
        "5.0.0-rc.8",
        "5.0.0-rc.9"
      ]
    },
    {
      "database_specific": {
        "source": "https://cna.erlef.org/osv/EEF-CVE-2026-86688.json"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "a939dde9b917c072cdf10c4b0913a9886a4b0231"
            },
            {
              "fixed": "872db454405ecad4fcdabd9ff3d8755d1d6a69ae"
            },
            {
              "fixed": "3e1d452cbf1564e87f5f97be882b66fe25af7cfa"
            }
          ],
          "repo": "https://github.com/team-alembic/ash_authentication",
          "type": "GIT"
        }
      ],
      "versions": [
        "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"
      ]
    }
  ],
  "aliases": [
    "CVE-2026-86688",
    "GHSA-v577-944g-7h3x"
  ],
  "credits": [
    {
      "name": "Peter Ullrich",
      "type": "REPORTER"
    },
    {
      "name": "James Harton",
      "type": "REMEDIATION_DEVELOPER"
    },
    {
      "name": "Jonatan Männchen / EEF",
      "type": "COORDINATOR"
    }
  ],
  "database_specific": {
    "capec_ids": [
      "CAPEC-61"
    ],
    "cpe_ids": [
      "cpe:2.3:a:team-alembic:ash_authentication:*:*:*:*:*:*:*:*"
    ],
    "cwe_ids": [
      "CWE-384"
    ]
  },
  "details": "## Summary\n\nSession 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.\n\n`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.\n\nThis 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.\n\n## Impact\n\nAn 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.\n\n## Workarounds\n\nCall `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.\n\nAdd `Plug.Conn.configure_session(conn, drop: true)` at sign-out so a planted identifier does not survive a logout-then-login cycle.\n\n## Configurations\n\nExploitation 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.\n\nPhoenix 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.",
  "id": "EEF-CVE-2026-86688",
  "modified": "2026-09-17T22:11:00.019764599Z",
  "published": "2026-09-17T21:58:00.853Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://github.com/team-alembic/ash_authentication/security/advisories/GHSA-v577-944g-7h3x"
    },
    {
      "type": "WEB",
      "url": "https://cna.erlef.org/cves/CVE-2026-86688.html"
    },
    {
      "type": "WEB",
      "url": "https://github.com/team-alembic/ash_authentication/commit/a939dde9b917c072cdf10c4b0913a9886a4b0231"
    },
    {
      "type": "FIX",
      "url": "https://github.com/team-alembic/ash_authentication/commit/872db454405ecad4fcdabd9ff3d8755d1d6a69ae"
    },
    {
      "type": "FIX",
      "url": "https://github.com/team-alembic/ash_authentication/commit/3e1d452cbf1564e87f5f97be882b66fe25af7cfa"
    },
    {
      "type": "PACKAGE",
      "url": "https://hex.pm/packages/ash_authentication"
    }
  ],
  "schema_version": "1.9.0",
  "severity": [
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
      "type": "CVSS_V4"
    }
  ],
  "summary": "Session id is not renewed on authentication in ash_authentication, allowing session fixation"
}
View JSON API Download JSON