CVE-2026-54688: mcp-searxng: SSRF guard exists but ships off by default

GHSA-q87f-qc2r-2gw4 MEDIUM
Published August 19, 2026
CISO Take

mcp-searxng's web_url_read tool fetches attacker-influenced URLs server-side, and the SSRF filter that blocks loopback, private, and cloud-metadata addresses only activates when the operator sets MCP_HTTP_HARDEN=true — a flag that is off out of the box, so a stock deployment has no internal-address filtering at all. Because the URL is typically supplied or steered by the LLM itself, an indirect prompt injection (a poisoned search result or fetched page) can redirect the agent to call this tool against http://169.254.169.254 or an internal admin service, and the response comes straight back into the model's context. There is no CISA KEV listing, no EPSS score, and no public exploit or Nuclei template yet — this is CVSS 6.5/medium with confidentiality-only impact, not a mass-exploited bug — but the exploit path is trivial to trigger once an attacker controls any content the agent retrieves. Any team running mcp-searxng as an MCP server for an LLM agent should upgrade to 1.2.1, or at minimum set MCP_HTTP_HARDEN=true today, and add network-level egress blocks on 169.254.169.254/16 and RFC1918 ranges from the host running the MCP server as defense in depth. This is a useful signal for any MCP tool audit generally: check whether security guards default to on or off, because 'off by default' quietly reintroduces SSRF into agent stacks that assume the tool is safe.

Sources: NVD GitHub Advisory CISA KEV ATLAS

What is the risk?

CVSS 6.5 (AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N) — network-reachable, low complexity, no privileges required, but needs some form of user/agent interaction to trigger the fetch, and impact is confidentiality-only (no integrity or availability loss). No CISA KEV listing, no EPSS score published, and no public exploit code or Nuclei template exist, so opportunistic mass exploitation is unlikely today. The real-world risk is elevated by two factors independent of the CVSS score: the unsafe behavior (no SSRF filtering) is the *default* configuration, and the trigger vector (an LLM-controlled URL) is naturally exposed to indirect prompt injection in any agentic deployment. Overall: moderate risk, high ease of triggering in agent contexts where the tool is exposed to untrusted content.

How does the attack unfold?

Indirect prompt injection
Attacker plants malicious instructions in content likely to be retrieved by the agent (e.g., a search result or fetched page) that steer the LLM into targeting an internal or metadata URL.
AML.T0051.001
Tool invocation
The agent invokes web_url_read with the attacker-chosen URL; because MCP_HTTP_HARDEN is off by default, no SSRF filtering is applied.
AML.T0053
Internal fetch
The server-side fetch reaches the internal service or cloud metadata endpoint (e.g., 169.254.169.254) and converts the response to markdown.
AML.T0075
Context exfiltration
The fetched internal/metadata content is returned into the model's context, where it can be surfaced or forwarded to the attacker.
AML.T0086

What systems are affected?

Package Ecosystem Vulnerable Range Patched
mcp-searxng npm < 1.2.1 1.2.1

Do you use mcp-searxng? You're affected.

How severe is it?

CVSS 3.1
6.5 / 10
EPSS
N/A
Exploitation Status
No known exploitation
Sophistication
Moderate

What is the attack surface?

AV AC PR UI S C I A
AV Network
AC Low
PR None
UI Required
S Unchanged
C High
I None
A None

What should I do?

1 step
  1. Upgrade to mcp-searxng >= 1.2.1, which patches this issue. If upgrading isn't immediately possible, explicitly set MCP_HTTP_HARDEN=true in the server environment to enable assertUrlAllowed filtering (note this is a literal-hostname check with no DNS-rebinding or per-redirect re-validation, so treat it as a mitigation, not a complete fix). Add network-level egress controls on the host/container running the MCP server: block outbound requests to 169.254.169.254/16 (cloud metadata), 127.0.0.0/8, and RFC1918 private ranges unless explicitly required. Where supported, enforce IMDSv2 on cloud instances so metadata SSRF alone can't yield credentials. Detection: log and alert on web_url_read calls targeting private/link-local/loopback IPs, and monitor for anomalous outbound connections from the MCP server process.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

EU AI Act
Article 15 - Accuracy, robustness and cybersecurity
NIST AI RMF
MEASURE 2.7 - AI system security and resilience are evaluated and documented
OWASP LLM Top 10
LLM02 - Sensitive Information Disclosure LLM06 - Excessive Agency

Frequently Asked Questions

What is CVE-2026-54688?

mcp-searxng's web_url_read tool fetches attacker-influenced URLs server-side, and the SSRF filter that blocks loopback, private, and cloud-metadata addresses only activates when the operator sets MCP_HTTP_HARDEN=true — a flag that is off out of the box, so a stock deployment has no internal-address filtering at all. Because the URL is typically supplied or steered by the LLM itself, an indirect prompt injection (a poisoned search result or fetched page) can redirect the agent to call this tool against http://169.254.169.254 or an internal admin service, and the response comes straight back into the model's context. There is no CISA KEV listing, no EPSS score, and no public exploit or Nuclei template yet — this is CVSS 6.5/medium with confidentiality-only impact, not a mass-exploited bug — but the exploit path is trivial to trigger once an attacker controls any content the agent retrieves. Any team running mcp-searxng as an MCP server for an LLM agent should upgrade to 1.2.1, or at minimum set MCP_HTTP_HARDEN=true today, and add network-level egress blocks on 169.254.169.254/16 and RFC1918 ranges from the host running the MCP server as defense in depth. This is a useful signal for any MCP tool audit generally: check whether security guards default to on or off, because 'off by default' quietly reintroduces SSRF into agent stacks that assume the tool is safe.

