CVE-2026-27826
Python vulnerability analysis and mitigation

Overview

CVE-2026-27826 is a Server-Side Request Forgery (SSRF) vulnerability in the mcp-atlassian Python package (pip), a Model Context Protocol server bridging AI agents with Atlassian Jira and Confluence. An unauthenticated attacker who can reach the mcp-atlassian HTTP endpoint can force the server to make outbound HTTP requests to an arbitrary attacker-controlled URL by supplying two custom HTTP headers (X-Atlassian-Jira-Url and X-Atlassian-Jira-Personal-Token) without an Authorization header. All versions prior to 0.17.0 are affected. The vulnerability was first published by the maintainer on February 24, 2026, and added to the GitHub Advisory Database on March 10, 2026. It carries a CVSS v3.1 base score of 8.2 (High) (Github Advisory, GitHub Security Advisory).

Technical details

The root cause is CWE-918 (Server-Side Request Forgery): the HTTP middleware in src/mcp_atlassian/servers/main.py (lines 436–448) extracts the X-Atlassian-Jira-Url header from incoming requests and stores it in request state with no validation — no private IP blocklist, no URL scheme allowlist, and no comparison against the server-configured JIRA_URL environment variable. The dependency provider (src/mcp_atlassian/servers/dependencies.py, lines 189–217) then uses this attacker-controlled value directly as the url= parameter when constructing a JiraConfig and JiraFetcher, and the first method call (get_current_user_account_id()) immediately issues a GET {header_url}/rest/api/2/myself — an outbound SSRF request to the attacker's server. Because the flaw lives in the middleware and dependency injection layer rather than any MCP tool handler, it is invisible to tool-level code analysis. Four conditions must all hold: the server must run with --transport streamable-http or --transport sse; the request must include X-Atlassian-Jira-Url (any non-empty value); the request must include X-Atlassian-Jira-Personal-Token (any non-empty value); and the request must not include an Authorization header. An identical path exists for Confluence via X-Atlassian-Confluence-Url + X-Atlassian-Confluence-Personal-Token (Github Advisory).

Impact

In cloud deployments, a network-reachable unauthenticated attacker can steal the server's IAM role credentials by directing requests to the instance metadata endpoint (169.254.169.254), potentially gaining full access to all cloud resources permitted by that role. In any HTTP deployment, the server acts as an SSRF proxy enabling reconnaissance of internal services (databases, internal APIs, microservices) not directly reachable from outside the network. Additionally, once the attacker-controlled fetcher is cached in request.state, all Jira or Confluence tool responses for that session originate from the attacker's server, creating a prompt injection channel: the attacker can return crafted API responses containing LLM instructions, injecting those instructions into the AI agent's context as if they were legitimate Atlassian data (Github Advisory, GitHub Security Advisory).

Exploitability

A public proof-of-concept exploit is included in the official security advisory and requires no authentication — only network access to the mcp-atlassian HTTP endpoint (Github Advisory). The default HOST=0.0.0.0 binding exposes the endpoint to any host on the same network, and to the internet when deployed on a cloud instance. As of the time of reporting, there is no confirmed evidence of in-the-wild exploitation, and no threat actor attribution has been made. The EPSS score is approximately 0.088% (0.037% per Feedly), placing it in the 25th percentile for exploitation likelihood within 30 days. The vulnerability is not currently listed in the CISA KEV catalog (Github Advisory).

Exploitation steps

  1. Reconnaissance: Identify internet-facing or network-accessible mcp-atlassian instances running with --transport streamable-http or --transport sse (default port 8000). Shodan or Censys can be used to locate exposed endpoints.
  2. Set up a listener: Start an HTTP listener on an attacker-controlled server to capture inbound SSRF requests (e.g., a simple Python HTTP server on port 8888 that responds to GET /rest/api/2/myself with a JSON body containing {"accountId": "ssrf-confirmed"}).
  3. Initialize MCP session: Send a JSON-RPC initialize request to the /mcp endpoint with the custom headers X-Atlassian-Jira-Url: http://<attacker-ip>:8888 and X-Atlassian-Jira-Personal-Token: any-value, deliberately omitting the Authorization header. Capture the mcp-session-id from the response.
  4. Trigger the SSRF: Send a second JSON-RPC tools/call request (e.g., calling jira_get_issue) with the same malicious headers and the captured session ID. This triggers get_jira_fetcher(), which calls get_current_user_account_id(), issuing GET http://<attacker-ip>:8888/rest/api/2/myself from the MCP server process.
  5. Exploit cloud metadata (optional): Replace the attacker URL with http://169.254.169.254 to retrieve IAM role credentials from the instance metadata service in cloud environments.
  6. Inject LLM content (optional): Return crafted Jira API responses from the attacker's listener containing LLM prompt injection payloads; these are injected into the AI agent's context for all subsequent tool calls in the session (Github Advisory, GitHub Security Advisory).

