CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-R44W-V6GF-X3P6

Authentication Bypass in pyLoad API Key Caching Mechanism (GHSA-R44W-V6GF-X3P6)

Alon Barad
Alon Barad
Software Engineer

Oct 9, 2026·7 min read·8 visits

Executive Summary (TL;DR)

Remote attackers can bypass authentication in pyLoad and access administrative API endpoints by exploiting a logical flaw that caches authentication states using public key IDs instead of the private secret token.

An authentication bypass vulnerability in pyLoad allows unauthenticated remote attackers to gain administrative API access. The vulnerability is caused by a logical flaw in the API key cache validation lookup, where authentication states are cached using only the public key identifier, skipping cryptographic token verification on cache hits.

Vulnerability Overview

The open-source download manager pyLoad (specifically the pyload-ng Python package) exposes a web user interface and a programmatic API interface to facilitate remote configuration, download task scheduling, and state monitoring. The system uses API keys to authenticate headless systems, automated daemons, and client applications. These API endpoints are exposed on the default pyLoad port (typically port 8000) and represent a significant portion of the application's external attack surface.

This vulnerability is classified under CWE-287 (Improper Authentication). The core issue resides in the logical design of the API key validation caching layer, where the cache key index is decoupled from the cryptographic secret verification. Because authorization decisions are cached on guessable public identifiers rather than the secret token itself, the system permits unauthenticated requests that match a currently cached key index.

An attacker who can intercept or anticipate API key usage can bypass authentication entirely during the 300-second (5-minute) cache lifetime. Once a legitimate user authenticates successfully, their authorization status is cached. Any subsequent request presenting the target's public key identifier, combined with an arbitrary, forged secret string, is accepted by the server as authenticated. This allows the attacker to execute arbitrary administrative API methods.

Root Cause Analysis

The vulnerability stems from the internal structure of pyLoad's API key validation system. When an administrative user generates an API key, the application produces a string formatted as pl_<key_id><43-character-secret>, where the key_id is a sequential integer (e.g., 1, 2, 3) stored in the database. During authentication, the check_apikey() function splits this string to extract the key_id and the secret suffix.

To minimize repetitive, resource-intensive database operations, the application uses an internal dictionary, self._apikey_cache, to cache validation states. The dictionary is defined with the format {key_id: (timestamp, data)}. This design choice represents the fundamental logical flaw: the dictionary uses only the public, sequential key_id as the cache key index instead of incorporating the private, high-entropy secret portion of the credential.

When evaluating an API request, the system checks whether the extracted key_id exists in self._apikey_cache. If a cache hit occurs and the TTL is valid, the function immediately returns a success status along with the cached user metadata. The validation logic does not perform any comparison between the incoming secret token and the database or cache records during a cache hit. Consequently, the high-entropy secret portion of the credential is completely ignored, and the request is authorized solely based on the presence of the key_id in the cache.

Code Analysis & Patch Walkthrough

The vulnerable implementation in src/pyload/core/api/__init__.py exposes the logical bypass on cache hits. The application checks the cache prior to conducting database validation. Because database validation (which uses safe comparison routines) is skipped during a cache hit, any client supplying a matching key_id bypasses authentication entirely.

Below is the comparison of the vulnerable logic versus the patched logic implemented in the pyLoad repository:

# VULNERABLE LOGIC:
# Cache indexed by public key_id integer
self._apikey_cache = {}  # Format: {key_id: (timestamp, data)}
 
def check_apikey(self, apikey: str, ttl: int = 5 * 60):
    # ... (extract key_id from apikey)
    if ttl > 0:
        with self._apikey_cache_lock:
            if key_id in self._apikey_cache:
                # Cache Hit: immediately return success without verifying secret!
                return {"success": True, "data": cached_data}
# PATCHED LOGIC:
# Cache indexed by full apikey string (incorporating secret)
self._apikey_cache = {}  # Format: {apikey: (timestamp, data)}
 
