<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://db.gcve.eu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Wed, 11 Nov 2026 00:37:16 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-123816</title>
      <link>https://db.gcve.eu/vuln/fkie_cve-2026-123816</link>
      <description>&lt;p&gt;pyLoad is a free and open-source download manager written in Python. Prior to 0.5.0b3.dev101, Api.check_apikey caches successful validation in self._apikey_cache using only the attacker-controlled key_id. After a legitimate key populates the cache, a forged API key with the same key_id reaches the cache-hit path without comparing apikey[-43:] to the stored hash through hmac.compare_digest. Key identifiers are small sequential integers, so an unauthenticated remote attacker can enumerate an active identifier and inherit the cached key owner&amp;#39;s permissions during the 300-second cache lifetime. This issue is fixed in version 0.5.0b3.dev101.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;pyLoad is a free and open-source download manager written in Python. Prior to 0.5.0b3.dev101, Api.check_apikey caches successful validation in self._apikey_cache using only the attacker-controlled key_id. After a legitimate key populates the cache, a forged API key with the same key_id reaches the cache-hit path without comparing apikey[-43:] to the stored hash through hmac.compare_digest. Key identifiers are small sequential integers, so an unauthenticated remote attacker can enumerate an active identifier and inherit the cached key owner&amp;#39;s permissions during the 300-second cache lifetime. This issue is fixed in version 0.5.0b3.dev101.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/fkie_cve-2026-123816</guid>
    </item>
    <item>
      <title>GHSA-r44w-v6gf-x3p6 — pyLoad has an authentication bypass in API key validation (check_apikey cache)</title>
      <link>https://db.gcve.eu/vuln/ghsa-r44w-v6gf-x3p6</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: pyload-ng&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The API-key cache in `check_apikey()` allows an attacker to authenticate with a **forged API key** as long as the legitimate key for the same `key_id` has been used recently.&lt;/p&gt;
&lt;p&gt;On a cache hit, the API key **secret is never verified**, resulting in a complete authentication bypass during the cache lifetime.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;# Affected Components&lt;/p&gt;
&lt;p&gt;- `src/pyload/core/api/init.py`
  - `Api.check_apikey()`&lt;/p&gt;
&lt;p&gt;- `src/pyload/core/database/apikey_database.py`
  - `check_apikey()`
  - `_check_key()`&lt;/p&gt;
&lt;p&gt;The cache is used by normal API requests through:&lt;/p&gt;
&lt;p&gt;- `src/pyload/webui/app/helpers.py`&lt;/p&gt;
&lt;p&gt;which calls:&lt;/p&gt;
&lt;p&gt;```python
api.check_apikey(api_key)
```&lt;/p&gt;
&lt;p&gt;without providing a `ttl`, meaning the default **300-second cache** is always enabled.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;# Root Cause&lt;/p&gt;
&lt;p&gt;Successful API key validations are cached in:&lt;/p&gt;
&lt;p&gt;```python
self._apikey_cache
```&lt;/p&gt;
&lt;p&gt;using the following structure:&lt;/p&gt;
&lt;p&gt;```python
{
    key_id: (timestamp, cached_data)
}
```&lt;/p&gt;
&lt;p&gt;The cache key is based **only on `key_id`**, and that value is parsed directly from the user-supplied API key rather than being obtained from a trusted lookup.&lt;/p&gt;
&lt;p&gt;When a cache hit occurs within the TTL, `check_apikey()` returns:&lt;/p&gt;
&lt;p&gt;```python
{
    &amp;#34;success&amp;#34;: True,
    &amp;#34;data&amp;#34;: cached_data
}
```&lt;/p&gt;
&lt;p&gt;after checking only:&lt;/p&gt;
&lt;p&gt;- `expires_at`&lt;/p&gt;
&lt;p&gt;At no point on this execution path is the supplied secret:&lt;/p&gt;
&lt;p&gt;```text
apikey[-43:]
```&lt;/p&gt;
&lt;p&gt;compared against the stored key hash.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;The actual secret verification exists only in:&lt;/p&gt;
&lt;p&gt;```python
_check_key()
```&lt;/p&gt;
&lt;p&gt;which correctly uses:&lt;/p&gt;
&lt;p&gt;```python
hmac.compare_dig…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: pyload-ng&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The API-key cache in `check_apikey()` allows an attacker to authenticate with a **forged API key** as long as the legitimate key for the same `key_id` has been used recently.&lt;/p&gt;
&lt;p&gt;On a cache hit, the API key **secret is never verified**, resulting in a complete authentication bypass during the cache lifetime.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;# Affected Components&lt;/p&gt;
&lt;p&gt;- `src/pyload/core/api/init.py`
  - `Api.check_apikey()`&lt;/p&gt;
&lt;p&gt;- `src/pyload/core/database/apikey_database.py`
  - `check_apikey()`
  - `_check_key()`&lt;/p&gt;
&lt;p&gt;The cache is used by normal API requests through:&lt;/p&gt;
&lt;p&gt;- `src/pyload/webui/app/helpers.py`&lt;/p&gt;
&lt;p&gt;which calls:&lt;/p&gt;
&lt;p&gt;```python
api.check_apikey(api_key)
```&lt;/p&gt;
&lt;p&gt;without providing a `ttl`, meaning the default **300-second cache** is always enabled.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;# Root Cause&lt;/p&gt;
&lt;p&gt;Successful API key validations are cached in:&lt;/p&gt;
&lt;p&gt;```python
self._apikey_cache
```&lt;/p&gt;
&lt;p&gt;using the following structure:&lt;/p&gt;
&lt;p&gt;```python
{
    key_id: (timestamp, cached_data)
}
```&lt;/p&gt;
&lt;p&gt;The cache key is based **only on `key_id`**, and that value is parsed directly from the user-supplied API key rather than being obtained from a trusted lookup.&lt;/p&gt;
&lt;p&gt;When a cache hit occurs within the TTL, `check_apikey()` returns:&lt;/p&gt;
&lt;p&gt;```python
{
    &amp;#34;success&amp;#34;: True,
    &amp;#34;data&amp;#34;: cached_data
}
```&lt;/p&gt;
&lt;p&gt;after checking only:&lt;/p&gt;
&lt;p&gt;- `expires_at`&lt;/p&gt;
&lt;p&gt;At no point on this execution path is the supplied secret:&lt;/p&gt;
&lt;p&gt;```text
apikey[-43:]
```&lt;/p&gt;
&lt;p&gt;compared against the stored key hash.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;The actual secret verification exists only in:&lt;/p&gt;
&lt;p&gt;```python
_check_key()
```&lt;/p&gt;
&lt;p&gt;which correctly uses:&lt;/p&gt;
&lt;p&gt;```python
hmac.compare_dig…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-r44w-v6gf-x3p6</guid>
    </item>
  </channel>
</rss>
