{"id":"CVE-2025-67724","aliases":["GHSA-pr2v-jx2c-wg9f","PYSEC-2025-265"],"url":"https://o3.security/vulnerability/CVE-2025-67724","summary":"Tornado vulnerable to Header Injection and XSS via reason argument","details":"# Header injection and XSS via `reason` argument\n\n## Summary\n\nThe `reason` argument (used by both `RequestHandler.set_status` 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.\n\n## Details\n\nIn 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).\n\n## Impact\n\n* **Type:** Reflected Cross-Site Scripting (CWE-79) in default error page, or header injection (CWE-644)\n* **Actors:** Remote attacker who can cause the application to raise `HTTPError`/`set_status` with an attacker-controlled `reason` (e.g., via query parameter used by developer).\n* **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.\n* **Scope:** Only applications that explicitly reflect untrusted input into `reason` are affected.\n\n## Mitigation\n\nAside 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.\n\nFor a general-purpose error message in HTTPError, consider using the `log_message` argument instead of `reason`.","published":"2025-12-12T05:36:59.992Z","modified":"2026-10-21T02:30:17.381490516Z","cvss":{"score":5.4,"severity":"MEDIUM","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N"},"epss":{"score":0.0024,"percentile":0.1529,"asOf":"2026-09-16"},"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"PyPI","name":"tornado","fixedVersion":"6.5.3"}],"fix":{"url":"https://github.com/tornadoweb/tornado/commit/9c163aebeaad9e6e7d28bac1f33580eb00b0e421","label":"tornadoweb/tornado@9c163ae"},"references":[{"type":"WEB","url":"https://github.com/tornadoweb/tornado/releases/tag/v6.5.3"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/67xxx/CVE-2025-67724.json"},{"type":"ADVISORY","url":"https://github.com/tornadoweb/tornado/security/advisories/GHSA-pr2v-jx2c-wg9f"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2025-67724"},{"type":"FIX","url":"https://github.com/tornadoweb/tornado/commit/9c163aebeaad9e6e7d28bac1f33580eb00b0e421"},{"type":"WEB","url":"https://github.com/pypa/advisory-database/tree/main/vulns/tornado/PYSEC-2025-265.yaml"},{"type":"PACKAGE","url":"https://github.com/tornadoweb/tornado"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-10-21T02:30:17.381490516Z"}}