def check_apikey(self, apikey: str, ttl: int = 5 * 60):
    if ttl > 0:
        with self._apikey_cache_lock:
            if apikey in self._apikey_cache:
                # Cache Hit: Only occurs if the complete, secret-bearing string matches exactly
                return {"success": True, "data": cached_data}

In addition to modifying the check_apikey search key, the patch updates the cache eviction logic. In functions such as remove_user and delete_apikey, the cache invalidation routine was rewritten to iterate over the dictionary items, finding and removing cached entries based on nested user and key metadata. This prevents stale authorization sessions from persisting when keys are revoked or deleted.

Attack Methodology & Exploitation

Exploitation of this vulnerability requires two primary conditions: a target system with an active API key, and a legitimate authentication event that populates the cache. The attack vector is remote, network-accessible, and requires zero prior privileges. Because the public key_id is a sequential integer, attackers can easily enumerate valid key IDs to target active systems.

The timeline of a successful attack is represented in the sequence diagram below:

To verify the vulnerability, an attacker can execute two sequential curl commands. The first command simulates the legitimate administrative user populating the cache. The second command uses the same key_id prefix but changes the high-entropy secret portion to an arbitrary string. On a vulnerable deployment, both commands return a 200 OK status with the target resource payload, proving the bypass works.

Impact & Risk Assessment

The direct technical impact of this vulnerability is complete compromise of the pyLoad instance's administrative and management functions. The pyLoad API provides routes to manage files, retrieve system configuration, configure download paths, execute shell commands, and control system integration daemons. An unauthenticated remote attacker can leverage this bypass to perform unauthorized file operations, read system configs containing administrative passwords, or write malicious payloads to the host system.

The CVSS v3.1 base score is 8.1, indicating High severity. The vector string is CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H. The high attack complexity rating reflects the dependency on a race-like window: the attacker must issue their request within the 300-second window following a legitimate user's authentication event. However, in automated deployments or systems with frequent polling (such as browser extensions or script integrations), this window is almost continuously open.

From a downstream risk perspective, download managers frequently execute with administrative or local system privileges to allow writing to restricted directories. If pyLoad is running inside a Docker container, the compromise can serve as an initial foothold for container escape or network scanning of internal assets, amplifying the risk beyond the application boundary.

Security Engineering & Architectural Enhancements

