Repository navigation
fix(api): identify client_credentials tokens by a signed grant marker + 3.3.8 changelog - #8329
Conversation
The HTTP API treated any JWT whose sub matched a configured client_id as a client_credentials token and skipped the admin === true check, so a user whose username collided with a client ID got admin API access with a non-admin authorization_code token. The provider now signs an etherpad_grant marker into client_credentials tokens (not overridable by extraParams) and the API relies on it. Reported by Yves Soete of Blacksight LLC (BS-2026-063). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WnNeNQpAJ5TWNZka4yugCw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012cFUmwE79DiLX4VsJqoTZV
|
ⓘ Qodo reviews are paused because the subscription is no longer active. Ask your workspace admin to reactivate the subscription to resume reviews. Manage billing |
PR Summary by QodoFix HTTP API privilege escalation from colliding OIDC identities
AI Description
Diagram
High-Level Assessment
Files changed (6)
|
Code Review by Qodo🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)
Great, no issues found!Qodo reviewed your code and found no material issues that require reviewTip of the day💡 Did you know, you can tweak Display settings with a live preview to see your comment before it ships |
Fix for GHSA-38vj-95q4-gwvx (Medium, CWE-863), plus the CHANGELOG entry for 3.3.8.
The HTTP API classified a JWT as client_credentials when
submatched a configuredclient_id, which skipped theadmin === truecheck. The provider now signsetherpad_grant: 'client_credentials'into client_credentials tokens (extraParamscan't override it), andisApiTokenAuthorized()relies on that marker.Tests: 2 API tests in
api/jwtAdminClaim.tsfail on old code and pass with the fix, and there's unit coverage inOidcProviderSecurity.ts. Full backend suite: 1837 passing; the single failure is the known #7885.Upgrade note: client_credentials tokens issued before the upgrade are refused with 401 until they're re-issued (they're short-lived).
Reported by Yves Soete of Blacksight LLC (@yssoe).
🤖 Generated with Claude Code
https://claude.ai/code/session_012cFUmwE79DiLX4VsJqoTZV