CVE-2025-67724: Tornado vulnerable to Header Injection and XSS via reason argument

Published Dec 12, 2025
·
Updated

Header injection and XSS via reason argument

Summary

The reason argument (used by both RequestHandler.setstatus and tornado.web.HTTPError is designed to allow applications to pass custom "reason" phrases (the "Not Found" in HTTP/1.1 404 Not Found) to the HTTP status line (mainly for non-standard status codes). Vulnerabilities exist in Tornado versions prior to 6.5.3 if untrusted data is passed as the reason argument.

Details

In vulnerable versions, the supplied reason phrase is used unescaped in HTTP headers (where it could be used for header injection) or in HTML in the default error page (where it could be used for XSS).

Impact

Type: Reflected Cross-Site Scripting (CWE-79) in default error page, or header injection (CWE-644) Actors: Remote attacker who can cause the application to raise HTTPError/setstatus with an attacker-controlled reason (e.g., via query parameter used by developer). Effect: Execution of arbitrary JavaScript in victims' browsers when they view the error page — possible session token theft, CSRF escalation, UI spoofing, or other client-side attacks depending on context. Scope: Only applications that explicitly reflect untrusted input into reason are affected.

Mitigation

Aside from upgrading to Tornado 6.5.3 or newer, the vulnerability can be mitigated by not using untrusted data for the reason argument. In the intended use case the reason argument would generally be a string literal and not derived from user input. Also, the reason argument is rarely required (reason phrases are not used at all in HTTP/2) and can generally be omitted.

For a general-purpose error message in HTTPError, consider using the logmessage argument instead of reason.

Other sources

Tornado is a Python web framework and asynchronous networking library. In versions 6.5.2 and below, the supplied reason phrase is used unescaped in HTTP headers (where it could be used for header injection) or in HTML in the default error page (where it could be used for XSS) and can be exploited by passing untrusted or malicious data into the reason argument. Used by both RequestHandler.setstatus and tornado.web.HTTPError, the argument is designed to allow applications to pass custom "reason" phrases (the "Not Found" in HTTP/1.1 404 Not Found) to the HTTP status line (mainly for non-standard status codes). This issue is fixed in version 6.5.3.

MITRE

Affected Software

5 affected componentsFixes available
pypi/tornado<=6.5.2
tornadoweb tornado<6.5.3
IBM Db2 Genius Hub<=1.1, 1.1.1, 1.1.2
IBM Agentics<=1.0
pip/tornado<6.5.3
6.5.3

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade pip/tornado to a version that resolves this vulnerability.

    Fixed in 6.5.3
  2. Upgrade

    Upgrade tornado to a version that resolves this vulnerability.

    Fixed in 6.5.3
  3. Configuration

    Mitigate by ensuring the `reason` argument passed to `tornado.web.HTTPError` and `RequestHandler.set_status` is not derived from untrusted input; prefer a string literal or omit the `reason` value.

    Tornado HTTPError / RequestHandler.set_status reason argument = Do not use untrusted/user-controlled data (use a string literal or omit it)

Event History

Dec 12, 2025
CVE Published
via MITRE·05:36 AM
Data Sourced
via MITRE·05:36 AM
DescriptionSeverityWeakness
Data Sourced
via NVD·06:15 AM
RemedyDescriptionSeverityWeaknessAffected Software
Jul 13, 2026
Data Sourced
via IBM·12:00 AM
DescriptionAffected Software
Jul 20, 2026
Advisory Published
via GitHub·06:55 PM
Data Sourced
via GitHub·06:55 PM
DescriptionSeverityWeaknessAffected Software

Parent advisories

This vulnerability appears in the following advisories.

Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the severity of CVE-2025-67724?

CVE-2025-67724 has a high severity rating due to the risk of header injection and XSS vulnerabilities.

2

How do I fix CVE-2025-67724?

To fix CVE-2025-67724, upgrade to Tornado version 6.5.3 or later.

3

What systems are affected by CVE-2025-67724?

CVE-2025-67724 affects Tornado versions 6.5.2 and below.

4

What types of vulnerabilities are present in CVE-2025-67724?

CVE-2025-67724 includes header injection vulnerabilities and potential XSS in the default error page.

5

Is there a workaround for CVE-2025-67724?

There is no official workaround recommended; the best protection is to upgrade to a secure version.

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