Indicators of compromise

  • Network: Unexpected outbound HTTP GET requests from the mcp-atlassian server process to external or internal IP addresses (especially 169.254.169.254 or RFC 1918 ranges) on paths matching /rest/api/2/myself or /rest/api/user/current.
  • Network: Inbound HTTP requests to the mcp-atlassian endpoint (default port 8000) containing X-Atlassian-Jira-Url or X-Atlassian-Confluence-Url headers pointing to non-Atlassian domains or IP addresses, without an Authorization header.
  • Logs: mcp-atlassian application logs showing JiraFetcher or ConfluenceFetcher initialization with URLs not matching the configured JIRA_URL or CONFLUENCE_URL environment variables.
  • Logs: HTTP access logs recording POST /mcp requests with X-Atlassian-Jira-Url or X-Atlassian-Confluence-Url headers set to private IP ranges, localhost, 169.254.169.254, or metadata.google.internal.
  • Process: The mcp-atlassian Python process making outbound TCP connections to unexpected hosts, observable via netstat, ss, or EDR network telemetry.

Mitigation and workarounds

The primary remediation is to upgrade mcp-atlassian to version 0.17.0 or later, which introduces a validate_url_for_ssrf() utility that checks URL scheme, blocks private/reserved IPs, resolves DNS to detect rebinding attacks, and supports domain allowlisting via the MCP_ALLOWED_URL_DOMAINS environment variable. The patch also adds a redirect-based SSRF hook on header-based fetcher sessions to block 302 redirects to internal targets (Patch Commit). If immediate patching is not possible: restrict network access to the mcp-atlassian HTTP endpoint to trusted sources only; block outbound access to 169.254.169.254 at the security group or firewall level in cloud deployments; and implement network segmentation to limit outbound HTTP from the mcp-atlassian process to only trusted Atlassian hosts. Setting MCP_ALLOWED_URL_DOMAINS=atlassian.net,<your-domain> after upgrading provides an additional defense-in-depth layer (Github Advisory).

Community reactions

The vulnerability was reported by researchers yotampe-pluto and gil-maman-p and disclosed via the GitHub Security Advisory program (Github Advisory). Pluto Security published a technical blog post covering this and related MCP vulnerabilities under the "MCPwnfluence" research campaign (Pluto Security Blog). Arctic Wolf covered the vulnerability in their blog, noting it as part of a broader pattern of critical unauthenticated vulnerabilities in MCP-based Atlassian integrations (Arctic Wolf). Bishop Fox also published research on SSRF and token passthrough issues in MCP servers, contextualizing this vulnerability within the emerging MCP security landscape (Bishop Fox). Community discussion on Mastodon and Bluesky highlighted concerns about the default HOST=0.0.0.0 binding and the risk of LLM prompt injection via the SSRF channel.

Additional resources


SourceThis report was generated using AI

Related Python vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

CVE-2026-84452HIGH8.6
  • Python logoPython
  • winml-cli
NoYesSep 02, 2026
CVE-2026-84381HIGH8.1
  • Python logoPython
  • httpcore2
NoYesSep 02, 2026
CVE-2026-84382HIGH7.5
  • Python logoPython
  • httpx2
NoYesSep 02, 2026
CVE-2026-84380MEDIUM5.6
  • Python logoPython
  • python-httpx2
NoYesSep 02, 2026
CVE-2026-53720MEDIUM5.1
  • Python logoPython
  • pymonocypher
NoYesSep 03, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management