CVE-2026-44335: praisonaiagents: SSRF via URL parser confusion bypass
GHSA-q9pw-vmhh-384g HIGH CISA: TRACK*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.
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?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| PraisonAI Agents | pip | <= 1.6.31 | 1.6.32 |
Do you use PraisonAI Agents? You're affected.
How severe is it?
What should I do?
5 steps-
Upgrade praisonaiagents to >= 1.6.32 immediately — this is the only complete fix.
-
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.
-
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).
-
Enable IMDSv2 token-required mode on all AWS EC2 instances to block the most severe escalation path from SSRF to IAM credential theft.
-
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?
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:
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
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
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.
References
Timeline
Related Vulnerabilities
CVE-2026-34938 10.0 praisonaiagents: sandbox bypass enables full host RCE
Same package: praisonaiagents CVE-2026-39888 10.0 praisonaiagents: sandbox escape enables host RCE
Same package: praisonaiagents CVE-2026-47392 9.9 praisonaiagents: RCE via Python sandbox bypass
Same package: praisonaiagents GHSA-vc46-vw85-3wvm 9.8 PraisonAI: RCE via malicious workflow YAML execution
Same package: praisonaiagents CVE-2026-47391 9.8 PraisonAI: Unauth RCE via A2A eval injection
Same package: praisonaiagents