Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain refresh token as org member
-
DeliveryMembership or session ends
-
ExploitPresent retained refresh token to CDN
-
ExecutionCDN authorizes from scope claim only
-
ImpactDownload private packages and docs
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V7 - Session Management Session expiration enforcement
|
| Exploitation Conditions | Exploitation requires that the attacker already possess a valid OAuth refresh token issued by hex.pm while they were a member of the target private organization, AND that their organization membership or session has since been terminated. The flaw is reachable because private-repository requests are served by a CDN that verifies only the JWT signature and time claims and authorizes from the embedded repository:<org> scope, performing no database membership lookup and unable to distinguish refresh tokens from access tokens. Limiting factors: access is read-only, confined strictly to organizations the account belonged to at token-grant time, and self-expires when the 30-day refresh token lapses; the actor must have been an authenticated member (not an external unauthenticated party), so this is fundamentally an offboarding/revocation-window exposure rather than open remote compromise. |
| Impact | This is a genuinely low-priority issue and the signals are internally consistent. The vendor CVSS 4.0 base score is 2.3 (AV:N/AC:L/AT:P/PR:L/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N): network-reachable but requiring a specific attack precondition (AT:P), authenticated (PR:L), and limited to low confidentiality impact with no integrity or availability effect. No EPSS score was provided, the CVE is not in CISA KEV, and no public proof-of-concept was supplied - so there is no public exploit identified at time of analysis. The impact is narrow by design: read-only access, scoped only to organizations the account already belonged to when the token was granted, and self-limiting to the 30-day refresh-token lifetime. There is no privilege escalation, no write, and no path to new data the actor did not previously have visibility into as a member. The realistic risk is an insider/offboarding-window exposure (a removed member or ended session retaining access for up to 30 days) rather than mass or opportunistic exploitation. No conflicting signals: CVSS network vector aligns with the CDN-token architecture described, and the low score matches the read-only, precondition-gated nature. Note the AT:P (4.0) precondition - possession of a still-valid refresh token issued during membership - is a real limiter that raw 'network vector' framing could understate. |
| Exploit ScenarioDerived | A developer who was a member of a private hex.pm organization is removed from that organization (or their session is revoked), but they retain the OAuth refresh token issued while they were a member. Because the CDN that serves private repositories authorizes requests purely from the signed scope claim without any database lookup, the former member continues pulling the organization's private packages and documentation tarballs until the 30-day refresh token expires. No public exploit code is required or identified; the attacker simply keeps using a token they already legitimately hold. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 22, 2026
Retained OAuth refresh tokens on hex.pm allow a user whose organization membership or session has ended to keep reading that organization's private packages and documentation tarballs. Refresh tokens are issued with the same issuer, audience and repository:<org> scope claims as access tokens, and the CDN that serves private repositories validates only the JWT signature and time claims, performing no membership lookup and unable to tell the two token types apart, so revocation takes effect only when the 30-day refresh token expires instead of at the 30-minute access-token lifetime. The actor must be an authenticated party who was a member when the token was granted, access is read-only and limited to organizations the account belonged to at grant time, and no public exploit has been identified at time of analysis; CVSS 4.0 base score is 2.3 (independent assessment CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N).
RemediationAI
Vendor-released patch is available per the advisory at https://github.com/hexpm/hexpm/security/advisories/GHSA-vmw7-7g2w-gw2f, with the upstream fix commits db58cf3a86c7639708ef52ff86de0b4f938e6360 and 650faa03af511e74c1b3b49ec12d35666b6984c4 distinguishing access from refresh tokens by expanding the aggregate 'repositories' scope into explicit 'repository:{org}' scopes on access tokens (and dropping the parent_jti claim); a released version number is not independently confirmed from the provided data, so operators should track the advisory for the tagged release. Where immediate upgrade is not possible, compensating controls with trade-offs include: shorten the refresh-token lifetime below the current 30 days so the stale-capability window closes sooner (side effect: legitimate users must re-authenticate more often); invalidate outstanding refresh tokens by rotating the JWT signing key or, if the system supports it, revoking refresh tokens by jti on offboarding so consent removal is immediately effective (side effect: all active sessions, including legitimate ones, are terminated and clients must re-authorize); and adding a short-lived membership check or revocation denylist at the CDN edge, which restores the revoked-access guarantee but reintroduces the database/edge lookup the capability design was intended to avoid and adds latency and cache-invalidation complexity.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The issue is an insufficient session expiration flaw (CWE-613) in hex.pm's OAuth 2.0 token issuance. In lib/hexpm/oauth/jwt.ex, generate_refresh_token/4 signs refresh tokens with the same iss, aud and scope claims as access tokens, including repository:<org> capabilities, so the two token kinds are indistinguishable to downstream verifiers. The CDN edge that serves private repositories authorizes requests solely from the signed scope claim and the time claims, deliberately avoiding a database lookup; this capability-based edge design is what makes the stale refresh token usable after membership removal or session revocation. The affected code path is the OAuth/JWT module in the hexpm project (CPE cpe:2.3:a:hexpm:hexpm), an Elixir/Phoenix package registry, and the ADR-like fix refactors permissions by expanding the aggregate 'repositories' scope into per-organization 'repository:{org}' scopes for access tokens via Permissions.expand_repositories_scope/2 while leaving refresh tokens with the aggregate scope, and drops the parent_jti claim.
Know when Hexpm gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N
Network-served CDN (AV:N), attacker must have held a member-issued token so PR:L; read-only exposure of private package data gives C:L with no integrity or availability impact.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Insufficient Session Expiration vulnerability in OAuth token issuance in hexpm hexpm allows a user whose organization membership or session has ended to keep reading the organization's private packages and their documentation tarballs via a retained refresh token.
generate_refresh_token/4 in lib/hexpm/oauth/jwt.ex signs the refresh token with the same iss, aud and scope claims as the access token, so it carries the same repository:<org> scopes. The CDN service that serves private repositories verifies the signature and time claims and then authorizes from the scope claim, with no database lookup and no way to tell the two token kinds apart. Removing a member or revoking a session therefore takes effect at the CDN only when the 30 day refresh token expires, instead of after the 30 minute access token lifetime. Access is read-only and limited to organizations the account belonged to when the token was granted.
This issue affects hex.pm: from 2025-10-10 before 2026-09-22.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Insufficient session expiration in hexpm. Password reset tokens never expire, enabling persistent account takeover.
Silent dependency checksum bypass in hexpm/hex package manager (versions 0.16.0 through 2.4.1) allows attackers to subst
Improper input sanitization in hexpm's SharedAuthorizationView module allows unauthenticated attackers to inject malicio
Incorrect authorization in the hex.pm OAuth `client_credentials` endpoint allows any API key bearing the `repositories`
Path traversal in the Hex package manager for the Elixir/Erlang (Mix) ecosystem, versions 0.6.0 through 2.5.1, lets a ma
Hex, the package manager used by Elixir and Erlang projects, fails to properly scope its 'release-age cooldown' protecti
An uncontrolled resource consumption vulnerability in the Hex.pm package manager allows authenticated attackers to cause
Hexpm's OAuth implementation fails to enforce read-only API key restrictions during token exchange, allowing an attacker
Integrity-check bypass in the Hex package manager (hexpm hex) allows a compromised or attacker-controlled package mirror
Path traversal in hexpm's Local Storage backend allows unauthenticated attackers to read sensitive files through relativ
Improper TLS server-certificate validation in hex_core (0.1.0 through versions before 0.20.0) lets an attacker who alrea
Improper certificate validation in Hex (the Elixir/Erlang package manager client, versions 0.20.2 through 2.5.1) allows
EUVD-2026-84539
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB