GHSA-49xv-9743-pw8w: SSRF
Summary
The SSRF protection for header-based authentication uses a validate-then-use pattern vulnerable to DNS rebinding. validateurlforssrf 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/mcpatlassian/servers/main.py:524-531, the URL from X-Atlassian-Jira-Url is validated:
if jiraurlstr: ssrferror = validateurlforssrf(jiraurlstr) if ssrferror: # blocked
validateurlforssrf (src/mcpatlassian/utils/urls.py:113-116) resolves DNS and checks isglobal:
dnserror = checkdnsresolution(hostname) if dnserror: return dnserror
Step 2 -- HTTP request happens later with a separate DNS resolution:
In src/mcpatlassian/servers/dependencies.py:544-562, a JiraFetcher is created with the attacker URL and makes HTTP requests to it. The SSRF redirect hook (attachssrfhook=True) is applied but only checks redirect Location headers, not the initial connection target.
DNS rebinding timeline:
1. Attacker sets up rebind.attacker.com with short TTL (1 second) 2. First DNS resolution (validateurlforssrf): returns 1.2.3.4 (public) -- passes 3. TTL expires 4. Second DNS resolution (requests.get): returns 169.254.169.254 (metadata) 5. 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 headerpat 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.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
pip/mcp-atlassianto a version that resolves this vulnerability.Fixed in 0.22.0 - Compensating control
Pin DNS resolution by resolving the hostname once during SSRF validation, then connect directly to the resolved IP while preserving the original hostname in the Host header, eliminating the validation/use DNS rebinding gap.
Event History
Frequently Asked Questions
Which deployments are exposed to this issue?
Deployments that use header-based authentication and accept the X-Atlassian-Jira-Url value are exposed to the validate-then-use DNS resolution gap described here.
What does an attacker need to exploit it?
An attacker needs to supply a hostname in the Jira URL header and control its DNS responses so that the hostname resolves to a globally routable address during validation, then to an internal address when the later HTTP request is made.
Does the redirect protection stop this attack?
No. The redirect hook validates redirect targets, but it does not validate the destination of the initial HTTP connection, which is where DNS rebinding can take effect.