<?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>Fri, 02 Oct 2026 05:46:47 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-57127</title>
      <link>https://db.gcve.eu/vuln/fkie_cve-2026-57127</link>
      <description>&lt;p&gt;PraisonAI is a multi-agent teams system. Prior to 4.6.58, recipe serve installs APIKeyAuthMiddleware or JWTAuthMiddleware when an operator selects api-key or JWT authentication, but each middleware forwards requests when PRAISONAI_API_KEY or PRAISONAI_JWT_SECRET and the corresponding recipe value are absent. Unauthenticated clients can then reach recipe execution, input, and output surfaces and may trigger connected tools despite the operator explicitly enabling authentication. This issue is fixed in 4.6.58.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;PraisonAI is a multi-agent teams system. Prior to 4.6.58, recipe serve installs APIKeyAuthMiddleware or JWTAuthMiddleware when an operator selects api-key or JWT authentication, but each middleware forwards requests when PRAISONAI_API_KEY or PRAISONAI_JWT_SECRET and the corresponding recipe value are absent. Unauthenticated clients can then reach recipe execution, input, and output surfaces and may trigger connected tools despite the operator explicitly enabling authentication. This issue is fixed in 4.6.58.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/fkie_cve-2026-57127</guid>
    </item>
    <item>
      <title>GHSA-j4hj-7hfh-g2f4 — praisonai: recipe serve auth middleware silently disables itself when no secret is set</title>
      <link>https://db.gcve.eu/vuln/ghsa-j4hj-7hfh-g2f4</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonai&lt;/p&gt;
&lt;p&gt;# praisonai: `recipe serve` authentication middleware silently disables itself when no secret is set&lt;/p&gt;
&lt;p&gt;**Researcher:** Kai Aizen — SnailSploit (@SnailSploit), Adversarial &amp;amp; Offensive Security Research
**Target:** https://github.com/MervinPraison/PraisonAI&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;**Package:** `praisonai` on PyPI
**Version tested:** 4.6.48.
**File:** `praisonai/recipe/serve.py` (sha256 `491bf8f29e399418260810ba4bf0f6802c6e4aa675628e2be68a9726c15d9b23`).&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## TL;DR&lt;/p&gt;
&lt;p&gt;`praisonai/recipe/serve.py:312-410` defines two auth middlewares (`APIKeyAuthMiddleware`, `JWTAuthMiddleware`). Both contain the same &amp;#34;fail open when the secret is unset&amp;#34; branch at the top of their `dispatch`:&lt;/p&gt;
&lt;p&gt;```python
async def dispatch(self, request, call_next):
    if request.url.path == &amp;#34;/health&amp;#34;:
        return await call_next(request)
    expected_key = api_key or os.environ.get(&amp;#34;PRAISONAI_API_KEY&amp;#34;)
    if not expected_key:
        # No key configured, allow request
        return await call_next(request)
    ...
```&lt;/p&gt;
&lt;p&gt;```python
async def dispatch(self, request, call_next):
    if request.url.path == &amp;#34;/health&amp;#34;:
        return await call_next(request)
    secret = jwt_secret or os.environ.get(&amp;#34;PRAISONAI_JWT_SECRET&amp;#34;)
    if not secret:
        return await call_next(request)
    ...
```&lt;/p&gt;
&lt;p&gt;The realistic mis-deploy:&lt;/p&gt;
&lt;p&gt;1. operator sets `auth: api-key` (or `auth: jwt`) in their recipe YAML, expecting that line alone to enable auth,
2. operator does not set the corresponding `api_key:` / `jwt_secret:` value in the same YAML, AND
3.…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonai&lt;/p&gt;
&lt;p&gt;# praisonai: `recipe serve` authentication middleware silently disables itself when no secret is set&lt;/p&gt;
&lt;p&gt;**Researcher:** Kai Aizen — SnailSploit (@SnailSploit), Adversarial &amp;amp; Offensive Security Research
**Target:** https://github.com/MervinPraison/PraisonAI&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;**Package:** `praisonai` on PyPI
**Version tested:** 4.6.48.
**File:** `praisonai/recipe/serve.py` (sha256 `491bf8f29e399418260810ba4bf0f6802c6e4aa675628e2be68a9726c15d9b23`).&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## TL;DR&lt;/p&gt;
&lt;p&gt;`praisonai/recipe/serve.py:312-410` defines two auth middlewares (`APIKeyAuthMiddleware`, `JWTAuthMiddleware`). Both contain the same &amp;#34;fail open when the secret is unset&amp;#34; branch at the top of their `dispatch`:&lt;/p&gt;
&lt;p&gt;```python
async def dispatch(self, request, call_next):
    if request.url.path == &amp;#34;/health&amp;#34;:
        return await call_next(request)
    expected_key = api_key or os.environ.get(&amp;#34;PRAISONAI_API_KEY&amp;#34;)
    if not expected_key:
        # No key configured, allow request
        return await call_next(request)
    ...
```&lt;/p&gt;
&lt;p&gt;```python
async def dispatch(self, request, call_next):
    if request.url.path == &amp;#34;/health&amp;#34;:
        return await call_next(request)
    secret = jwt_secret or os.environ.get(&amp;#34;PRAISONAI_JWT_SECRET&amp;#34;)
    if not secret:
        return await call_next(request)
    ...
```&lt;/p&gt;
&lt;p&gt;The realistic mis-deploy:&lt;/p&gt;
&lt;p&gt;1. operator sets `auth: api-key` (or `auth: jwt`) in their recipe YAML, expecting that line alone to enable auth,
2. operator does not set the corresponding `api_key:` / `jwt_secret:` value in the same YAML, AND
3.…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-j4hj-7hfh-g2f4</guid>
    </item>
    <item>
      <title>PYSEC-2026-3513 — praisonai: recipe serve auth middleware silently disables itself when no secret is set</title>
      <link>https://db.gcve.eu/vuln/pysec-2026-3513</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonai&lt;/p&gt;
