<?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>Wed, 07 Oct 2026 07:41:07 +0000</lastBuildDate>
    <item>
      <title>PYSEC-2026-3519 — PraisonAI: Jobs webhook SSRF protection bypass via DNS rebinding</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3519</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonai&lt;/p&gt;
&lt;p&gt;# Jobs webhook SSRF protection bypass via DNS rebinding&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;PraisonAI&amp;#39;s Async Jobs API validates `webhook_url` when a job request is parsed
and again when the internal `Job` object is constructed. That validation blocks
direct loopback/private targets, but it is not bound to the later network
request. When a job completes, `_send_webhook()` passes the original hostname to
`httpx.AsyncClient.post()` with no send-time validation, IP pinning, or guarded
transport.&lt;/p&gt;
&lt;p&gt;An attacker-controlled hostname can therefore resolve to a public IP during
Pydantic validation and later resolve to loopback/private/cloud-metadata
infrastructure during webhook delivery. This bypasses the intended SSRF guard in
current supported releases.&lt;/p&gt;
&lt;p&gt;This appears to be an incomplete fix / patch bypass for `GHSA-8frj-8q3m-xhgm`
(&amp;#34;Server-Side Request Forgery via Unvalidated webhook_url in Jobs API&amp;#34;). I defer
to maintainers on whether this should be a new advisory/CVE or an amendment to
the prior advisory, but current supported releases still appear affected.&lt;/p&gt;
&lt;p&gt;## Affected Component&lt;/p&gt;
&lt;p&gt;Package:&lt;/p&gt;
&lt;p&gt;```text
praisonai
```&lt;/p&gt;
&lt;p&gt;Files:&lt;/p&gt;
&lt;p&gt;```text
src/praisonai/praisonai/jobs/models.py
src/praisonai/praisonai/jobs/executor.py
src/praisonai/praisonai/jobs/router.py
```&lt;/p&gt;
&lt;p&gt;Relevant code paths:&lt;/p&gt;
&lt;p&gt;```text
JobSubmitRequest.validate_webhook_url()
Job.validate_webhook_url()
JobExecutor._send_webhook()
POST /api/v1/runs
```&lt;/p&gt;
&lt;p&gt;## Affected Versions&lt;/p&gt;
&lt;p&gt;Validated affected:&lt;/p&gt;
&lt;p&gt;- `v4.5.126` (`f00763937bf7f4d091e84533692fc0576fca9b99`);
- `v4…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: praisonai&lt;/p&gt;
&lt;p&gt;# Jobs webhook SSRF protection bypass via DNS rebinding&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;PraisonAI&amp;#39;s Async Jobs API validates `webhook_url` when a job request is parsed
and again when the internal `Job` object is constructed. That validation blocks
direct loopback/private targets, but it is not bound to the later network
request. When a job completes, `_send_webhook()` passes the original hostname to
`httpx.AsyncClient.post()` with no send-time validation, IP pinning, or guarded
transport.&lt;/p&gt;
&lt;p&gt;An attacker-controlled hostname can therefore resolve to a public IP during
Pydantic validation and later resolve to loopback/private/cloud-metadata
infrastructure during webhook delivery. This bypasses the intended SSRF guard in
current supported releases.&lt;/p&gt;
&lt;p&gt;This appears to be an incomplete fix / patch bypass for `GHSA-8frj-8q3m-xhgm`
(&amp;#34;Server-Side Request Forgery via Unvalidated webhook_url in Jobs API&amp;#34;). I defer
to maintainers on whether this should be a new advisory/CVE or an amendment to
the prior advisory, but current supported releases still appear affected.&lt;/p&gt;
&lt;p&gt;## Affected Component&lt;/p&gt;
&lt;p&gt;Package:&lt;/p&gt;
&lt;p&gt;```text
praisonai
```&lt;/p&gt;
&lt;p&gt;Files:&lt;/p&gt;
&lt;p&gt;```text
src/praisonai/praisonai/jobs/models.py
src/praisonai/praisonai/jobs/executor.py
src/praisonai/praisonai/jobs/router.py
```&lt;/p&gt;
&lt;p&gt;Relevant code paths:&lt;/p&gt;
&lt;p&gt;```text
JobSubmitRequest.validate_webhook_url()
Job.validate_webhook_url()
JobExecutor._send_webhook()
POST /api/v1/runs
```&lt;/p&gt;
&lt;p&gt;## Affected Versions&lt;/p&gt;
&lt;p&gt;Validated affected:&lt;/p&gt;
&lt;p&gt;- `v4.5.126` (`f00763937bf7f4d091e84533692fc0576fca9b99`);
- `v4…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3519</guid>
    </item>
  </channel>
</rss>
