Every CVE Search/ Get API key

CVE-2026-57143

PraisonAI: Server-Side Request Forgery (SSRF) in SearxNG / search_web tools via attacker-controlled searxng_url parameter

8.8 HighFix available

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

0.27%Up 0.1 points since Oct 13, 2026
90%50%10%1%

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 HighCVSS: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 HighCVSS: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_url is 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/**kwargs are skipped (src/praisonai-agents/praisonaiagents/llm/llm.py:5968).
  • search_web is 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 HighCVSS: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 HighCVSS: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 HighCVSS: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_url is 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/**kwargs are skipped (src/praisonai-agents/praisonaiagents/llm/llm.py:5968).
  • search_web is 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 HighCVSS: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_url is 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/**kwargs are skipped (src/praisonai-agents/praisonaiagents/llm/llm.py:5968).
  • search_web is 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 HighCVSS: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

Affected packages
PackageAffectedFixed
praisonaiagents
PyPI
before 1.6.61
1.6.61
praisonaiagents
PyPI
before 1.6.61, plus listed versions
0.0.10.0.100.0.1000.0.1010.0.102
Show 45 moreShow less
0.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

History
RecordedChangedSources
first indexedCVE 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

This page doesn't list everything

Left out here: 538 versions and the rest of 3 source descriptions. The JSON record has them.

MoveEnter Open