CVE-2026-57143
PraisonAI: Server-Side Request Forgery (SSRF) in SearxNG / search_web tools via attacker-controlled searxng_url parameter
PraisonAI is a multi-agent teams system. Prior to praisonaiagents 1.6.62, searxng_search and the search_web SearxNG provider pass the LLM-controlled searxng_url parameter directly to requests.get without validating its scheme, host, port, or resolved address. Prompt-injected content can direct the default search tool to internal JSON services, distinguish open and closed internal ports, and attempt cloud-metadata requests, with returned JSON results entering agent context. This issue is fixed in praisonaiagents 1.6.62.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Required
What an attacker can affect
- Confidentiality
- High
- Integrity
- Low
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
8.8
PraisonAI: Server-Side Request Forgery (SSRF) in SearxNG / search_web tools via attacker-controlled searxng_url parameter
PraisonAI is a multi-agent teams system. Prior to praisonaiagents 1.6.62, searxng_search and the search_web SearxNG provider pass the LLM-controlled searxng_url parameter directly to requests.get without validating its scheme, host, port, or resolved address. Prompt-injected content can direct the default search tool to internal JSON services, distinguish open and closed internal ports, and attempt cloud-metadata requests, with returned JSON results entering agent context. This issue is fixed in praisonaiagents 1.6.62.
- Record
CVE-2026-57143- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:L - Weakness
- CWE-20, CWE-918
- Updated
- 2026-11-02
EUVDEUVD-2026-97773
8.8
PraisonAI is a multi-agent teams system. Prior to praisonaiagents 1.6.62, searxng_search and the search_web SearxNG provider pass the LLM-controlled searxng_url parameter directly to requests.get without validating its scheme, host, port, or resolved address. Prompt-injected content can direct the default search tool to internal JSON services, distinguish open and closed internal ports, and attempt cloud-metadata requests, with returned JSON results entering agent context. This issue is fixed in praisonaiagents 1.6.62.
- Record
EUVD-2026-97773- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-4pcv-mg8v-vrgf
8.8
PraisonAI: Server-Side Request Forgery (SSRF) in SearxNG / search_web tools via attacker-controlled searxng_url parameter
Summary
A Server-Side Request Forgery (SSRF) vulnerability in the SearxNG / search_web search tools allows an attacker to make the server perform requests to arbitrary internal endpoints and read the responses back. The searxng_url argument is passed directly to requests.get() with no validation of scheme, host, or port. Because searxng_url is exposed to the LLM as a tool parameter and search_web / searxng_search are part of the default agent toolset, the vulnerability is reachable through prompt injection in any content an agent ingests (web pages, files, tool output). This enables reading internal services and APIs, internal host/port enumeration, and in cloud environments reachability of the instance metadata endpoint (169.254.169.254) with potential IAM/credential exposure.
Details
The SearxNG search provider performs no validation on the searxng_url argument before issuing the HTTP request.
src/praisonai-agents/praisonaiagents/tools/searxng_tools.py (lines 16–47):
def searxng_search(
query: str,
max_results: int = 5,
searxng_url: Optional[str] = None
) -> List[Dict]:
...
url = searxng_url or "http://localhost:32768/search" # line 42
params = {
'q': query,
'format': 'json',
...
}
response = requests.get(url, params=params, timeout=10) # line 45 — no validation
response.raise_for_status()
The same unvalidated pattern exists in the unified search_web dispatcher:
src/praisonai-agents/praisonaiagents/tools/web_search.py (lines 235–247):
def _search_searxng(query: str, max_results: int = 5, searxng_url: Optional[str] = None):
...
url = searxng_url or os.environ.get("SEARXNG_URL", "http://localhost:32768/search") # line 239
...
response = requests.get(url, params=params, timeout=10) # line 247, no validation
searxng_url is accepted as a parameter on the public search_web() entry point (web_search.py, line 277) and is forwarded through to the request (web_search.py, line 357).
This parameter is attacker-controllable via the LLM:
searxng_urlis a real function parameter (searxng_tools.py:19,web_search.py:277).- The tool-schema generator exposes all function parameters to the model, only
self/*args/**kwargsare skipped (src/praisonai-agents/praisonaiagents/llm/llm.py:5968). search_webis part of the default tool profile (src/praisonai-agents/praisonaiagents/tools/profiles.py:68).
Therefore an agent that ingests attacker-controlled content can be coerced into calling search_web(...) with an internal/attacker-chosen searxng_url, and the response body is parsed and returned into the agent's context.
PoC
The following reproduces the vulnerability against the real searxng_search() source. It spins up a fake internal service simulating an internal API/admin endpoint, then demonstrates that an attacker-controlled searxng_url causes the tool to fetch it and return the response to the caller.
import importlib.util, threading, http.server, json, time
REPO = "/path/to/PraisonAI"
MOD_PATH = f"{REPO}/src/praisonai-agents/praisonaiagents/tools/searxng_tools.py"
# Load the REAL searxng_tools.py standalone (only needs `requests`)
spec = importlib.util.spec_from_file_location("searxng_tools", MOD_PATH)
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
# Fake "internal service" (e.g. internal API / admin panel / metadata)
class H(http.server.BaseHTTPRequestHandler):
def do_GET(self):
body = json.dumps({"results": [
{"title": "INTERNAL_SECRET", "url": self.path,
"content": "SSRF_TEST-12345 path=" + self.path}
]}).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
def log_message(self, *a):
…
- Record
GHSA-4pcv-mg8v-vrgf- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:L - Weakness
- CWE-20, CWE-918
- Updated
- 2026-11-02
NVD
8.8
PraisonAI is a multi-agent teams system. Prior to praisonaiagents 1.6.62, searxng_search and the search_web SearxNG provider pass the LLM-controlled searxng_url parameter directly to requests.get without validating its scheme, host, port, or resolved address. Prompt-injected content can direct the default search tool to internal JSON services, distinguish open and closed internal ports, and attempt cloud-metadata requests, with returned JSON results entering agent context. This issue is fixed in praisonaiagents 1.6.62.
- Record
CVE-2026-57143- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:L - Weakness
- CWE-20, CWE-918
- Updated
- 2026-11-02
OSV
8.8
PraisonAI: Server-Side Request Forgery (SSRF) in SearxNG / search_web tools via attacker-controlled searxng_url parameter
PraisonAI is a multi-agent teams system. Prior to praisonaiagents 1.6.62, searxng_search and the search_web SearxNG provider pass the LLM-controlled searxng_url parameter directly to requests.get without validating its scheme, host, port, or resolved address. Prompt-injected content can direct the default search tool to internal JSON services, distinguish open and closed internal ports, and attempt cloud-metadata requests, with returned JSON results entering agent context. This issue is fixed in praisonaiagents 1.6.62.
- Record
CVE-2026-57143- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:L - Weakness
- CWE-20, CWE-918
- Updated
- 2026-11-02
OSVGHSA-4pcv-mg8v-vrgf
8.8
PraisonAI: Server-Side Request Forgery (SSRF) in SearxNG / search_web tools via attacker-controlled searxng_url parameter
Summary
A Server-Side Request Forgery (SSRF) vulnerability in the SearxNG / search_web search tools allows an attacker to make the server perform requests to arbitrary internal endpoints and read the responses back. The searxng_url argument is passed directly to requests.get() with no validation of scheme, host, or port. Because searxng_url is exposed to the LLM as a tool parameter and search_web / searxng_search are part of the default agent toolset, the vulnerability is reachable through prompt injection in any content an agent ingests (web pages, files, tool output). This enables reading internal services and APIs, internal host/port enumeration, and in cloud environments reachability of the instance metadata endpoint (169.254.169.254) with potential IAM/credential exposure.
Details
The SearxNG search provider performs no validation on the searxng_url argument before issuing the HTTP request.
src/praisonai-agents/praisonaiagents/tools/searxng_tools.py (lines 16–47):
def searxng_search(
query: str,
max_results: int = 5,
searxng_url: Optional[str] = None
) -> List[Dict]:
...
url = searxng_url or "http://localhost:32768/search" # line 42
params = {
'q': query,
'format': 'json',
...
}
response = requests.get(url, params=params, timeout=10) # line 45 — no validation
response.raise_for_status()
The same unvalidated pattern exists in the unified search_web dispatcher:
src/praisonai-agents/praisonaiagents/tools/web_search.py (lines 235–247):
def _search_searxng(query: str, max_results: int = 5, searxng_url: Optional[str] = None):
...
url = searxng_url or os.environ.get("SEARXNG_URL", "http://localhost:32768/search") # line 239
...
response = requests.get(url, params=params, timeout=10) # line 247, no validation
searxng_url is accepted as a parameter on the public search_web() entry point (web_search.py, line 277) and is forwarded through to the request (web_search.py, line 357).
This parameter is attacker-controllable via the LLM:
searxng_urlis a real function parameter (searxng_tools.py:19,web_search.py:277).- The tool-schema generator exposes all function parameters to the model, only
self/*args/**kwargsare skipped (src/praisonai-agents/praisonaiagents/llm/llm.py:5968). search_webis part of the default tool profile (src/praisonai-agents/praisonaiagents/tools/profiles.py:68).
Therefore an agent that ingests attacker-controlled content can be coerced into calling search_web(...) with an internal/attacker-chosen searxng_url, and the response body is parsed and returned into the agent's context.
PoC
The following reproduces the vulnerability against the real searxng_search() source. It spins up a fake internal service simulating an internal API/admin endpoint, then demonstrates that an attacker-controlled searxng_url causes the tool to fetch it and return the response to the caller.
import importlib.util, threading, http.server, json, time
REPO = "/path/to/PraisonAI"
MOD_PATH = f"{REPO}/src/praisonai-agents/praisonaiagents/tools/searxng_tools.py"
# Load the REAL searxng_tools.py standalone (only needs `requests`)
spec = importlib.util.spec_from_file_location("searxng_tools", MOD_PATH)
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
# Fake "internal service" (e.g. internal API / admin panel / metadata)
class H(http.server.BaseHTTPRequestHandler):
def do_GET(self):
body = json.dumps({"results": [
{"title": "INTERNAL_SECRET", "url": self.path,
"content": "SSRF_TEST-12345 path=" + self.path}
]}).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
def log_message(self, *a):
…
- Record
GHSA-4pcv-mg8v-vrgf- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:L - Weakness
- CWE-20, CWE-918
- Updated
- 2026-11-02
OSVPYSEC-2026-3530
8.8
PraisonAI: Server-Side Request Forgery (SSRF) in SearxNG / search_web tools via attacker-controlled searxng_url parameter
Summary
A Server-Side Request Forgery (SSRF) vulnerability in the SearxNG / search_web search tools allows an attacker to make the server perform requests to arbitrary internal endpoints and read the responses back. The searxng_url argument is passed directly to requests.get() with no validation of scheme, host, or port. Because searxng_url is exposed to the LLM as a tool parameter and search_web / searxng_search are part of the default agent toolset, the vulnerability is reachable through prompt injection in any content an agent ingests (web pages, files, tool output). This enables reading internal services and APIs, internal host/port enumeration, and in cloud environments reachability of the instance metadata endpoint (169.254.169.254) with potential IAM/credential exposure.
Details
The SearxNG search provider performs no validation on the searxng_url argument before issuing the HTTP request.
src/praisonai-agents/praisonaiagents/tools/searxng_tools.py (lines 16–47):
def searxng_search(
query: str,
max_results: int = 5,
searxng_url: Optional[str] = None
) -> List[Dict]:
...
url = searxng_url or "http://localhost:32768/search" # line 42
params = {
'q': query,
'format': 'json',
...
}
response = requests.get(url, params=params, timeout=10) # line 45 — no validation
response.raise_for_status()
The same unvalidated pattern exists in the unified search_web dispatcher:
src/praisonai-agents/praisonaiagents/tools/web_search.py (lines 235–247):
def _search_searxng(query: str, max_results: int = 5, searxng_url: Optional[str] = None):
...
url = searxng_url or os.environ.get("SEARXNG_URL", "http://localhost:32768/search") # line 239
...
response = requests.get(url, params=params, timeout=10) # line 247, no validation
searxng_url is accepted as a parameter on the public search_web() entry point (web_search.py, line 277) and is forwarded through to the request (web_search.py, line 357).
This parameter is attacker-controllable via the LLM:
searxng_urlis a real function parameter (searxng_tools.py:19,web_search.py:277).- The tool-schema generator exposes all function parameters to the model, only
self/*args/**kwargsare skipped (src/praisonai-agents/praisonaiagents/llm/llm.py:5968). search_webis part of the default tool profile (src/praisonai-agents/praisonaiagents/tools/profiles.py:68).
Therefore an agent that ingests attacker-controlled content can be coerced into calling search_web(...) with an internal/attacker-chosen searxng_url, and the response body is parsed and returned into the agent's context.
PoC
The following reproduces the vulnerability against the real searxng_search() source. It spins up a fake internal service simulating an internal API/admin endpoint, then demonstrates that an attacker-controlled searxng_url causes the tool to fetch it and return the response to the caller.
import importlib.util, threading, http.server, json, time
REPO = "/path/to/PraisonAI"
MOD_PATH = f"{REPO}/src/praisonai-agents/praisonaiagents/tools/searxng_tools.py"
# Load the REAL searxng_tools.py standalone (only needs `requests`)
spec = importlib.util.spec_from_file_location("searxng_tools", MOD_PATH)
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
# Fake "internal service" (e.g. internal API / admin panel / metadata)
class H(http.server.BaseHTTPRequestHandler):
def do_GET(self):
body = json.dumps({"results": [
{"title": "INTERNAL_SECRET", "url": self.path,
"content": "SSRF_TEST-12345 path=" + self.path}
]}).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
def log_message(self, *a):
…
- Record
PYSEC-2026-3530- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:L - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
praisonaiagentsPyPI |
before 1.6.61 | 1.6.61 |
praisonaiagentsPyPI |
before 1.6.61, plus listed versions 0.0.10.0.100.0.1000.0.1010.0.102 Show 45 moreShow less0.0.1030.0.1040.0.1050.0.1060.0.1070.0.1080.0.1090.0.110.0.1100.0.1110.0.1120.0.1130.0.1140.0.1150.0.1160.0.1170.0.1180.0.1190.0.120.0.1200.0.1210.0.1220.0.1230.0.1240.0.1250.0.1260.0.1270.0.1280.0.1290.0.130.0.1300.0.1310.0.1320.0.1330.0.1340.0.1350.0.1360.0.1370.0.1380.0.1390.0.140.0.1400.0.1410.0.1420.0.143 |
1.6.61 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-57143 is a high vulnerability (CVSS 8.8) in Mervinpraison Praisonaiagents, published June 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.27%, the 20th percentile. Fixed in praisonaiagents 1.6.61.
References
github.com/MervinPraison/PraisonAI/security/advisories/GHSA-4pcv-mg8v-vrgf
github.com/MervinPraison/PraisonAI/commit/2a855c470077c7d2e2479a575f7ef7f548d51c33
github.com/MervinPraison/PraisonAI/releases/tag/v4.6.62
github.com/advisories/GHSA-4pcv-mg8v-vrgf
github.com/CVEProject/cvelistV5/tree/main/cves/2026/57xxx/CVE-2026-57143.json
nvd.nist.gov/vuln/detail/CVE-2026-57143
github.com/MervinPraison/PraisonAI
pypi.org/project/praisonaiagents
Left out here: 538 versions and the rest of 3 source descriptions. The JSON record has them.