Is CVE-2026-54688 actively exploited?

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

How to fix CVE-2026-54688?

Upgrade to mcp-searxng >= 1.2.1, which patches this issue. If upgrading isn't immediately possible, explicitly set MCP_HTTP_HARDEN=true in the server environment to enable assertUrlAllowed filtering (note this is a literal-hostname check with no DNS-rebinding or per-redirect re-validation, so treat it as a mitigation, not a complete fix). Add network-level egress controls on the host/container running the MCP server: block outbound requests to 169.254.169.254/16 (cloud metadata), 127.0.0.0/8, and RFC1918 private ranges unless explicitly required. Where supported, enforce IMDSv2 on cloud instances so metadata SSRF alone can't yield credentials. Detection: log and alert on web_url_read calls targeting private/link-local/loopback IPs, and monitor for anomalous outbound connections from the MCP server process.

What systems are affected by CVE-2026-54688?

This vulnerability affects the following AI/ML architecture patterns: agent frameworks, MCP tool servers, cloud-hosted agent deployments, web browsing / retrieval tools.

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

CVE-2026-54688 has a CVSS v3.1 base score of 6.5 (MEDIUM).

What is the AI security impact?

Affected AI Architectures

agent frameworksMCP tool serverscloud-hosted agent deploymentsweb browsing / retrieval tools

MITRE ATLAS Techniques

AML.T0051.001 Indirect
AML.T0053 AI Agent Tool Invocation
AML.T0075 Cloud Service Discovery
AML.T0086 Exfiltration via AI Agent Tool Invocation

Compliance Controls Affected

EU AI Act: Article 15
NIST AI RMF: MEASURE 2.7
OWASP LLM Top 10: LLM02, LLM06

What are the technical details?

Original Advisory

Ref: https://github.com/ihor-sokoliuk/mcp-searxng/issues/87#issuecomment-4645453694 ### Summary The web_url_read tool fetches a caller-supplied URL server-side and converts it to markdown. An SSRF guard (assertUrlAllowed, which blocks private/loopback/metadata addresses) exists but runs only when MCP_HTTP_HARDEN=true, which is off by default. So in the default configuration there is no internal-address filtering, and an attacker who can influence the URL can make the server fetch internal services and cloud metadata and return their content. Confirmed on 1.1.0 (default config): web_url_read fetched a local internal sentinel and returned its content. ### Details dist/index.js (around lines 90-101): web_url_read calls fetchAndConvertToMarkdown on the caller URL. dist/url-reader.js (around lines 44-52): assertUrlAllowed performs the private-IP/loopback check, but only when the hardening flag is set; dist/http-security.js (around line 11) defaults MCP_HTTP_HARDEN to off. With the default config the check is skipped entirely. Even when enabled, the check is literal-hostname based with no DNS-rebinding or redirect re-check (the fetch follows redirects). file:// is rejected, so this is HTTP/HTTPS SSRF. ### PoC Re-validated on mcp-searxng 1.1.0 over MCP stdio in the default configuration (MCP_HTTP_HARDEN not set): ``` tools: searxng_web_search, web_url_read web_url_read({ url: "http://127.0.0.1:<port>/internal" }) -> server fetched the internal sentinel; SSRF: CONFIRMED ``` The server fetched the loopback sentinel and returned its content. With MCP_HTTP_HARDEN=true the same request is blocked (policy error), confirming the guard exists but ships off. The same reaches http://169.254.169.254/... on cloud hosts. ### Impact In the default configuration an attacker who can influence the URL (LLM-produced and steerable via prompt injection) can make the server fetch internal-only HTTP services and the cloud metadata endpoint, returning their contents into the model context for exfiltration. The protection that would prevent it is not enabled by default. ### Remediation Enable the internal-address filtering by default (fail safe): make assertUrlAllowed run unconditionally and require an explicit opt-out only for trusted environments. Strengthen the check to resolve the host and reject loopback, link-local/metadata (169.254.0.0/16), 0.0.0.0/8, and private ranges, and re-validate on every redirect hop (or pin to the validated IP).

Exploitation Scenario

An attacker plants content designed for indirect prompt injection — for example a search-result snippet or a webpage the agent is likely to retrieve via searxng_web_search — containing instructions that steer the LLM into calling web_url_read against http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name> or an internal-only admin endpoint like http://127.0.0.1:8080/admin. Because MCP_HTTP_HARDEN is off by default, the server fetches the URL with no SSRF filtering, converts the response to markdown, and returns it directly into the model's context window. The attacker then uses a second injected instruction (or simply observes the conversation if they have access) to get the model to echo or forward that content, exfiltrating cloud credentials or internal service data without ever needing direct network access to the victim's infrastructure.

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.

CVSS Vector

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N

Timeline

Published
August 19, 2026
Last Modified
August 19, 2026
First Seen
August 19, 2026

Related Vulnerabilities