The immediate remediation for this vulnerability is upgrading the pyload-ng package to version 0.5.0b3.dev101 or later. This updates the dictionary cache indexing to key off the entire API key string rather than the public ID. If upgrading is not immediately possible, administrators should disable external access to the API paths (such as /api/*) or apply IP-based access control lists (ACLs) to restrict the attack surface.

From an architectural standpoint, caching plaintext keys in-memory represents an operational security risk. Although the patch resolves the logical bypass, the full API key is retained in plaintext within the process heap space as a dictionary key. A more resilient architectural design would index the cache dictionary using a cryptographic hash of the API key, such as hashlib.sha256(apikey.encode()).hexdigest().

Additionally, developers should avoid using sequential, guessable identifiers (key_id) as public-facing references in security-sensitive interfaces. Using high-entropy, cryptographically secure random identifiers (UUIDv4) prevents target enumeration and limits the effectiveness of structured replay or side-channel attacks.

Official Patches

pyLoad GitHubOfficial patch securing the apikey cache lookup key.

Fix Analysis (1)

Technical Appendix

CVSS Score
8.1/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

Affected Systems

pyLoad (pyload-ng)

Affected Versions Detail

Product
Affected Versions
Fixed Version
pyload-ng
pyLoad
< 0.5.0b3.dev1010.5.0b3.dev101
AttributeDetail
CWE IDCWE-287
Attack VectorNetwork
CVSS v3.1 Score8.1
Exploit Statuspoc
KEV StatusNot Listed
Affected Packagepyload-ng

MITRE ATT&CK Mapping

T1110Brute Force
Credential Access
T1556Modify Authentication Process
Credential Access
CWE-287
Improper Authentication

The software does not prove, or insufficiently proves, that the claim of an identity is correct.

Vulnerability Timeline

Official Patch Commit Released
2026-08-01
GHSA-R44W-V6GF-X3P6 Security Advisory Published
2026-10-09

References & Sources

  • [1]GitHub Advisory GHSA-R44W-V6GF-X3P6
  • [2]pyLoad Security Advisory GHSA-r44w-v6gf-x3p6

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•34 minutes ago•GHSA-68W4-83FH-F2W8
8.8

GHSA-68W4-83FH-F2W8: Privilege Escalation and Administrative Password Oracle in pyLoad-ng

An authorization bypass and credential oracle vulnerability in pyload-ng allows authenticated users with minimal or no privileges to brute-force the administrator password. This is achieved through sensitive API methods exposed globally combined with a non-constant-time password hash comparison algorithm.

Alon Barad
Alon Barad
1 views•7 min read
•about 3 hours ago•CVE-2026-107728
7.5

CVE-2026-107728: Authorization Bypass in Strawberry GraphQL Permission Validation

An authorization bypass vulnerability in Strawberry GraphQL between versions 0.217.0 and 0.326.1 occurs when a synchronous permission handler returns an awaitable object (such as an unawaited coroutine). Due to Python's truthiness rules, the unawaited coroutine is evaluated as True, leading to an immediate bypass of security policies.

Amit Schendel
Amit Schendel
8 views•5 min read
•about 4 hours ago•CVE-2026-107727
3.7

CVE-2026-107727: Connection-Level Denial of Service via State Leak in Strawberry GraphQL Legacy WS Handler

An uncontrolled resource consumption vulnerability in Strawberry GraphQL allows unauthenticated remote attackers to trigger a Denial of Service on persistent WebSocket connections using the legacy graphql-ws protocol. When the server enforces max_subscriptions_per_connection, naturally terminating subscriptions are not cleared from memory registries, leading to exhaustion of connection slots.

Alon Barad
Alon Barad
9 views•6 min read
•about 5 hours ago•CVE-2026-107723
8.1

CVE-2026-107723: Silent Claim-Validator Bypass in NearForm fast-jwt via Array Payload Type Confusion

A high-severity type-confusion vulnerability exists in NearForm fast-jwt prior to version 6.3.0. The vulnerability allows attackers to bypass crucial claim validation steps (such as expiration, issuer, audience, and subject validations) by presenting a validly signed JSON Web Token structured as a JSON array instead of a JSON object. This occurs because the library's decoder fails to reject JSON arrays during type evaluation.

Alon Barad
Alon Barad
10 views•6 min read
•about 6 hours ago•CVE-2026-107721
5.9

CVE-2026-107721: Time Validation Bypass in NearForm fast-jwt due to Loose Temporal Option Validation

NearForm fast-jwt prior to version 6.3.0 is vulnerable to an input validation flaw where configuring verifier properties (such as clockTolerance, clockTimestamp, and cacheTTL) with non-finite values like Infinity or NaN allows attackers to bypass temporal claim validations, including expiration (exp) and activation (nbf) boundaries. This validation bypass can result in unauthorized session persistence and cache poisoning.

Amit Schendel
Amit Schendel
9 views•6 min read
•about 7 hours ago•CVE-2026-107722
9.8

CVE-2026-107722: Algorithm Confusion via Non-Whitespace Prefix Bypass in fast-jwt

A critical cryptographic vulnerability in fast-jwt versions 6.2.x prior to 6.3.0 allows unauthenticated remote attackers to execute an asymmetric-to-symmetric algorithm confusion attack due to incomplete validation of leading non-whitespace prefixes.

Amit Schendel
Amit Schendel
8 views•5 min read