GitHub Advisoryadvisory · PyPI
GHSA-w727-595x-pc3r pyLoad Has Incomplete Fix for CVE-2026-33509 -storage_folder Bypass via Session Directory in pyLoad
MEDIUM
Official page ↗
- Aliases
- CVE-2026-45306
- Ecosystem
- PyPI
- Packages
- pyload-ng
- Severity
- Moderate
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:N
- Weaknesses
- CWE-706
- Reviewed
- 2026-05-14
Affected packages
• PyPI pyload-ng: <= 0.5.0b3.dev99 (no fix yet)
Description
Summary
The fix for CVE-2026-33509 prevents setting `storage_folder` inside `PKGDIR` or `userdir`, but does NOT protect the Flask session directory (`/tmp/pyLoad/flask`). An authenticated attacker can set `storage_folder` to the session directory and download session files of other users via `/files/get/`, leading to account takeover.
Details
The fix in `src/pyload/core/api/__init__.py`:
```python
directories = [PKGDIR, userdir]
if any(directories[0].startswith(d) for d in directories[1:]):
return # blocked
```
But the Flask session directory is:
```python
session_storage_path = os.path.join(api.get_cachedir(), "flask")
= /tmp/pyLoad/flask ← NOT blocked by fix
```
Attack Chain
1. Attacker (admin) sets `storage_folder = /tmp/pyLoad/flask`
2. Fix does NOT block this — `/tmp/pyLoad/flask` not inside `PKGDIR` or `userdir`
3. Attacker requests `GET /files/get/`
4. `send_from_directory('/tmp/pyLoad/flask', session_file)` serves victim's session
5. Attacker uses stolen session → Account Takeover
PoC
```python
import os
PKGDIR = "/usr/lib/python3/dist-packages/pyload"
userdir = os.path.expanduser("~/.pyload")
session_dir = "/tmp/pyLoad/flask"
correct_case = lambda x: x
directories = [
correct_case(os.path.join(os.path.realpath(d), ""))
for d in [session_dir, PKGDIR, userdir]
]
blocked = any(directories[0].startswith(d) for d in directories[1:])
print(f"Fix blocks session_dir: {blocked}")
Output: Fix blocks session_dir: False ← BYPASS CONFIRMED
```
Impact
Authenticated admin can steal sessions of other users → Account Takeover.
Suggested Fix
```python
blocked_dirs = [PKGDIR, userdir, api.get_cachedir()]
directories = [
os.path.join(os.path.realpath(d), "")
for d in [value] + blocked_dirs
]
if any(directories[0].startswith(d) for d in directories[1:]):
return
```
Related
Alias · CVE (1)
- CVE-2026-45306 pyLoad is a free and open-source download manager written in Python. vulnerability
Weakness · CWE (1)
- CWE-706 Use of Incorrectly-Resolved Name or Reference weakness