Quart leaks raw request body (incl. plaintext passwords) to stdout via stray debug print in Body.__await__
GHSA-v853-p72q-4cfw · published 5 Oct 2026
How serious is it
- Severity: high, CVSS score 7.5 out of 10.
- No exploit prediction (EPSS) score yet.
- Not on the CISA list of exploited vulnerabilities.
- No public exploit in Exploit-DB.
Is your app affected by GHSA-v853-p72q-4cfw?
Paste this prompt into Claude Code, Cursor or any AI coding tool: it runs a free Shippable scan of your project and fixes what it finds. Built with Lovable, Bolt or v0? Scan your live app. Or upload your package file.
Who is affected
quart(PyPI) = 0.23.0
How to check
- Run
pip show quartin your project to see the installed version, including copies pulled in by other packages. - Or paste your lockfile into the checker: it lists every package with a known vulnerability, this one included.
- Or run
npx shippable-dev scan localhost:3000in your project folder. It reads your lockfile and flags this vulnerability along with every other known one.
How to fix
Copies a prompt for Claude Code, Cursor or Codex: it checks your lockfiles for this and upgrades it.
- Upgrade
quartto 0.23.1 or later, commit the lockfile and redeploy. - If a vulnerable version was live, check your logs and rotate the secrets that server could read.
The advisory
### Summary
Quart 0.23.0 contains a stray debug statement (`print(data)`) inside `Body.__await__` in `quart/wrappers/request.py`. Any request whose body is awaited — `await request.form`, `await request.get_data()`, WTForms `validate_on_submit()`, etc. — has its raw, unparsed body printed to stdout, including plaintext form fields such as passwords and CSRF tokens. Confirmed present in 0.23.0, confirmed absent in 0.22.0.
### Details
In `src/quart/wrappers/request.py`, `Body.__await__` accumulates the request body into a bytearray:
```python
data = bytearray()
while not self._queue.empty():
data.extend(self._queue.get_nowait())
print(data) # <-- not present in 0.22.0
if (
self._max_content_length is not None
and len(data) > self._max_content_length
):
raise RequestEntityTooLarge()
```
This fires for every request that awaits its body — the overwhelming majority of POST/PUT routes in a typical Quart app (form submissions, JSON APIs via `request.get_json()`, file uploads, etc.).
### PoC
1. `pip install quart==0.23.0` (requires Python 3.13+)
2. Minimal route:
```python
@app.route("/login", methods=["POST"])
async def login():
form_data = await request.form
...
```
3. Submit a POST with form data, e.g. a login form with `staff_id`/`password` fields.
4. Observe stdout: the full raw body is printed as `bytearray(b'csrf_token=...&staff_id=...&password=...')`.
Confirmed via source diff against 0.22.0's `request.py`, where this line does not exist.
### Impact
Any app that captures stdout in logs (terminal redirect, systemd/journald, Docker logs, cloud log aggregation, etc.) will have every submitted form body — including login credentials — written to logs in plaintext. This affects any Quart 0.23.0 app handling authentication or any sensitive form data, and is trivially triggerable by any user simply submitting a form (no attacker action required beyond normal use).
Check your whole app
Dependencies are only half of it. Free and read-only: before you push, run npx shippable-dev scan localhost:3000 in your project folder, no account needed. For your live app, you prove it's yours with a one-line tag first.
References
- github.com/pallets/quart/security/advisories/GHSA-v853-p72q-4cfw
- github.com/pallets/quart/commit/e8eb3b8a0cb98e7574bf3841312fc7f96883d055
- github.com/pallets/quart/releases/tag/0.23.1
- github.com/advisories/GHSA-v853-p72q-4cfw
Merged from GitHub Advisory Database. Last updated 3 Nov 2026. All vulnerabilities · RSS · JSON