Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAuthenticate with SETTINGS permission
-
DeliveryPOST /api/setConfigValue (ssl_verify=off)
-
ExploitPersist config to disk
-
InstallNext HTTP request reads config
-
C2pycurl handle applies SSL_VERIFY=0
-
ExecuteOn-path attacker intercepts HTTPS
-
ImpactPresent forged certificate
-
Step 8Attacker receives download content or credential data
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V12 - Secure Communication Certificate validation
|
| Exploitation Conditions | The following conditions must be met for exploitation: (1) The target must be running pyload-ng version 0.5.0b3.dev99 or earlier. (2) The attacker must be authenticated to pyload and hold a role that includes the SETTINGS permission (verified by the @permission(Perms.SETTINGS) decorator on set_config_value). (3) The attacker's role must NOT be an admin (confirmed by the 'not is_admin' check in the allowlist logic); admin users already have full config access and are out of scope for this escalation. (4) The attacker must have network-level MITM capability (AV:N/AC:H reflects this: on-path interception is required). (5) No special configuration is required on pyload itself - the vulnerability exists in all deployments with multi-user access and delegated SETTINGS permissions. (6) Exploitation takes effect immediately on the next outbound HTTP request; no pyload restart is required because get_options() is called per-request. |
| Impact | CVSS 6.8 with AV:N/AC:H/PR:L indicates network-accessible exploitation requiring low privileges and high attack complexity. The high complexity reflects the requirement for an on-path attacker position (network interception capability), which is realistic in shared LAN, compromised router, DNS hijacking, or malicious proxy scenarios - particularly relevant given pyload-ng's use case as a download manager often running on home networks where users may share gateway hardware. EPSS and KEV status are not provided in the input data; however, this vulnerability should be considered HIGH PRIORITY because: (1) it directly chains with the published SSRF fixes (CVE-2026-33992, CVE-2026-35459), rendering hostname validation meaningless; (2) it represents a privilege escalation from delegated settings management to full TLS policy control; (3) exploitation requires only API calls with no UI interaction; (4) it is the fifth variant of the same root cause (incomplete allowlist), indicating the core authorization design is fundamentally broken and likely to spawn additional bypasses. The CVSS complexity adjustment for on-path requirements is realistic but should not be understated - home networks and cloud deployments with shared infrastructure are high-risk scenarios. The impact on confidentiality and integrity is confirmed by the PoC: silent MITM on all outbound HTTPS without logging or admin notification. |
| Exploit ScenarioDerived | An authenticated user with SETTINGS permission (e.g., a household member in a multi-user home setup granted 'manage settings' privileges by the admin) or a compromised account holding SETTINGS sends an authenticated POST request to /api/setConfigValue with parameters category=general, option=ssl_verify, value=off. The request succeeds without requiring admin credentials. Subsequently, when the admin (or any user) enqueues an HTTPS download, a co-located attacker on the same LAN or a compromised upstream router presents a forged TLS certificate; pyload accepts it because SSL_VERIFYPEER is now 0, and the download is silently MITM'd, potentially delivering malware, credentials, or falsified content. The attacker gains no log entries or admin notifications. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – May 04, 2026
Non-admin users holding the SETTINGS permission in pyload-ng can disable TLS peer and hostname verification by setting general.ssl_verify=off via the set_config_value() API, enabling man-in-the-middle attacks on all outbound HTTPS requests including downloads, captcha fetches, and plugin calls. This is an incomplete fix for a series of prior allowlist bypasses (CVE-2026-33509, CVE-2026-35463, CVE-2026-35464, CVE-2026-35586) in which security-sensitive configuration options were omitted from the ADMIN_ONLY_CORE_OPTIONS allowlist.
RemediationAI
Upgrade pyload-ng to version 0.5.0b3.dev100 or later, which adds ('general', 'ssl_verify') to the ADMIN_ONLY_CORE_OPTIONS allowlist in src/pyload/core/api/__init__.py. This patch prevents non-admin SETTINGS users from modifying SSL verification settings. As a temporary compensating control, restrict the SETTINGS permission to trusted administrators only, and audit current role assignments to ensure no untrusted users hold this permission. Monitor pyload configuration files (typically ~/.pyload/core.conf or similar) for manual edits that set ssl_verify=off, as an already-compromised account could have modified the config file directly. If using pyload-ng in a multi-user environment where non-admin settings delegation is required, do not assign the SETTINGS permission until the patch is applied. Note that this mitigation requires restricting delegation functionality, which may reduce administrator productivity; the patch is the only complete fix. See https://github.com/pyload/pyload/security/advisories/GHSA-ccxc-x975-4hh9 for patch details and verification instructions.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in pypi, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability lies in pyload-ng's configuration API authorization model, which uses a hand-maintained allowlist (ADMIN_ONLY_CORE_OPTIONS) in src/pyload/core/api/__init__.py to restrict which config options can be modified by non-admin users holding the SETTINGS permission. The ssl_verify option, which controls pycurl's SSL_VERIFYPEER and SSL_VERIFYHOST flags, was not included on this allowlist despite its security-critical nature. When set_config_value() is called with category='general' and option='ssl_verify', the value bypasses permission checks and is persisted to disk. Subsequently, every new HTTP request handler instantiation calls get_options() to retrieve the config value and applies it directly to the pycurl handle via setopt(pycurl.SSL_VERIFYPEER, ssl_verify * 2), allowing an on-path attacker to intercept HTTPS connections with forged certificates. The root cause is CWE-295 (Improper Certificate Validation), compounded by an incomplete authorization allowlist (CWE-639). This vulnerability is part of a recurring pattern where configuration options are added to the allowlist reactively rather than by secure default.
Know when Python gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
Primary rating from GitHub Advisory · only source for this CVE.
CVSS VectorGitHub Advisory
DescriptionGitHub Advisory
Summary
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 option ("general", "ssl_verify") is not on that allowlist. Any authenticated user with the non-admin SETTINGS permission can set general.ssl_verify = off, and every subsequent outbound pycurl request is made with SSL_VERIFYPEER=0 and SSL_VERIFYHOST=0 - TLS peer and hostname verification are fully disabled. An on-path attacker can then present forged certificates for any hostname pyload fetches.
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.
Details
Writer - src/pyload/core/api/__init__.py, set_config_value() (around lines 215-290). The function is decorated with @permission(Perms.SETTINGS) and only rejects writes when (category, option) appears in ADMIN_ONLY_CORE_OPTIONS:
ADMIN_ONLY_CORE_OPTIONS = {
("general", "storage_folder"),
("log", "syslog_host"), ("log", "syslog_port"),
("proxy", "password"), ("proxy", "username"),
("reconnect", "script"),
("webui", "host"),
("webui", "ssl_certfile"), ("webui", "ssl_keyfile"), ("webui", "ssl_certchain"),
("webui", "use_ssl"),
}
...
if (category, option) in ADMIN_ONLY_CORE_OPTIONS and not is_admin:
self.pyload.log.error(...); return
self.pyload.config.set(category, option, value)("general", "ssl_verify") is absent. config.set() in src/pyload/core/config/parser.py:329 calls cast() which has no branch for enum-string types - "off" is stored verbatim and persisted to disk via self.save().
Reader - src/pyload/core/network/request_factory.py:109-110:
def get_options(self):
return {
"interface": self.iface(),
"proxies": self.get_proxies(),
"ipv6": self.pyload.config.get("download", "ipv6"),
"ssl_verify": self.pyload.config.get("general", "ssl_verify"),
...
}Sink - src/pyload/core/network/http/http_request.py:193-206:
if "ssl_verify" in options:
aiachaser_on = b"on (using aia-chaser)"
if options["ssl_verify"] in [True, b"on", aiachaser_on]:
...
ssl_verify = 1
else:
ssl_verify = 0
self.c.setopt(pycurl.SSL_VERIFYPEER, ssl_verify)
self.c.setopt(pycurl.SSL_VERIFYHOST, ssl_verify * 2)Because get_options() is invoked every time a new pycurl handle is built, the new config value takes effect on the very next outbound request - no pyload restart required.
PoC
Authenticated as any user who has Perms.SETTINGS but is not admin (e.g. a user with Role.USER + the SETTINGS permission bit):
# 1) Log in as the SETTINGS (non-admin) user.
curl -c cookies.txt -X POST http://pyload.example:8000/api/login \
-d 'username=settings_user&password=<password>'
# 2) Disable TLS verification for all outbound downloads.
curl -b cookies.txt -X POST http://pyload.example:8000/api/setConfigValue \
-d 'category=general&option=ssl_verify&value=off§ion=core'
# -> 200 OK. Config persisted.
# 3) Enqueue any HTTPS download. An on-path attacker (shared LAN,
# compromised upstream router, DNS hijack, or a malicious proxy
# enabled via the sibling advisory on the proxy.* options) can
# now present a forged cert for any target - pyload accepts it.Verification: observe pycurl SSL_VERIFYPEER=0 in a debug build, or confirm that a download from an HTTPS endpoint served with a self-signed / mismatched cert succeeds after step 2 and fails before it.
Impact
- Who: any authenticated user whose role was granted
Perms.SETTINGS. In multi-user pyload deployments that delegate settings administration to non-admins, this is an unintended privilege escalation from "can change UI/download settings" to "can silently disable TLS cert validation for all outbound fetches". - What:
- Man-in-the-middle on all HTTPS downloads, captcha fetches, update checks, and plugin HTTP calls.
- Extends the impact of the already-published SSRF chain (CVE-2026-33992 / CVE-2026-35459). The URL-hostname validation those patches added is only meaningful if the TLS channel authenticates the endpoint; with
ssl_verify=off, an on-path attacker can present forged certs for already-validated hosts - so HTTPS cloud-metadata endpoints and internal HTTPS services behind the host allowlist become reachable again. - Silent to the admin. Every adjacent security-critical option (
proxy.password, SSL certfile/keyfile/certchain,use_ssl) is already admin-only, so the admin's mental model is that TLS policy cannot be weakened by a non-admin.
- Not impacted: unauthenticated attackers; users holding only
DOWNLOAD/LISTroles.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
EUVD-2026-29120
GHSA-ccxc-x975-4hh9
NVD
CVE.org
EPSS
VulDB
Exploit-DB