&lt;p&gt;# praisonai: `recipe serve` authentication middleware silently disables itself when no secret is set&lt;/p&gt;
&lt;p&gt;**Researcher:** Kai Aizen — SnailSploit (@SnailSploit), Adversarial &amp;amp; Offensive Security Research
**Target:** https://github.com/MervinPraison/PraisonAI&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;**Package:** `praisonai` on PyPI
**Version tested:** 4.6.48.
**File:** `praisonai/recipe/serve.py` (sha256 `491bf8f29e399418260810ba4bf0f6802c6e4aa675628e2be68a9726c15d9b23`).&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## TL;DR&lt;/p&gt;
&lt;p&gt;`praisonai/recipe/serve.py:312-410` defines two auth middlewares (`APIKeyAuthMiddleware`, `JWTAuthMiddleware`). Both contain the same &amp;#34;fail open when the secret is unset&amp;#34; branch at the top of their `dispatch`:&lt;/p&gt;
&lt;p&gt;```python
async def dispatch(self, request, call_next):
    if request.url.path == &amp;#34;/health&amp;#34;:
        return await call_next(request)
    expected_key = api_key or os.environ.get(&amp;#34;PRAISONAI_API_KEY&amp;#34;)
    if not expected_key:
        # No key configured, allow request
        return await call_next(request)
    ...
```&lt;/p&gt;
&lt;p&gt;```python
async def dispatch(self, request, call_next):
    if request.url.path == &amp;#34;/health&amp;#34;:
        return await call_next(request)
    secret = jwt_secret or os.environ.get(&amp;#34;PRAISONAI_JWT_SECRET&amp;#34;)
    if not secret:
        return await call_next(request)
    ...
```&lt;/p&gt;
&lt;p&gt;The realistic mis-deploy:&lt;/p&gt;
&lt;p&gt;1. operator sets `auth: api-key` (or `auth: jwt`) in their recipe YAML, expecting that line alone to enable auth,
2. operator does not set the corresponding `api_key:` / `jwt_secret:` value in the same YAML, AND
3.…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonai&lt;/p&gt;
&lt;p&gt;# praisonai: `recipe serve` authentication middleware silently disables itself when no secret is set&lt;/p&gt;
&lt;p&gt;**Researcher:** Kai Aizen — SnailSploit (@SnailSploit), Adversarial &amp;amp; Offensive Security Research
**Target:** https://github.com/MervinPraison/PraisonAI&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;**Package:** `praisonai` on PyPI
**Version tested:** 4.6.48.
**File:** `praisonai/recipe/serve.py` (sha256 `491bf8f29e399418260810ba4bf0f6802c6e4aa675628e2be68a9726c15d9b23`).&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## TL;DR&lt;/p&gt;
&lt;p&gt;`praisonai/recipe/serve.py:312-410` defines two auth middlewares (`APIKeyAuthMiddleware`, `JWTAuthMiddleware`). Both contain the same &amp;#34;fail open when the secret is unset&amp;#34; branch at the top of their `dispatch`:&lt;/p&gt;
&lt;p&gt;```python
async def dispatch(self, request, call_next):
    if request.url.path == &amp;#34;/health&amp;#34;:
        return await call_next(request)
    expected_key = api_key or os.environ.get(&amp;#34;PRAISONAI_API_KEY&amp;#34;)
    if not expected_key:
        # No key configured, allow request
        return await call_next(request)
    ...
```&lt;/p&gt;
&lt;p&gt;```python
async def dispatch(self, request, call_next):
    if request.url.path == &amp;#34;/health&amp;#34;:
        return await call_next(request)
    secret = jwt_secret or os.environ.get(&amp;#34;PRAISONAI_JWT_SECRET&amp;#34;)
    if not secret:
        return await call_next(request)
    ...
```&lt;/p&gt;
&lt;p&gt;The realistic mis-deploy:&lt;/p&gt;
&lt;p&gt;1. operator sets `auth: api-key` (or `auth: jwt`) in their recipe YAML, expecting that line alone to enable auth,
2. operator does not set the corresponding `api_key:` / `jwt_secret:` value in the same YAML, AND
3.…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/pysec-2026-3513</guid>
    </item>
  </channel>
</rss>
