CVE-2026-44335: praisonaiagents: SSRF via URL parser confusion bypass

GHSA-q9pw-vmhh-384g HIGH CISA: TRACK*
Published May 6, 2026
CISO Take

PraisonAI's web scraping tools contain a critical SSRF vulnerability where the URL validation function and the HTTP request library fundamentally disagree on which host a malformed URL like `http://127.0.0.1:6666\@1.1.1.1` points to — validation passes it as public IP 1.1.1.1, but the actual HTTP request hits the internal 127.0.0.1. This is a published, zero-skill PoC: any deployment that feeds user-controlled URLs into PraisonAI's spider or scraping tools is trivially exploitable to reach cloud metadata endpoints (AWS IMDSv1 at 169.254.169.254 yields IAM credentials), internal APIs, or admin interfaces. The package has 20 prior CVEs and 11 downstream dependents, signaling systemic security quality issues that warrant broader scrutiny of your PraisonAI dependency tree. Upgrade to praisonaiagents >= 1.6.32 immediately and add network-layer egress filtering blocking RFC 1918 and link-local ranges as defense-in-depth.

Sources: GitHub Advisory NVD ATLAS

What is the risk?

High severity. The parser confusion between urlparse() and requests is a well-documented SSRF bypass class requiring zero AI knowledge to exploit — a single crafted URL is the entire attack. Risk is materially amplified in cloud-hosted agentic deployments where AWS IMDSv1, GCP metadata server, or Azure IMDS endpoints are reachable from the application network, creating a direct path from SSRF to cloud credential theft and account compromise. The 20 prior CVEs in the same package are a red flag for systemic insecure development practices, increasing confidence that related unpatched issues may exist. Exposure is broad: any PraisonAI deployment accepting user-controlled URL input — chatbots with web research capability, autonomous research agents, customer-facing assistants — is vulnerable.

How does the attack unfold?

Malicious Input
Attacker supplies a crafted URL `http://169.254.169.254\@1.1.1.1/latest/meta-data/iam/security-credentials/` as a source URL to PraisonAI's scraping or research tool.
AML.T0053
Validation Bypass
The `_validate_url()` function uses urlparse(), which extracts `1.1.1.1` as the hostname — a public IP — causing the URL to pass all SSRF blocklist checks.
AML.T0049
Internal SSRF Request
The `requests` library interprets the backslash as a path separator and silently connects to the internal cloud metadata endpoint (169.254.169.254), entirely bypassing the validation.
AML.T0085.001
Credential Exfiltration
Attacker receives cloud IAM role credentials or internal API secrets in the agent response, enabling lateral movement and cloud account compromise.
AML.T0086

What systems are affected?

Package Ecosystem Vulnerable Range Patched
PraisonAI Agents pip <= 1.6.31 1.6.32
11 dependents 69% patched ~0d to patch Full package profile →

Do you use PraisonAI Agents? You're affected.

How severe is it?

CVSS 3.1
N/A
EPSS
0.4%
chance of exploitation in 30 days
Higher than 29% of all CVEs
Exploitation Status
Exploit Available
Exploitation: MEDIUM
Sophistication
Trivial
Exploitation Confidence
medium
CISA SSVC: Public PoC
Composite signal derived from CISA KEV, VulnCheck KEV, CISA SSVC, EPSS, Metasploit, Exploit-DB, trickest/cve, Nuclei templates, and inthewild.io exploitation reports.

What should I do?

5 steps
  1. Upgrade praisonaiagents to >= 1.6.32 immediately — this is the only complete fix.

  2. If patching is blocked: implement independent URL validation that resolves the hostname via DNS and validates the resulting IP against blocklists — never rely solely on urlparse() for host extraction.

  3. Add network egress filtering blocking application server outbound requests to RFC 1918 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), loopback (127.0.0.0/8), and link-local (169.254.0.0/16, which covers cloud IMDS endpoints).

  4. Enable IMDSv2 token-required mode on all AWS EC2 instances to block the most severe escalation path from SSRF to IAM credential theft.

  5. Audit all code paths that pass user-controlled strings to PraisonAI scraping or spider tools and apply URL allowlisting where feasible.

What does CISA's SSVC say?

Decision Track*
Exploitation poc
Automatable Yes
Technical Impact partial

Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

EU AI Act
Article 15 - Accuracy, robustness and cybersecurity
ISO 42001
A.9.2 - Information security in AI system development
NIST AI RMF
MEASURE 2.6 - AI risk or impact – data and AI system security
OWASP LLM Top 10
LLM07 - Insecure Plugin Design LLM08 - Excessive Agency

Frequently Asked Questions

What is CVE-2026-44335?

PraisonAI's web scraping tools contain a critical SSRF vulnerability where the URL validation function and the HTTP request library fundamentally disagree on which host a malformed URL like `http://127.0.0.1:6666\@1.1.1.1` points to — validation passes it as public IP 1.1.1.1, but the actual HTTP request hits the internal 127.0.0.1. This is a published, zero-skill PoC: any deployment that feeds user-controlled URLs into PraisonAI's spider or scraping tools is trivially exploitable to reach cloud metadata endpoints (AWS IMDSv1 at 169.254.169.254 yields IAM credentials), internal APIs, or admin interfaces. The package has 20 prior CVEs and 11 downstream dependents, signaling systemic security quality issues that warrant broader scrutiny of your PraisonAI dependency tree. Upgrade to praisonaiagents >= 1.6.32 immediately and add network-layer egress filtering blocking RFC 1918 and link-local ranges as defense-in-depth.

Is CVE-2026-44335 actively exploited?

No confirmed active exploitation of CVE-2026-44335 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-44335?

