Skip to content

πŸ›‘οΈ Sentinel: [HIGH] Fix privilege escalation in TOTP management - #367

Closed
arumes31 wants to merge 2 commits into
mainfrom
fix/admin-totp-escalation-10139628826050809997
Closed

πŸ›‘οΈ Sentinel: [HIGH] Fix privilege escalation in TOTP management#367
arumes31 wants to merge 2 commits into
mainfrom
fix/admin-totp-escalation-10139628826050809997

Conversation

@arumes31

Copy link
Copy Markdown
Owner

🚨 Severity: HIGH
πŸ’‘ Vulnerability: Privilege Escalation/Account Takeover risk. Admins with manage_admins permissions could use the /admin_management/change_totp or /admin_management/get_qr/:username endpoints to reset or view the TOTP secret of the system's primary root administrator (GUIAdmin), potentially leading to account takeover of the highest-privileged account.
🎯 Impact: Unauthorized access to the GUIAdmin account, leading to complete system compromise.
πŸ”§ Fix: Added explicit checks in ChangeAdminTOTP and GetQR handlers to return a 403 Forbidden if the requested username matches the configured GUIAdmin.
βœ… Verification: Verified that attempting to manage the TOTP secret of the GUIAdmin now correctly returns an error and prevents the action. Run tests using go test ./internal/api/... and ensure they pass.


PR created automatically by Jules for task 10139628826050809997 started by @arumes31

Co-authored-by: arumes31 <114224498+arumes31@users.noreply.github.com>
@google-labs-jules

Copy link
Copy Markdown
Contributor

πŸ‘‹ Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a πŸ‘€ emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

βš™οΈ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 13055d42-edd1-4886-86b0-c422e985ee55

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • πŸ” Trigger review
✨ Finishing Touches
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/admin-totp-escalation-10139628826050809997

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands.

Co-authored-by: arumes31 <114224498+arumes31@users.noreply.github.com>
@arumes31

Copy link
Copy Markdown
Owner Author

Superseded by #374 β€” thank you, the authorization gap you identified is real and the fix has landed there.

Worth recording why the fix went further than the GUIAdmin guard proposed here. The deeper flaw is that GetQR served any account's TOTP secret to any holder of manage_admins, not only the main admin's. Whoever reads that secret can generate the account's codes indefinitely, so guarding GUIAdmin alone still left every other admin impersonatable.

Enrollment is entirely self-service through the login flow, which already refuses to overwrite an enrolled token β€” so handing one account's QR to a different user had no legitimate workflow behind it. The template already hid these buttons for GUIAdmin, which meant the protection was client-side only while the API enforced nothing.

#374 keeps your GUIAdmin guard and adds: GetQR scoped to the caller's own account, no QR for an unenrolled (empty) secret, and SudoMiddleware on TOTP reset to match the re-authentication that account deletion already required.

One note for future runs: this PR did not carry the Go 1.26.4 -> 1.26.5 bump, so its build failure was the repo-wide govulncheck GO-2026-5856 failure rather than anything wrong with your change. #374 fixes that pin.

@arumes31 arumes31 closed this Jul 27, 2026
@google-labs-jules

Copy link
Copy Markdown
Contributor

Superseded by #374 β€” thank you, the authorization gap you identified is real and the fix has landed there.

Worth recording why the fix went further than the GUIAdmin guard proposed here. The deeper flaw is that GetQR served any account's TOTP secret to any holder of manage_admins, not only the main admin's. Whoever reads that secret can generate the account's codes indefinitely, so guarding GUIAdmin alone still left every other admin impersonatable.

Enrollment is entirely self-service through the login flow, which already refuses to overwrite an enrolled token β€” so handing one account's QR to a different user had no legitimate workflow behind it. The template already hid these buttons for GUIAdmin, which meant the protection was client-side only while the API enforced nothing.

#374 keeps your GUIAdmin guard and adds: GetQR scoped to the caller's own account, no QR for an unenrolled (empty) secret, and SudoMiddleware on TOTP reset to match the re-authentication that account deletion already required.

One note for future runs: this PR did not carry the Go 1.26.4 -> 1.26.5 bump, so its build failure was the repo-wide govulncheck GO-2026-5856 failure rather than anything wrong with your change. #374 fixes that pin.

Understood. Acknowledging that this work is now obsolete and superseded by #374, which implemented a more comprehensive fix restricting GetQR to the caller's own account. Stopping work on this task.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant