CVE-2026-54510: Speakr: CSRF bypass via unauthenticated API token parameter in csrf_exempt_for_api_tokens hook

Published Sep 17, 2026
·
Updated

Speakr is a personal, self-hosted web application designed for transcribing audio recordings. Prior to 0.8.21-alpha, the csrfexemptforapitokens() beforerequest hook in src/app.py calls csrf.exempt(viewfunc), permanently adding the selected view to Flask-WTF's process-global exemption set. The istokenauthenticated() function in src/utils/tokenauth.py calls extracttokenfromrequest() and treats any present token, including request.args.get('token'), as authenticated without hashing the token, querying the database, or checking validity. A network-reachable attacker can therefore send a false token to disable CSRF protection for the targeted view for the worker lifetime. Because the exemption applies to the view function across HTTP methods, a cross-origin GET to /account with a query token can poison CSRF state for a later state-changing POST without triggering CORS preflight. This browser sequence requires attacker-controlled content on a sibling subdomain under the documented cookie conditions. The bypass can modify profile data, custom prompts, transcription settings, preferences, and administrative status through routes such as admintoggleadmin. The changepassword route also skips current-password verification when currentuser.password is empty, allowing the chain to set a local password on an SSO-only account and bypass SSO. This issue is fixed in version 0.8.21-alpha.

Affected Software

1 affected component
Speakr<0.8.21-alpha

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade Speakr to a version that resolves this vulnerability.

    Fixed in 0.8.21-alpha
  2. Compensating control

    Ensure the attacker cannot execute cross-origin requests with attacker-controlled query tokens against Speakr (e.g., prevent sibling-subdomain token poisoning under the documented cookie conditions by tightening cookie/domain scope and cross-site request exposure).

Event History

Sep 17, 2026
CVE Published
via MITRE·08:20 PM
Data Sourced
via MITRE·08:20 PM
DescriptionSeverityWeakness

Frequently Asked Questions

1

Which deployments are realistically exposed to cross-site exploitation?

The described browser attack requires attacker-controlled content on a sibling subdomain and the documented cookie conditions. The attacker must also be able to reach the Speakr instance over the network.

2

Does an attacker need a valid API token or an existing account?

No valid token is required for the CSRF bypass described: any token supplied in the request, including the token query parameter, is treated as authenticated without validation. The affected state-changing requests rely on a victim's authenticated browser session.

3

Why can a seemingly harmless GET request affect later requests?

A cross-origin GET to /account with a false query token can add the targeted view to Flask-WTF's process-global CSRF exemption set. That exemption persists for the worker lifetime and applies to the view across HTTP methods, enabling a later state-changing POST without CSRF protection.

4

What impact can the bypass have?

It can modify profile data, custom prompts, transcription settings, preferences, and administrative status through affected routes such as admin_toggle_admin. The description indicates that the password-change route is excluded or otherwise limited, but its full behavior is not provided.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203