1. Upgrade praisonaiagents to >= 1.6.32 immediately — this is the only complete fix. 2. If patching is blocked: implement independent URL validation that resolves the hostname via DNS and validates the resulting IP against blocklists — never rely solely on urlparse() for host extraction. 3. Add network egress filtering blocking application server outbound requests to RFC 1918 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), loopback (127.0.0.0/8), and link-local (169.254.0.0/16, which covers cloud IMDS endpoints). 4. Enable IMDSv2 token-required mode on all AWS EC2 instances to block the most severe escalation path from SSRF to IAM credential theft. 5. Audit all code paths that pass user-controlled strings to PraisonAI scraping or spider tools and apply URL allowlisting where feasible.

What systems are affected by CVE-2026-44335?

This vulnerability affects the following AI/ML architecture patterns: agent frameworks, AI-powered web scrapers, autonomous research agents, agentic tool invocation pipelines.

What is the CVSS score for CVE-2026-44335?

No CVSS score has been assigned yet.

What is the AI security impact?

Affected AI Architectures

agent frameworksAI-powered web scrapersautonomous research agentsagentic tool invocation pipelines

MITRE ATLAS Techniques

AML.T0049 Exploit Public-Facing Application
AML.T0053 AI Agent Tool Invocation
AML.T0085.001 AI Agent Tools
AML.T0086 Exfiltration via AI Agent Tool Invocation

Compliance Controls Affected

EU AI Act: Article 15
ISO 42001: A.9.2
NIST AI RMF: MEASURE 2.6
OWASP LLM Top 10: LLM07, LLM08

What are the technical details?

Original Advisory

### Summary The URL checking logic in PraisonAI has a logical flaw that could be bypassed by attackers, leading to SSRF attacks. ### Details The current PraisonAI project uses _validate_url to validate the input URL. The main logic is to perform security checks on the host portion of the URL extracted by urlparse to prevent SSRF attacks. <img width="1290" height="1145" alt="QQ20260424-151256-24-1" src="https://github.com/user-attachments/assets/d5f16b74-5ad2-444f-8600-b05f78a4b769" /> However, there are indeed differences in parsing between urlparse and the library that actually sends the request. Currently, almost all application scenarios in this project involve first using _validate_url for URL validation, and then using _get_session().get to send the request. <img width="1143" height="740" alt="QQ20260424-151437-24-2" src="https://github.com/user-attachments/assets/b1bf6ec2-d32a-4dac-b814-da819e8d3c83" /> In reality, its underlying mechanism is requests.get. <img width="1042" height="576" alt="QQ20260424-151645-24-3" src="https://github.com/user-attachments/assets/e17352c3-4205-44d6-ab6e-75566480215b" /> The core issue: `urlparse()` and `requests` disagree on which host a URL like `http://127.0.0.1:6666\@1.1.1.1` points to: - `urlparse()` treats `\` as a regular character and `@` as the userinfo-host delimiter, so it extracts hostname as `1.1.1.1` (public) - `requests` treats `\` as a path character, connecting to `127.0.0.1` (internal) Below is a test code I wrote following the code. ``` import sys from pathlib import Path from pprint import pprint sys.path.insert(0, str(Path(r"D:/BaiduNetdiskDownload/PraisonAI-main/PraisonAI-main/src/praisonai-agents"))) from praisonaiagents.tools import spider_tools # url = "http://127.0.0.1:6666\@1.1.1.1" url = "http://127.0.0.1:6666" result = spider_tools.scrape_page(url) if isinstance(result, dict) and "error" in result: print("scrape failed:", result["error"]) else: pprint(result) ``` When an attacker uses `http://127.0.0.1:6666/`, the existing detection logic can detect that this is an internal network address and block it. <img width="1068" height="128" alt="QQ20260424-152007-24-4" src="https://github.com/user-attachments/assets/294bff10-2af6-4960-bf69-dbf3340b1e9b" /> However, when an attacker uses `http://127.0.0.1:6666\@1.1.1.1`, the detection logic resolves the host to `1.1.1.1`, which is a public IP address, thus passing the verification. But in the actual request process, this URL is forwarded by requests.get to `http://127.0.0.1:6666`, bypassing the detection and achieving an SSRF attack. <img width="2089" height="324" alt="QQ20260424-152123-24-5" src="https://github.com/user-attachments/assets/4421ce42-e47b-48de-a97a-56ce56a2bbc9" /> ### PoC ``` http://127.0.0.1:6666\@1.1.1.1 ``` ### Impact SSRF

Exploitation Scenario

An attacker interacting with a PraisonAI-powered research assistant submits `http://169.254.169.254\@1.1.1.1/latest/meta-data/iam/security-credentials/my-role` as a URL to fetch. The `_validate_url()` function calls urlparse(), which extracts `1.1.1.1` as the host and passes the public-IP check. The underlying requests.get() call interprets the backslash as a path delimiter, silently connects to the AWS IMDS endpoint at 169.254.169.254, and returns the instance's IAM role credentials — access keys, secret keys, and session token — in the agent's response. The attacker exfiltrates these credentials, uses them to call AWS APIs, escalates to S3 or DynamoDB data access, and pivots laterally through the cloud environment, all triggered by a single agent prompt with no malware, no prior access, and no specialized knowledge.

Weaknesses (CWE)

CWE-918 — Server-Side Request Forgery (SSRF): The web server receives a URL or similar request from an upstream component and retrieves the contents of this URL, but it does not sufficiently ensure that the request is being sent to the expected destination.

Source: MITRE CWE corpus.

Timeline

Published
May 6, 2026
Last Modified
May 6, 2026
First Seen
May 7, 2026

Related Vulnerabilities