CVE-2026-77265: MCP Atlassian: SSRF via DNS Rebinding in Header-Based Authentication Flow
mcp-atlassian before 0.22.0 validates the Jira URL header by resolving its DNS name, then connects later with a second resolution. A DNS rebinding host can pass the check with a public IP and then resolve to 169.254.169.254 or loopback. Upgrade to 0.22.0.
Published Sep 22, 2026 · Analysis Oct 22, 2026
What an attacker can do
This is a time-of-check to time-of-use gap. In servers/main.py (around lines 524 to 531), validate_url_for_ssrf() takes the X-Atlassian-Jira-Url value, resolves the hostname and checks the address is globally routable. Later, in servers/dependencies.py, a JiraFetcher built from that URL makes its own HTTP requests, with a fresh DNS lookup. The redirect hook (attach_ssrf_hook=True) only checks Location headers on redirects, not the first connection.
The attacker runs a hostname with a one-second TTL that answers 1.2.3.4 first, then 169.254.169.254. The reporter suggests using a rebinding service such as rbndr.us, with a host like rebind-169.254.169.254-1.2.3.4.rbndr.us and any value for X-Atlassian-Jira-Personal-Token. Each attempt succeeds roughly half the time, hence the high attack complexity in the CVSS score.
The attacker gets requests from the MCP host to cloud metadata, which can yield IAM credentials, or to internal services for scanning. The path is limited to the header_pat branch, so it matters for deployments that accept header-based PAT authentication over HTTP.
Who is affected
mcp-atlassian below 0.22.0 with an HTTP transport that accepts per-request X-Atlassian-Jira-Url and personal token headers. Deployments with a fixed server-side Atlassian URL do not take attacker-chosen hosts.
pip show mcp-atlassianmcp-atlassian
- Ecosystem
- PyPI
- Affected
- < 0.22.0
- Fixed in
- 0.22.0
- Check
pip show mcp-atlassian
How to fix it
Upgrade to 0.22.0:
pip install --upgrade mcp-atlassian==0.22.0The reporter's recommended design is to resolve the hostname once during validation and connect to that pinned IP, with the original name in the Host header, which removes the gap. If you cannot upgrade, do not expose the HTTP transport to untrusted clients, enforce IMDSv2 on cloud hosts, and block egress to link-local and internal ranges at the network layer.
How to tell if you were hit
Look for requests to the HTTP endpoint with X-Atlassian-Jira-Url values on rebinding services or unfamiliar domains with very low TTLs. DNS logs showing the same name resolving to a public and then a private or link-local address within seconds are the key signal. Check egress logs from the MCP host for connections to 169.254.169.254 or RFC 1918 ranges.
Original advisory
From the GitHub Advisory Database (CC BY 4.0).
Summary
The SSRF protection for header-based authentication uses a validate-then-use pattern vulnerable to DNS rebinding. validate_url_for_ssrf resolves the hostname via DNS and checks that the resolved IP is globally routable. However, the actual HTTP request happens later, during which the DNS record may have changed to point to an internal IP (127.0.0.1, 169.254.169.254, etc.). The SSRF redirect hook only validates redirect targets, not the initial connection.
Details
The vulnerability spans main.py (validation) and dependencies.py (use).
Step 1 -- URL validation at middleware time:
In src/mcp_atlassian/servers/main.py:524-531, the URL from X-Atlassian-Jira-Url is validated:
if jira_url_str: ssrf_error = validate_url_for_ssrf(jira_url_str) if ssrf_error:
blocked
validate_url_for_ssrf (src/mcp_atlassian/utils/urls.py:113-116) resolves DNS and checks is_global:
dns_error = _check_dns_resolution(hostname) if dns_error: return dns_error
Step 2 -- HTTP request happens later with a separate DNS resolution:
In src/mcp_atlassian/servers/dependencies.py:544-562, a JiraFetcher is created with the attacker URL and makes HTTP requests to it. The SSRF redirect hook (attach_ssrf_hook=True) is applied but only checks redirect Location headers, not the initial connection target.
DNS rebinding timeline:
- Attacker sets up rebind.attacker.com with short TTL (1 second)
- First DNS resolution (validate_url_for_ssrf): returns 1.2.3.4 (public) -- passes
- TTL expires
- Second DNS resolution (requests.get): returns 169.254.169.254 (metadata)
- HTTP request reaches internal IP, bypassing the SSRF check
PoC
Use a DNS rebinding service like rbndr.us. Send a request with X-Atlassian-Jira-Url set to a rebinding hostname (e.g., rebind-169.254.169.254-1.2.3.4.rbndr.us) and X-Atlassian-Jira-Personal-Token set to any value. With approximately 50% probability per attempt, the request reaches the internal metadata service.
Impact
- Cloud metadata access: Steal IAM credentials via 169.254.169.254
- Internal network scanning: Proxy requests to internal services
- AC:H: DNS rebinding is probabilistic and requires multiple attempts
- Limited to header_pat branch: Only affects deployments accepting header-based PAT authentication
Recommended Fix
Pin DNS resolution: resolve the hostname once during validation, then connect to the resolved IP directly (with the original hostname in the Host header). This eliminates the TOCTOU gap between validation and use.
Credited to offset.
Questions
- Why does the SSRF check not stop DNS rebinding?
It resolves the name once for validation, and the HTTP client resolves it again when connecting. The record can change between the two lookups.
- How reliable is the attack?
The reporter estimates about 50% per attempt with a rebinding service, so it needs repeated tries. That is why attack complexity is rated high.
- Which authentication mode is exposed?
Only the header PAT branch, where the client supplies the Jira URL and token in request headers.
- Is it exploited in the wild?
No source says so. It is not in CISA's KEV catalog, and the advisory describes only a reproduction using a public rebinding service.
References
How this page is made: the data panel comes from the GitHub Advisory Database, CISA’s KEV catalog, the NVD and FIRST EPSS, and updates twice a day. The analysis is written by an AI model from the sources listed above and checked by automated rules before it is published. Check versions against the vendor's advisory before you act. Methodology
More Other MCP servers and tools vulnerabilities
All Other MCP servers and tools entriesCVE-2026-77361
obsidian-tc : Symlink read-ACL scope bypass via lexical path checks
medium4.7Oct 23, 2026CVE-2026-114126
Storybook dev server vulnerable to code injection from the local network
high8.7Oct 22, 2026CVE-2026-113731
djust: Arbitrary absolute-path file read in the find_handlers_for_template MCP tool
low3.3Oct 21, 2026CVE-2026-114125
Storybook: Missing origin validation in Storybook preview allows code injection from malicious websites
critical9.4Oct 21, 2026CVE-2026-111770
MCP TypeScript server SDK: Shared transport or server instances delivered one HTTP client's messages to another
high7.7Oct 20, 2026GHSA-953h-535j-jg2v
agent-router: MCP session resume does not verify the embedded anti-hijacking subject; default Helm seed makes session IDs forgeable
medium6.8Oct 19, 2026
