<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://vulnerability.circl.lu/rss/recent/all/10</id>
  <title>Most recent entries from all</title>
  <updated>2026-10-05T19:49:26.909684+00:00</updated>
  <author>
    <name>Vulnerability-Lookup</name>
    <email>info@circl.lu</email>
  </author>
  <link href="https://vulnerability.circl.lu" rel="alternate"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator>
  <subtitle>Contains only the most 10 recent entries.</subtitle>
  <entry>
    <id>https://vulnerability.circl.lu/vuln/brew-jupyterlab-cve-2026-82397</id>
    <title>BREW-jupyterlab-CVE-2026-82397 — Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop</title>
    <updated>2026-10-05T19:49:27.215697+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> Homebrew: jupyterlab</p>
<p>## Summary</p>
<p>Tornado parses `application/x-www-form-urlencoded` bodies with `urllib.parse.parse_qs` and does not pass `max_num_fields`. A body made almost entirely of separators produces tens of millions of fields, and the parse happens on the event loop before the handler runs, so a single request stalls the whole server.</p>
<p>## Where it is</p>
<p>`tornado/escape.py`, at HEAD `e530031405e2154654dedc4c84d5656b557ea310`:</p>
<p>```python
result = urllib.parse.parse_qs(
    qs, keep_blank_values, strict_parsing, encoding="latin1", errors="strict"
)
```</p>
<p>`max_num_fields` is the parameter CPython added for exactly this, and it is absent.</p>
<p>The path to it is entirely server-side and pre-dispatch. `RequestHandler._execute` parses the body at `tornado/web.py:1821`, which reaches `HTTPServerRequest._parse_body` at `tornado/httputil.py:636`, and the urlencoded branch of `parse_body_arguments` calls `parse_qs_bytes` at `tornado/httputil.py:1030`.</p>
<p>The size that reaches it is bounded only by the body cap, which defaults to the stream's `max_buffer_size` of 104857600 at `tornado/iostream.py:239`, applied as the request body default at `tornado/http1connection.py:136-140`. A 100 MB body of separators is around fifty million fields.</p>
<p>## Impact</p>
<p>Denial of service against the whole process, not one request. Tornado is single-threaded and the parse is synchronous on the event loop, so every other connection waits. No authentication is needed if any route accepts a form post, which is the normal case.</p>
<p>## Sug…</p></div>
    </content>
    <link href="https://vulnerability.circl.lu/vuln/brew-jupyterlab-cve-2026-82397"/>
  </entry>
  <entry>
    <id>https://vulnerability.circl.lu/vuln/cve-2026-82397</id>
    <title>CVE-2026-82397 — Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop</title>
    <updated>2026-10-05T19:49:27.216069+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> tornadoweb tornado</p>
<p>Tornado is a Python web framework and asynchronous networking library. Prior to 6.5.8, Tornado parses application/x-www-form-urlencoded request bodies with urllib.parse.parse_qs in tornado/escape.py without passing max_num_fields. RequestHandler._execute in tornado/web.py parses the body before handler dispatch through HTTPServerRequest._parse_body and parse_body_arguments in tornado/httputil.py, so an unauthenticated request body containing millions of separator-delimited fields can synchronously stall the single-threaded event loop and delay every connection. The body is bounded only by max_buffer_size, which defaults to 104857600 bytes. This issue is fixed in version 6.5.8.</p></div>
    </content>
    <link href="https://vulnerability.circl.lu/vuln/cve-2026-82397"/>
  </entry>
  <entry>
    <id>https://vulnerability.circl.lu/vuln/pysec-2026-3928</id>
    <title>PYSEC-2026-3928 — Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop</title>
    <updated>2026-10-05T19:49:27.216153+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> PyPI: tornado</p>
<p>## Summary</p>
<p>Tornado parses `application/x-www-form-urlencoded` bodies with `urllib.parse.parse_qs` and does not pass `max_num_fields`. A body made almost entirely of separators produces tens of millions of fields, and the parse happens on the event loop before the handler runs, so a single request stalls the whole server.</p>
<p>## Where it is</p>
<p>`tornado/escape.py`, at HEAD `e530031405e2154654dedc4c84d5656b557ea310`:</p>
<p>```python
result = urllib.parse.parse_qs(
    qs, keep_blank_values, strict_parsing, encoding="latin1", errors="strict"
)
```</p>
<p>`max_num_fields` is the parameter CPython added for exactly this, and it is absent.</p>
<p>The path to it is entirely server-side and pre-dispatch. `RequestHandler._execute` parses the body at `tornado/web.py:1821`, which reaches `HTTPServerRequest._parse_body` at `tornado/httputil.py:636`, and the urlencoded branch of `parse_body_arguments` calls `parse_qs_bytes` at `tornado/httputil.py:1030`.</p>
<p>The size that reaches it is bounded only by the body cap, which defaults to the stream's `max_buffer_size` of 104857600 at `tornado/iostream.py:239`, applied as the request body default at `tornado/http1connection.py:136-140`. A 100 MB body of separators is around fifty million fields.</p>
<p>## Impact</p>
<p>Denial of service against the whole process, not one request. Tornado is single-threaded and the parse is synchronous on the event loop, so every other connection waits. No authentication is needed if any route accepts a form post, which is the normal case.</p>
<p>## Sug…</p></div>
    </content>
    <link href="https://vulnerability.circl.lu/vuln/pysec-2026-3928"/>
  </entry>
</feed>
