CVE-2026-62662: Pocket ID · The client credentials grant allows any OIDC client to obtain tokens for arbitrary audiences
Affects github.com/pocket-id/pocket-id/backendSource GCVE Database
Not known to be exploited · CVSS 7.7 High : upgrade to 0.0.0-20260622164202-8158452b3730 soon.
Data as of 9 Nov 2026, 23:24 UTC
Thin evidence
One scorer or none| CNA (GitHub_M) | CVSS 3.0 | 7.7 |
|---|
- EPSS
- 0.2% chance of exploitation in 30 days – higher than 18% of CVEsExploit Prediction Scoring System: the likelihood attackers will use this flaw soon.
- Patch
- Available – fixed in 0.0.0-20260622164202-8158452b3730
CVSS:3.0/AV:N/AC:H/PR:H/UI:N/S:C/C:H/I:H/A:NExploitation evidence
Disclosed: evidence found.
CVE published 4 Nov 2026
Detectable: no evidence on record.
No public nuclei template indexed
Weaponized: no evidence on record.
No public exploit code indexed in Metasploit or Exploit-DB
Exploited in the wildExploited: no evidence on record.
Not in CISA KEV and no source reports exploitation
Observed by OffSeq MirageSeen by Mirage: no evidence on record.
No attack traffic recorded by OffSeq Mirage sensors
A missing step is not evidence of safety. Sources: cve.org (opens in a new tab), the Metasploit, Exploit-DB and nuclei-templates index as of 9 Nov 2026.
What to do
Upgrade github.com/pocket-id/pocket-id/backend to 0.0.0-20260622164202-8158452b3730.
Affected software
| Product | Affected | Fixed in |
|---|---|---|
| Gogithub.com/pocket-id/pocket-id/backend | Affected
| Fixed in
|
Check your own hosts for these packages with threat-finder (opens in a new tab), our free open-source scanner.
Description
## Summary The client credentials grant (`grant_type=client_credentials`) does not validate the resource parameter before embedding it as the aud claim in the issued JWT. Any authenticated OIDC client can obtain a Pocket ID-signed access token claiming authorization for any arbitrary audience, including other registered OIDC clients. There is no check that the requested audience is a registered resource server, and no check that the requesting client has been granted permission to access it. ## Details In `backend/internal/service/oidc_service.go`, `createTokenFromClientCredentials` accepts the resource parameter from the token request and places it directly into the `aud` claim of the issued JWT without validation: ```golang audClaim := client.ID if input.Resource != "" { audClaim = input.Resource // no validation performed } accessToken, err := s.jwtService.GenerateOAuthAccessToken(dummyUser, audClaim) ``` The only guard in this function is `verifyClientCredentialsInternal`, which confirms the requesting client's credentials are valid. After that check passes, any value supplied as resource is accepted. There is no registry of permitted audiences, no per-client authorization policy controlling which resources a client may request tokens for, and no validation that the resource value corresponds to anything registered in Pocket ID. The introspection endpoint (`/api/oidc/introspect`) does not mitigate this. It checks that the introspecting client's ID matches the token's `aud` claim, but since the attacker controls `aud`, a resource server calling introspection to validate an inbound token will receive `"active": true`. Pocket ID has no server-side record of which client requested the token or whether it was authorized to do so, so introspection cannot distinguish a legitimately issued token from one obtained through this vulnerability. ## PoC Given a Pocket ID instance with two registered OIDC clients — `client-a` (attacker-controlled) and `client-b` (target resource) — the following request causes Pocket ID to issue a signed JWT with `aud: ["client-b"]`, authenticated only as `client-a`: ``` curl -X POST https://<pocket-id-host>/api/oidc/token \ -d "grant_type=client_credentials" \ -d "client_id=client-a" \ -d "client_secret=<client-a-secret>" \ -d "resource=client-b" ``` The response is a valid, Pocket ID-signed JWT with: ```json { "sub": "client-client-a", "aud": ["client-b"], "iss": "https://<pocket-id-host>", "type": "oauth-access-token" } ``` This token will pass signature and `aud` validation at any resource server that trusts Pocket ID's JWKS and accepts `client-b` as its audience identifier. ## Impact Any OIDC client registered in Pocket ID that has valid credentials (client secret or federated identity) can obtain a Pocket ID-signed access token scoped to any other registered client or arbitrary audience string. In deployments where services use the client credentials grant and validate incoming bearer tokens against Pocket ID's JWKS, this allows a compromised or malicious client to bypass audience-based access controls and present tokens to resource servers it should not be authorized to access. The severity depends on deployment: if no resource servers validate Pocket ID-issued access tokens, there is no immediate exploitable impact. In deployments that do rely on the client credentials grant for service-to-service authorization, the isolation between services is entirely broken.
References
- github.com/pocket-id/pocket-id/security/advisories/GHSA-q4xm-p75h-h9p3 (opens in a new tab)
- nvd.nist.gov/vuln/detail/CVE-2026-62662 (opens in a new tab)
- github.com/pocket-id/pocket-id/pull/1520 (opens in a new tab)
- github.com/pocket-id/pocket-id/commit/8158452b37304115c97c61c3a56082ce938ce6f0 (opens in a new tab)
- github.com/pocket-id/pocket-id (opens in a new tab)
- github.com/pocket-id/pocket-id/releases/tag/v2.10.0 (opens in a new tab)